Node.js 包管理器 (NPM)
Node.js - npm (Node 包管理器)
Section titled “Node.js - npm (Node 包管理器)”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 --version9.5.0 # Your version might differnpm 的更新频率比 Node.js 本身更高。您可以使用 npm 本身将 npm 更新到最新版本:
# Use sudo on Linux/macOS if needed, or run from an Administrator prompt on Windows$ npm install -g npm@latest初始化项目 (package.json)
Section titled “初始化项目 (package.json)”每个 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使用 npm 安装模块
Section titled “使用 npm 安装模块”要安装包并将其添加为项目依赖项(将其保存在 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文件。
package-lock.json 文件
Section titled “package-lock.json 文件”每当您修改 node_modules 树或 package.json 时,都会自动生成或更新此文件。它记录了安装的每个包的精确版本,包括依赖项的依赖项。这确保了使用 npm install 设置项目的其他人都能获得完全相同的依赖项版本,从而实现更一致的构建。您应该将 package-lock.json 提交到您的版本控制系统(如 Git)。
安装开发依赖项
Section titled “安装开发依赖项”要仅安装开发过程中需要的包(例如,测试框架如 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 部分,并且通常在生产安装过程中会被跳过。
使用已安装的模块
Section titled “使用已安装的模块”模块本地安装后,您可以使用 require 函数 (CommonJS 模块) 或 import 语句 (ES Modules,如果您的项目已配置) 在 Node.js 代码中使用它:
// Using CommonJSconst _ = require('lodash');
const numbers = [1, 2, 3, 4, 5];const sum = _.sum(numbers);console.log(`Sum calculated by lodash: ${sum}`);全局 vs 本地安装
Section titled “全局 vs 本地安装”本地安装 (默认 & 推荐): 不带 -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=0npx - 执行 npm 包二进制文件
Section titled “npx - 执行 npm 包二进制文件”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 命令
Section titled “其他有用的 npm 命令”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并已登录)。
理解语义化版本 (SemVer)
Section titled “理解语义化版本 (SemVer)”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 的行为方式。