Skip to content

Node.js 包管理器 (NPM)

npm (Node Package Manager) 是 Node.js 默认且最流行的包管理器。对于任何 Node.js 开发者来说,它都是一个至关重要的工具,提供两个主要功能:

  • 在线注册中心 (Online Registry): 一个庞大的公共数据库(即 npm Registry),托管着数十万个开源 Node.js 包(库、模块、工具)。您可以在 npmjs.com 网站上搜索包。
  • 命令行接口 (CLI) 工具 (Command-Line Interface Tool): 一个命令行实用程序(npm),用于安装、管理、更新和发布 Node.js 包,处理项目依赖项,以及运行项目脚本。

npm 与 Node.js 安装程序捆绑在一起,因此当您安装 Node.js 时,会自动获得 npm。您可以通过打开终端并运行以下命令来验证已安装的 npm 版本:

$ npm --version
9.5.0 # Your version might differ

npm 的更新频率比 Node.js 本身更高。您可以使用 npm 本身将 npm 更新到最新版本:

# Use sudo on Linux/macOS if needed, or run from an Administrator prompt on Windows
$ npm install -g npm@latest

每个 Node.js 项目在其根目录中都应该有一个 package.json 文件。这个 JSON 文件包含有关项目的元数据,包括:

  • 项目名称、版本、描述、作者、许可证。
  • Dependencies (依赖项): 应用程序运行所需的包。
  • DevDependencies (开发依赖项): 仅在开发过程中需要的包(例如,测试库、构建工具)。
  • Scripts (脚本): 您可以使用 npm run <script-name> 运行的自定义命令(例如,npm start、npm test)。
  • 主入口文件 (Main entry point file)。
  • 仓库 (Repository) 信息。

要创建 package.json 文件,请在终端中导航到您的项目目录并运行:

$ npm init

此命令将提示您输入各种信息(项目名称、版本等)。您可以按 Enter 键接受默认值,或提供自己的值。

要快速创建带有默认值的 package.json 文件而无需交互式提示,请使用:

$ npm init -y

要安装包并将其添加为项目依赖项(将其保存在 package.json 中),请使用 npm install 命令(或其简写 npm i):

# Installs the 'lodash' utility library
$ npm install lodash

此命令会执行以下几项操作:

  • 从 npm 注册中心下载 lodash 包。
  • 将其放置在您项目目录中的 node_modules 文件夹内。(如果 node_modules 不存在,则会创建它)。
  • 将 lodash 添加到 package.json 文件的 dependencies 部分。
  • 创建或更新 package-lock.json 文件。

每当您修改 node_modules 树或 package.json 时,都会自动生成或更新此文件。它记录了安装的每个包的精确版本,包括依赖项的依赖项。这确保了使用 npm install 设置项目的其他人都能获得完全相同的依赖项版本,从而实现更一致的构建。您应该将 package-lock.json 提交到您的版本控制系统(如 Git)。

要仅安装开发过程中需要的包(例如,测试框架如 Jest、构建工具如 Webpack),请使用 --save-dev 标志(或 -D):

# Installs 'jest' testing framework as a dev dependency
$ npm install --save-dev jest
# or shorthand
$ npm i -D jest

这些包会被添加到 package.json 中的 devDependencies 部分,并且通常在生产安装过程中会被跳过。

模块本地安装后,您可以使用 require 函数 (CommonJS 模块) 或 import 语句 (ES Modules,如果您的项目已配置) 在 Node.js 代码中使用它:

// Using CommonJS
const _ = require('lodash');
const numbers = [1, 2, 3, 4, 5];
const sum = _.sum(numbers);
console.log(`Sum calculated by lodash: ${sum}`);

本地安装 (默认 & 推荐): 不带 -g 标志安装的包会被放置在当前项目的 node_modules 目录中。它们在该特定项目中可通过 require() 或 import 访问。这是管理项目依赖项的标准方式。

全局安装 (Global Installation): 使用 -g 或 --global 标志会将包安装在系统范围的位置。这些通常是您希望在系统上的任何地方运行的命令行工具(例如,nodemon、create-react-app、npm 本身)。全局包通常 不可 通过项目代码中的 require() 访问。

# Example: Install nodemon globally to auto-restart Node apps
$ npm install -g nodemon

要列出全局安装的包:

$ npm list -g --depth=0 # depth=0 shows only top-level packages

要列出当前项目本地安装的包:

$ npm list --depth=0

npm 还包含一个配套工具,称为 npx。它允许您运行 npm 包中的命令,而 无需 将其全局安装,或显式引用它们在 node_modules/.bin 中的路径。npx 会检查命令是否存在于本地的 node_modules/.bin 中,或是否已全局安装,否则它会临时下载该包,运行命令,然后丢弃该包。

# Run the 'create-react-app' tool without installing it globally
$ npx create-react-app my-new-react-app
# Run the locally installed 'jest' test runner
$ npx jest
  • npm uninstall <package-name>: 从 node_modules 和 package.json/package-lock.json 中移除包。
  • npm update: 将包更新到 package.json 中指定版本范围允许的最新版本,并更新 package-lock.json。
  • npm update <package-name>: 更新一个特定的包。
  • npm outdated: 检查注册中心,查看哪些已安装的包已过时。
  • npm run <script-name>: 执行 package.json 的 scripts 部分中定义的脚本(例如,npm run test、npm run build)。常用脚本 start 和 test 可以无需 run 关键字即可运行:npm start、npm test。
  • npm ci: (Clean Install) 干净安装。完全按照 package-lock.json 中指定的内容安装依赖项。它首先删除 node_modules,并且通常比 npm install 更快、更可靠,适用于自动化构建/持续集成 (CI) 环境。
  • npm search <keyword>: 在 npm 注册中心搜索匹配关键字的包。
  • npm view <package-name>: 显示来自注册中心的包的详细信息(版本、依赖项等)。
  • npm login: 登录您的 npm 账户(发布必需)。
  • npm publish: 将当前目录中的包发布到 npm 注册中心(需要 package.json 并已登录)。

npm 包通常遵循语义化版本控制 (Semantic Versioning) (主要版本.次要版本.补丁版本,例如 16.8.2)。

  • MAJOR (主要版本): 用于不兼容的 API 更改时递增。
  • MINOR (次要版本): 添加向后兼容的功能时递增。
  • PATCH (补丁版本): 用于向后兼容的错误修复时递增。

在 package.json 中,版本范围如 ^16.8.2(允许更新到 <17.0.0 之前)或 ~16.8.2(允许更新到 <16.9.0 之前)很常见,它们控制着 npm update 的行为方式。