关于 Node.js

Node.js 是一个开源、跨平台的 JavaScript 运行时。它把 Chrome 所用的 V8 引擎拿到浏览器外执行,用事件循环和非阻塞 I/O 跑服务器、命令行和桌面应用。前后端可以共用同一种语言,但运行环境和能调用的 API 并不相同。

Node.js 有以下特性:

  • 单进程跑 JavaScript 主线程,不为每个请求新建一条操作系统线程。CPU 密集或要并行时,可以用 worker_threads、子进程或集群,主模型仍是事件循环。
  • 提供了一组异步的 I/O 原语,避免 JavaScript 代码把事件循环卡住。当 Node.js 执行 I/O(网络、数据库、文件系统)时,会在响应回来后再恢复回调或 Promise,而不是阻塞线程空转等待。
  • 使用 JavaScript,可以编写除客户端代码之外的服务器端代码。
  • 跟进较新的 ECMAScript 标准(具体语法以当前 Node 大版本绑定的 V8 为准)。

一点历史

  • 2009:Node.js 诞生(Ryan Dahl)、第一版的 npm 被创建。
  • 2010:Express 诞生、Socket.io 诞生。
  • 2011:npm 发布 1.0 版本、较大的公司(LinkedIn、Uber 等)开始采用 Node.js、hapi 诞生。
  • 2012:普及速度非常快。
  • 2013:第一个使用 Node.js 的大型博客平台 Ghost、Koa 诞生。
  • 2014:大分支:io.js 是 Node.js 的一个主要分支,目的是引入 ES6 支持并加快推进速度。
  • 2015:Node.js 基金会诞生、io.js 被合并回 Node.js、npm 引入私有模块、Node.js 4 发布(1、2、3 被 io.js 占用,正式线从 4 起跳)。
  • 2016:left-pad 事件、Yarn 诞生、Node.js 6。
  • 2017:npm 更加注重安全性、Node.js 8、HTTP/2、V8 在其测试套件中引入了 Node.js,除了 Chrome 之外,Node.js 正式成为 JS 引擎的标杆之一;当时每周约 30 亿次 npm 下载。
  • 2018:Node.js 10、ES 模块 .mjs 实验支持、Node.js 11;worker_threads 实验性出现。
  • 2019:Node.js 12、Node.js 13;Node.js 基金会与 JS 基金会合并为 OpenJS Foundation
  • 2020:Node.js 14、Node.js 15;ESM 继续推进(package.json"type": "module"、去掉命令行实验旗标)。
  • 2021:Node.js 16、Node.js 17;ESM 实现标为稳定。

  • 2022:Node.js 18 成为 LTS。内置 fetch 默认可用;内置测试运行器 node:test 落地;默认 OpenSSL 3。同年还有 Current 线 Node.js 19。

  • 2023:Node.js 20 LTS。node:test 稳定;--watch 热重载;权限模型(Permission Model)以实验形式出现。Node.js 21 为 Current。
  • 2024:Node.js 22 LTS。require() 加载 ESM 逐步放开;22.6 起可用 --experimental-strip-types 直接跑可擦除的 TypeScript。Node.js 23 为 Current。单文件可执行应用(SEA)进入可用阶段。
  • 2025:Node.js 24 成为 LTS。类型剥离在较新版本上默认打开(只删类型注解、不做 tsc 那种类型检查;enum 等要生成代码的语法仍需另编)。Node.js 25 为 Current。权限模型在后续小版本中稳定。
  • 2026(至 9 月):Node.js 20 已于 4 月 30 日结束官方支持。生产上常用 24(Active LTS)22(Maintenance LTS)26 为 Current,计划在 10 月前后进入 LTS。选偶数大版本做长期运行。

Node.js 与浏览器的区别

浏览器和 Node.js 均使用 JavaScript 作为其编程语言,但构建运行于浏览器中的应用程序与构建 Node.js 应用程序完全不同。

Node.js 应用程序具有巨大的优势:使用单一语言轻松编程所有一切(前端和后端)。

在浏览器中,主要操作是与 DOM 或 Web 平台 API 进行交互,但不存在文件系统访问等功能。

而在 Node.js 中,允许文件系统访问,并且可以选择不同的运行环境(不同版本的 Node.js),但它没有浏览器提供的 documentwindow,以及所有其他的页面对象。Node 18 之后,fetchURLAbortController、Web Streams 等 Web API 已经进了运行时,前后端能共用的表面在变大,DOM 仍然没有。

JavaScript 发展的速度非常快,但是浏览器发展得慢一些,并且用户的升级速度也慢一些,因此有时在 web 上,不得不使用较旧的 JavaScript / ECMAScript 版本。而 Node.js 则不需要,它支持新的 ECMAScript 标准(以当前安装的大版本为准)。

模块系统曾经是最大差异:Node 长期默认 CommonJSrequire / module.exports),浏览器走 ES 模块import / export)。现在两边都支持 ESM。Node 里用 .mjs,或在 package.json"type": "module",即可 import;未声明时 .js 仍按 CommonJS。现代浏览器也已原生执行 ESM,不再「还在实现」。

V8 JavaScript 引擎

V8 是 Google Chrome 提供支持的 JavaScript 引擎的名称。当使用 Chrome 进行浏览时,它负责处理并执行 JavaScript。

V8 提供了执行 JavaScript 的运行时环境。DOM 和其他 Web 平台 API 则由浏览器提供。

JavaScript 引擎独立于托管它的浏览器。此关键的特性推动了 Node.js 的兴起。V8 于 2009 年被选为 Node.js 提供支持的引擎,并且随着 Node.js 的爆炸性发展,V8 成为了现在为大量的服务器端代码(使用 JavaScript 编写)提供支持的引擎。

Node.js 的生态系统非常庞大,得益于此,V8 还为桌面应用程序(通过 Electron 等项目)提供支持。

V8 使用 C++ 编写,并且不断地被改进。它是可移植的,且可运行于 Mac、Windows、Linux 和其他一些系统。

其他浏览器有自己的 JavaScript 引擎:

  • Firefox 具有 SpiderMonkey;
  • Safari 具有 JavaScriptCore(也称为 Nitro);
  • Edge 最初基于 Chakra,2020 年起改用 Chromium 和 V8。

环境变量

如何从 Node.js 读取环境变量

Node.js 的 process 核心模块提供了 env 属性,该属性承载了在启动进程时设置的所有环境变量。Node 20.6 起也可以用 --env-file=.env 从文件注入,不必先靠 shell 导出。

process.env.NODE_ENV

Node.js 从命令行接收参数

node app.js joe
node app.js name=joe

第一行是独立参数;第二行是自己约定的 键=值,Node 不会自动拆成对象。

获取参数值的方法是使用 Node.js 中内置的 process 对象,其 argv 属性是一个包含所有命令行调用参数的数组。

argv 数组的第一个参数是 node 命令的完整路径;第二个参数是正被执行的文件的完整路径;所有其他的参数从第三个位置开始。Node 18 起也可以用 util.parseArgs() 做规范解析。

const args = process.argv.slice(2)
args[0]

Node.js 资料

Node.js 官方文档

Node.js 中文学习指南

Node.js 中文网 - 入门教程

Node.js 中文网 - API 文档

API Reference Document - nodejs

© lizhao all right reserved,powered by Gitbook文件修订时间: 2026-09-02 00:33:37

results matching ""

    No results matching ""