Published on

node.js 相关概念备忘

Authors
  • Name
    Twitter

这篇文章用来记录 Node.js 生态里最常见、也最容易混淆的一些概念。
如果你经常会把 Node.jsnpmnpxnvmyarn 混在一起看,这篇可以当作一个简明备忘。

什么是 node.js

Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境,它让开发者可以在浏览器之外运行 JavaScript,用来构建:

  • 服务端应用
  • 命令行工具
  • 构建脚本

Node.js 底层运行的是 V8 引擎,也就是 Chrome 所使用的 JavaScript 引擎。

什么是 V8 引擎

V8 是 Google 开源的 JavaScript 引擎,负责解析并执行 JavaScript 代码。

要注意区分:

  • V8 负责执行 JavaScript
  • 浏览器 还会额外提供 DOM、事件系统、fetch 等 Web API
  • Node.js 则在 V8 之外提供文件系统、进程、网络等服务端 API

所以常说的“JavaScript 能运行”,并不只靠语言本身,还依赖具体运行时环境提供的能力。

你可以通过 Node.js 的以下命令查看使用的 V8 引擎版本:

node -p process.versions.v8

通常只要安装了 Node.js,就不需要单独安装 V8,因为 V8 已经内置在 Node.js 里。

什么是 npm

npm 是 Node.js 生态里最常用的包管理工具之一。
它包含三部分:

  • 网站
  • 命令行工具(CLI)
  • 包注册中心(registry)

我们平时说“用 npm 安装依赖”,通常指的是使用 npm CLI 从 npm registry 下载和管理包。

需要注意一个常见误区:
npm 现在不被官方当作缩写来解释,不建议把它写成 Node.js Packager Manager。更准确的说法是:npm 是 Node.js 平台上的 package manager

npm 常用命令

npm run

npm runnpm run-script 的缩写,用来执行 package.json 里的脚本。
例如这个博客项目里就定义了如下命令:

"scripts": {
    "start": "next dev",
    "dev": "cross-env INIT_CWD=$PWD next dev",
    "build": "cross-env INIT_CWD=$PWD next build && cross-env NODE_OPTIONS='--experimental-json-modules' node ./scripts/postbuild.mjs",
    "serve": "next start",
    "analyze": "cross-env ANALYZE=true next build",
    "lint": "next lint --fix --dir pages --dir app --dir components --dir lib --dir layouts --dir scripts"
  },

例如:

npm run dev

它会启动当前项目里定义的开发服务。

npm init

用来初始化一个 Node.js 项目。
执行后会创建一个 package.json 文件:

{
  "name": "nodejs-starter",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

npm install

从 npm registry 安装依赖。

  • npm install 安装依赖到当前项目
  • npm install -D 等价于 npm install --save-dev,安装到 devDependencies
  • npm install -g 全局安装,通常用于 CLI 工具
"devDependencies": {
    "@vuepress/bundler-webpack": "^2.0.0-rc.7",
    "@vuepress/theme-default": "^2.0.0-rc.11",
    "vue": "^3.4.0",
    "vuepress": "^2.0.0-rc.7"
  }

npm update

用于升级已安装的依赖版本,具体升级范围取决于 package.json 里的版本约束。

什么是 nvm

nvm 是 Node Version Manager,用来管理多个 Node.js 版本。
当你需要在不同项目间切换 Node 版本时,它会特别有用。

什么是 npx

npx 用来直接运行 npm 包中的可执行命令。
它特别适合下面两类场景:

  • 运行当前项目里本地安装的 CLI
  • 临时执行一个不想全局安装的工具

例如:

npx create-next-app@latest my-app

什么是 yarn

Yarn 也是 JavaScript 生态中的包管理工具,和 npm 类似,都可以用来:

  • 安装依赖
  • 更新依赖
  • 管理脚本
  • 处理 workspace / monorepo

不同团队会根据历史原因、功能偏好和仓库习惯选择 npm、Yarn 或 pnpm。
在实际项目里,优先遵循仓库已经使用的包管理器,不要混用。

小结

如果要一句话区分这些工具:

  • Node.js 是运行时
  • V8 是 JavaScript 引擎
  • npm / yarn 是包管理工具
  • npx 用来执行包里的命令
  • nvm 用来切换 Node.js 版本