认识Node.js

Sy_ Lv6

1.介绍

Node.js 是一门服务器编程语言,它也遵循了 ECMAScript 语法规范,在此规范的基础上加入了 Node.js API,包含处理 http 请求、处理文件、socket 编程等。Node.js API 和 ECMAScript 两者结合组成了 Node.js,完成 Server 端的任何操作,为客户端浏览器进行服务。

Node.js 是一门服务器编程语言。它发布于 2009 年 5 月,由 Ryan Dahl 开发,也是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使用了一个事件驱动、非阻塞式 I/O 模型,让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与 PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。

Node.js 有如下特点和优势:

  • 它是一个 JavaScript 运行环境
  • 依赖于 Chrome V8 引擎进行代码解析
  • 事件驱动(event-driven)
  • 非阻塞 I/O(non-blocking I/O)
  • 轻量、可伸缩,适于实时数据交互应用
  • 单进程,单线程

学到这里有的同学可能有些疑惑,这么多特点都是什么意思呢?Node.js 相对于其他服务器语言,例如 Ruby、Java 又有什么区别和优势呢?别着急,马上就会提到。

传统的服务器开发语言(例如 java)是多线程的,例如我们在淘宝商城购物,如果只有一个顾客发送请求,那显然是没问题的。但是当有成百上千万的用户同时访问的时候,我们肯定不希望别人买完以后才能轮到自己购买,这显然要等待很长时间。但是如果 CPU 只有一个核心的时候或者 CPU 只有一个线程的时候,确实要等待别人购买完毕以后才能购买。这就像在饭馆吃饭,如果只有一个厨师的话,同一时间只能给一个顾客做菜,这样必须要等待这一个厨师为别人做完菜以后才能为自己做菜。

为了解决这个问题,我们可以多增加几个厨师来同时为这些顾客做菜,这就是 java 语言的处理方式:使用多线程并发执行,但是这种方式势必会增加聘请厨师的成本和消耗更大的厨房空间,这无疑是一个资源的浪费,而且这种多线程模型,CPU(厨师) 在为客户服务的时候不能做其他的事,例如使用 I/O 读取文件的时候,只能等待文件系统读取文件完毕以后,才能继续做其他事。

为了解决上述问题 Node.js 应运而生。Node.js 是单线程模型、非阻塞 I/O、采用事件循环机制的原理进行处理。如下图:

::: center
20250308225452
:::

非阻塞 I/O 的意思就是,文件系统在进行 I/O 操作的时候,Node.js 这个线程还可以做其他的事,当文件系统读取文件完毕时,通过事件的回调函数告诉 Node.js 线程,然后 Node.js 把读取的内容响应给用户。

Node.js 中的 I/O 操作可以理解成生活中的一个幕后工作者,就像在餐馆点餐这个场景中,饭馆可以直接去把点餐的任务派发给外部擅长做菜、煮饭、酿酒的厂家,这些厂家都是非常擅长这些工作的,Node 中也有各种擅长做某件事的模块。这样当这些幕后的厂家完成这些做菜、饭、酒的事件以后,把做完的饭菜酒等食品交给厨师,然后由厨师统一的让服务员把饭菜交给顾客。这样就大大提高了整个餐馆的运营速度。

::: center
20250308225621
:::

如果还不明白的话,我们再看下一个例子,Node.js 就像国王,国王每天都在写任务清单,然后派发给大臣。大臣把任务清单交给下面的官员去做,而这个时候国王还是可以继续写任务清单的。当官员完成任务这个事件后,统一的任务结果交给国王(以事件回调函数的形式通知 Node.js)。此事件反复进行,这便是事件循环。所以说除了国王(Node.js)线程以外,每件事都是并行发生的,这便是 Node.js 单线程和事件循环能同时处理多个请求的原理。

2.在win和mac上使用Node.js

Node 官网下载。

::: center
20250308230006
:::

官网会根据系统自动推荐对应系统的下载版本。
推荐下载 LTS 长期支持版。

傻瓜式安装完成后,通过下面的指令检查是否成功:

1
2
node - v; // 查看 node 版本
npm - v; // 查看 npm 版本

如果有版本信息则为成功。

需要说明的是:笔记是基于 node v14+ 的版本,低于该版本,请自行更新至对应版本中。

安装 Node 的时候会同时帮我们安装 npm (Node Package Manager)Node 包管理工具,用于下载依赖的 node 包。

3.Linux 版本的 Node 下载和安装

一般我们的Node程序都是部署到Linux服务器上的,所以需要Linux的版本。

一样进入Node的官网,点击下方的Downloads

::: center
20250308230857
:::

在弹出的界面中显示的 Node 的全部下载版本,这里我们下载 Linux Binaries x64 版。见下图:

::: center
20250308230928
:::

也可以直接用下面的指令下载蓝桥杯云服务器提供的 Linux Node 安装文件。

1
wget https://labfile.oss.aliyuncs.com/courses/4380/node-v14.17.3-linux-x64.tar.xz

然后使用解压命令:

1
tar -xvf node-v14.17.3-linux-x64.tar.xz

解压完毕后就可以把 node-v14.17.3-linux-x64.tar.xz 文件删除了。

用命令对解压后的 node 文件夹进行改名:

1
mv node-v14.17.3-linux-x64 node

改名后文件夹📂名为node

这时还没有安装完成,如果想要安装最新版本,需要使用如下命令:

1
2
cd node/bin
./node -v

注意这里是使用./node 来使用当前路径下的 node 命令。

发现版本为 14.17.3 ,说明我们已经使用了自己下载的最新版本的 Node,但是每次都需要进入到 Node 安装路径的 bin 路径下才能使用 Node 命令,比较麻烦。如何能让我们在系统的任何地方都能使用最新安装的 Node 呢?这里需要修改我们的环境变量 PATH,node/bin 这个路径添加到 PATH 下。

接下来介绍怎么在 Linux 环境修改环境变量 PATH

为了在全局使用最新安装的 Node,我们还需要修改一个配置文件 ~/.zshrc

PATH 作用:当我们在控制台输入命令的时候(例如 node -v),系统是去 PATH 环境变量下配置的路径中寻找这个命令是否存在,查找的路径顺序为从左到右依次查找(linux 路径分隔符为 :)。如果发现对应的 PATH 路径下有 node 命令就会使用,否则就会报错。

首先使用下列命令查看我们的环境变量:

1
env | grep node

VScode终端的效果如下:

::: center
20250308231539
:::

发现 PATH 中有 /usr/sbin/nodejs/bin,这个路径就是我们(Lanqiao 云课)实验环境默认安装的 14.15.1 的 Node 安装路径,如果想让我们新安装的 Node 优先执行的话,只需要把新版本 Node 的安装路径下的 bin 路径放到 /usr/sbin/nodejs/bin 路径前即可。

使用下列命令修改 ~/.zshrc

1
vim ~/.zshrc

使用 i 进入插入模式,在文件最后加入如下内容:

1
export PATH=/home/project/node/bin:$PATH

然后输入 ESC 回到普通模式,输入 : 进入命令模式,然后 输入 wq 进行保存。修改完成的文件并不会马上生效,需要使用如下命令让刚才配置的环境变量生效。

1
source ~/.zshrc

最后输入 node -v 重新查看 node 版本就会发现全局的 Node 已经生效。

Mac 用户可能已经发现了,配置环境变量的过程基本和 Mac 上一致,因为 Mac 就是 Linux 系统。

  • 标题: 认识Node.js
  • 作者: Sy_
  • 创建于 : 2025-06-15 00:51:35
  • 更新于 : 2025-06-15 00:51:35
  • 链接: https://shenying.online//demo/j0laz2l5/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论