JavaScript 是一门编程语言;Node.js 是一个运行时,也就是在浏览器之外运行 JavaScript 的程序。两者的语法、类型和标准对象(Array、Promise、JSON)都一样。变化的是代码所处的环境:浏览器给你 window 和 document 来操作网页,而 Node.js 给你 global、process、require 以及 fs 这类模块,用来操作文件、服务器和操作系统。
浏览器的全局对象打印出 undefined,Node.js 的则是 object 或 function,最后一行是 true,因为在 Node.js 中 globalThis 和 global 是同一个对象。把前六行粘贴到浏览器控制台里,结果就会反过来。
一张表看懂区别
| 浏览器中的 JavaScript | Node.js 中的 JavaScript | |
|---|---|---|
| 它是什么 | 这门语言,由浏览器的引擎运行 | 同一门语言,由 Node.js 运行时(V8)运行 |
| 全局对象 | window | global |
| 操作对象 | 页面:document、DOM、事件 | 机器:fs、http、process、os |
| 模块 | <script type="module">、import | require(CommonJS)和 import(ES 模块) |
| 包 | 打包进页面 | 用 npm 安装到 node_modules |
| 输入 | 点击、表单、键盘事件 | 命令行参数、标准输入、HTTP 请求 |
Array、Promise、JSON、setTimeout、console | 有 | 有 |
最容易让人困惑的是模块这一行。Node.js 同时支持 require 和 import 两种模块系统,而浏览器只认识 import。该选哪一种,请看 CommonJS 与 ES 模块 页面。
语言是一样的
只用到语言本身的函数在哪里都能运行。下面这段代码没有任何 Node 专属的内容,在浏览器中也会打印出同样的结果:
它打印了 {"best":95,"average":85} 和 Passed: 2 of 3。展开语法、reduce、模板字符串和 JSON 都属于语言本身,由 ECMAScript 标准定义,所以每个运行时都有它们。
只有 Node.js 才有的东西
Node 专属的部分是那些与操作系统打交道的内置模块和全局对象:
它写入一个文件,再读回来,打印出 .txt 2 lines,然后打印一个空的参数列表。文件访问和 process.argv 在浏览器中都不存在,因为网页无法接触你的磁盘。
你能用哪些语言特性
这门语言有不同的版本(ES2015、ES2020、ES2024 等),每个引擎都按自己的节奏添加新特性。Node.js 的每个版本都内置一个特定的 V8 引擎,所以你的 Node.js 版本决定了哪些特性可用:比如 Object.groupBy 和 Array.prototype.findLast 就需要较新的版本。因此,浏览器兼容性表格会把 Node.js 作为 Chrome、Firefox 和 Safari 旁边的又一列。当较新的语法报出 SyntaxError,或者某个方法是 undefined 时,先运行 node --version,在考虑 polyfill 之前先升级。
编写在两边都能运行的代码
库的作者有时会在使用某个环境专属的 API 之前,先检查代码运行在哪里:
const isNode = typeof process !== 'undefined' && process.versions?.node != null;
const isBrowser = typeof window !== 'undefined';
只要可以,就检查你需要的特性,而不是环境的名字:typeof fetch === 'function' 比“这是不是 Node”更有意义。如今两边都有 fetch、URL、TextEncoder、setTimeout 和 structuredClone,所以需要检查的代码比几年前少多了。
常见错误
在 Node.js 脚本中使用 document 或 window。 你会得到 ReferenceError: document is not defined。这类代码应该在浏览器中运行。
在浏览器中使用 require。 浏览器没有它。请使用 import,或者用打包工具把 require 调用合并成一个文件。
以为 Node.js 是另一门语言。 它不是。JavaScript 教程里教的东西在 Node.js 中都能用,除非用到了 DOM。
常见问题
不学 JavaScript 能学 Node.js 吗?
基本不行。你在 Node.js 中写的每一行都是 JavaScript,所以要先学这门语言。等你掌握了函数、对象和 Promise,Node.js 就只是一组需要额外学习的 API。
为什么在 Node.js 中会报“document is not defined”?
document 是浏览器的 DOM,而 Node.js 没有页面可以提供它。用到 document 或 window 的代码必须在浏览器中运行,或者在 jsdom 这类模拟 DOM 的测试环境中运行。
TypeScript 和 Node.js 是一回事吗?
不是。TypeScript 是带类型的 JavaScript,会编译成 JavaScript。编译结果可以在 Node.js 或浏览器中运行,而且较新的 Node.js 版本也能通过去掉类型,直接运行很多 .ts 文件。