源本科技 | 码上会

NPM 包管理工具

2026/04/10
3
0

引言

npm(Node Package Manager,节点包管理器)是 Node.js 官方内置 的包管理工具,无需单独安装。它是全球最大的 JavaScript 包生态枢纽,负责完成第三方包的搜索、安装、更新、卸载、版本管理等操作。 依托 npm 生态,开发者可以快速复用海量成熟的第三方包,大幅弥补 Node.js 内置模块的不足,极大提升开发效率。

什么是包

在 Node.js 开发中,第三方模块 统一被称为包(Package)

包的来源

包由全球开发者、第三方团队开源开发,免费开源、可直接使用,不属于 Node.js 官方内置模块,也不是自定义模块。

包的核心价值

Node.js 内置模块仅提供底层 API,开发复杂功能效率极低; 包是对内置模块的高级封装,提供更简洁、更强大的 API,类比:

  • 浏览器内置 API ↔ jQuery 库

  • Node.js 内置模块 ↔ 第三方包

使用包可以快速实现时间格式化、网络请求、文件处理等复杂功能,无需从零开发。

包生态平台

npm 拥有全球最大的 JavaScript 包共享平台:

https://www.npmjs.com/
  • 生态规模:超 120 万个开源包,支撑全球开发者使用

使用 NPM

npm 伴随 Node.js 自动安装,无需额外配置,打开终端即可直接使用。

在项目中安装包

安装指定包的完整命令与简写命令:

# 完整命令
npm install 包名称
# 简写命令(推荐)
npm i 包名称

实战示例:安装时间格式化包 moment

npm install moment

在项目中使用包

安装完成后,通过 require() 引入包,即可直接调用其 API:

// 引入第三方包
const moment = require('moment');

// 格式化当前时间
const now = moment().format('YYYY-MM-DD HH:mm:ss');

// 输出结果
console.log(now);

安装包后的文件变化

初次安装包后,项目会自动生成两个核心文件 / 文件夹:

  • node_modules 文件夹:存放所有已安装的包,require() 加载第三方包时,会从此目录查找

  • package-lock.json 配置文件:锁定所有包的精确版本、下载地址、依赖关系,保证团队环境一致

重要规范:禁止手动修改 node_modulespackage-lock.json,所有操作由 npm 自动维护

安装指定版本的包

默认安装最新版本,使用 @ 符号可指定版本号:

# 安装 moment 2.24.0 版本
npm install moment@2.24.0

语义化版本规范

npm 包遵循语义化版本,格式:主版本号.功能版本号.修复版本号,示例:2.24.0

  • 第 1 位:大版本(不兼容的架构更新)

  • 第 2 位:功能版本(新增功能,向下兼容)

  • 第 3 位:Bug 修复版本(修复问题,无功能变更)

版本号规则:前面数字升级,后面数字归零,如 2.24.03.0.0

包管理配置文件

package.json项目必备的包管理配置文件,记录项目核心信息与所有依赖包,是团队协作的核心文件。

多人协作问题

在团队开发中,直接共享 node_modules 会导致项目体积巨大(占比 99%),传输、协作效率极低。

解决方案

  1. package.json 记录所有依赖包

  2. 共享代码时删除 node_modules 文件夹

  3. 成员获取代码后,一键重新安装所有依赖

记录已安装的包

为了轻量化共享项目,必须将依赖包记录在 package.json 中,同时将 node_modules 加入 .gitignore 忽略文件,禁止提交到代码仓库。

package.json

在项目根目录、英文路径、无空格下,执行命令一键生成:

npm init -y

严格注意

  1. 命令仅支持英文目录,项目名称禁止使用中文、空格、特殊字符

  2. 执行 npm install 安装包时,npm 会自动将包信息写入 package.json

dependencies

生产依赖

package.json 中的 dependencies 节点,记录项目运行必需的包(开发 + 线上环境都需要)。

{
  "name": "hello-nodejs",
  "version": "1.0.0",
  "dependencies": {
    "moment": "^2.30.1"
  }
}

devDependencies

开发依赖

仅在开发阶段使用、线上环境不需要的包,记录在 devDependencies 中(如构建工具、测试工具)。

安装开发依赖命令:

npm install 包名 --save-dev
# 简写
npm i 包名 -D

安装全部依赖

获取无 node_modules 的项目后,执行以下命令,npm 会自动读取 package.json,下载所有依赖包:

npm install
# 简写
npm i

执行成功后,自动生成 node_modules 文件夹,项目即可正常运行。

卸载包

使用 npm uninstall 卸载指定包,npm 会自动同步更新配置文件

npm uninstall 包名

卸载效果:

  1. node_modules 中删除包文件

  2. package.json 中移除依赖记录

  3. 更新 package-lock.json

包的分类

npm 安装的包分为两大类:项目包全局包,使用场景完全不同。

项目包

安装在当前项目的 node_modules 中,仅当前项目可用,分为两种:

  • 核心依赖包:记录在 dependencies,开发 + 线上都需要(如 momentaxios

  • 开发依赖包:记录在 devDependencies,仅开发需要(如打包工具、代码校验工具)

全局包

添加 -g 参数安装的包为全局包,全系统所有项目均可使用:

npm install 包名 -g
  • 安装路径:C:\Users\用户名\AppData\Roaming\npm\node_modules

  • 使用场景:命令行工具类包(提供终端命令,而非项目代码)

  • 规则:工具包全局安装,业务包项目安装

规范包结构

一个符合 npm 规范的标准包,必须满足 3 个强制要求:

  1. 独立文件夹形式存在

  2. 根目录必须包含 package.json 配置文件

  3. package.json 必须包含 3 个核心字段:

    • name:包名称(唯一)

    • version:包版本号

    • main:包的入口文件(require() 加载时默认读取的文件)

https://classic.yarnpkg.com/en/docs/package-json

其他补充

版本号前缀符号含义

package.json 中版本号前的符号,控制包的更新规则:

  • ^:兼容当前大版本的最新次版本(默认)

  • ~:兼容当前次版本的最新修复版

  • 无符号:固定精确版本

常用 npm 命令

命令

作用

npm init -y

快速生成 package.json

npm i 包名

安装生产依赖

npm i 包名 -D

安装开发依赖

npm i 包名 -g

全局安装

npm i

一键安装所有依赖

npm uninstall 包名

卸载包

npm view 包名 versions

查看包所有版本

最佳实践

  1. 项目创建后,优先执行 npm init -y

  2. 永远不要提交 node_modules 到代码仓库

  3. 严格区分生产依赖与开发依赖

  4. 全局仅安装工具包,业务功能包安装为项目包


总结

  1. 是第三方模块的统称,npm 是管理包的核心工具,伴随 Node.js 自动安装

  2. package.json 是项目协作核心,记录所有依赖,解决体积过大问题

  3. 依赖分为 dependencies(线上必需)和 devDependencies(仅开发)

  4. 项目包供当前项目使用,全局包提供系统级命令,-g 安装

  5. 规范的包必须包含独立目录、package.json 与核心配置字段