npm
Node.js 默认包管理器,JavaScript 生态系统中最大的软件注册表
npm 是 Node.js 的默认包管理器,托管超过 300 万个开源包,是 JavaScript 生态最大的软件注册表。v12 带来供应链安全变革,默认禁用安装脚本、Git 依赖和远程 URL。
npm
Node.js 默认包管理器,JavaScript 生态系统中最大的软件注册表
技术简介说明
npm(Node Package Manager)自 2010 年由 Isaac Z. Schlueter 创建以来,已成为 JavaScript 生态系统中最重要的基础设施之一。作为 Node.js 的默认包管理器,npm 随 Node.js 一同分发,开发者无需单独安装即可使用。
npm 的核心价值在于其注册表(Registry)——一个托管超过 300 万个开源 JavaScript 包的全球分布式数据库。无论是 React、Vue、Next.js 等前端框架,还是 Express、Fastify 等后端框架,亦或是 Babel、Webpack、Vite 等构建工具,都通过 npm 进行分发和版本管理。
npm 的发展历程反映了 JavaScript 生态的演变:
- 2010 年:npm 随 Node.js 0.6.3 首次发布,采用 CommonJS 模块规范
- 2014 年:npm 成为 GitHub 上 star 数最多的项目之一,注册表包数量突破 10 万
- 2015 年:npm 3.0 引入扁平化依赖结构,解决
node_modules嵌套过深的问题 - 2017 年:npm 5.0 引入
package-lock.json,确保依赖安装的确定性 - 2020 年:GitHub / Microsoft 收购 npm,npm 成为 GitHub 生态的一部分
- 2021 年:npm 7.0 默认启用
package-lock.jsonv2,支持peerDependencies自动安装 - 2022 年:npm 8.0 引入 Workspaces 原生支持,monorepo 管理进入标准化阶段
- 2024 年:npm 10.0 完善 Workspaces,改进
npm audit安全审计能力 - 2025 年:npm 11.0 随 Node.js 24 发布,带来安全性、可靠性和易用性的全面提升
- 2026 年:npm 11.18.0 为当前稳定版本;npm 12 即将发布,带来以安全为核心的重大变更
npm 目前由 GitHub / Microsoft 维护,并作为 OpenJS Foundation 项目接受社区治理。其 Artistic License 2.0 许可证允许商业使用和修改,同时保留原始作者的版权声明。
基本信息
| 属性 | 值 |
|---|---|
| 官网 | https://www.npmjs.com/ |
| GitHub | https://github.com/npm/cli |
| License | Artistic License 2.0 |
| 最新版本 | v11.18.0(2026 年 7 月) |
| 主要维护者 | GitHub / OpenJS Foundation |
| 首次发布 | 2010 年 |
| 编写语言 | JavaScript(Node.js) |
| 支持平台 | Windows / macOS / Linux |
| 默认 Registry | https://registry.npmjs.org/ |
| 包数量 | 超过 300 万 |
快速上手
安装
npm 随 Node.js 一同安装,是 Node.js 的默认包管理器。安装 Node.js 即自动获得 npm。
通过官方安装包安装:
# 从官网下载 Node.js 安装包
# https://nodejs.org/
# 安装完成后 npm 自动可用
# 验证安装
node --version # v24.x.x
npm --version # v11.18.0通过 nvm 安装(推荐):
# 安装 nvm(Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
# 安装 Node.js(自带 npm)
nvm install 24
nvm use 24
# 验证
npm --version通过 Corepack 安装(Node.js 16.13+ / 25+):
注意:Corepack 在 Node.js 25 中已默认禁用并移除。如果你使用 Node.js 25+,需要单独安装 npm。
# Node.js 25+ 中单独安装 npm
npm install -g npm@latest独立安装 / 更新 npm:
# 更新到最新版本
npm install -g npm@latest
# 更新到指定版本
npm install -g [email protected]
# Windows 用户使用 PowerShell(管理员权限)
npm install -g npm@latest基础配置
npm 通过 .npmrc 文件进行配置,支持多层级配置:
全局配置(所有项目生效):
# 查看全局配置路径
npm config get userconfig
# 设置全局 registry(使用镜像源加速)
npm config set registry https://registry.npmmirror.com
# 设置代理
npm config set proxy http://proxy.company.com:8080
npm config set https-proxy http://proxy.company.com:8080
# 查看完整配置
npm config list项目级配置(.npmrc 文件放在项目根目录):
# .npmrc
registry=https://registry.npmmirror.com
# 作用域包使用私有 registry
@mycompany:registry=https://npm.mycompany.com/
# 设置日志级别
loglevel=warn
# 设置 save-exact,锁定精确版本
save-exact=true用户级配置(~/.npmrc):
# 设置认证 token(私有 registry 常用)
npm config set //npm.mycompany.com/:_authToken=<TOKEN>
# 或使用 legacy auth
npm config set //npm.mycompany.com/:_auth=<BASE64_AUTH>最小示例
1. 初始化项目:
mkdir my-project
cd my-project
npm init
# 或直接跳过交互式问答
npm init -y生成 package.json:
{
"name": "my-project",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}2. 安装依赖:
# 安装生产依赖
npm install express
# 安装开发依赖
npm install --save-dev vitest
# 安装全局包
npm install -g typescript
# 安装指定版本
npm install [email protected]
# 安装作用域包
npm install @types/node3. 管理脚本:
{
"scripts": {
"dev": "node --watch src/index.js",
"build": "tsc",
"test": "vitest run",
"lint": "eslint src/",
"start": "node dist/index.js"
}
}npm run dev
npm run build
npm test4. 发布包到 npm Registry:
# 登录 npm 账号
npm login
# 发布公开包
npm publish
# 发布作用域包(需设置 access)
npm publish --access public
# 发布预发布版本
npm publish --tag beta核心概念与架构
Registry(注册表)
npm Registry 是一个公开的、分布式的 JavaScript 包数据库,托管超过 300 万个包。每个包包含:
- 元数据(Metadata):包名、版本列表、描述、依赖声明、维护者信息
- Tarball:打包后的代码归档(
.tgz文件) - Distribution Tags:
latest、next、beta等标签,指向特定版本
Registry 采用 CouchDB 作为底层存储,通过全球 CDN(Fastly)分发,确保低延迟访问。
Packages 与 node_modules
project/
├── node_modules/ # 依赖安装目录
│ ├── express/ # 包的完整代码
│ │ ├── package.json
│ │ ├── index.js
│ │ └── lib/
│ ├── lodash/
│ └── .package-lock.json # 实际安装版本记录
├── package.json # 项目依赖声明
├── package-lock.json # 锁定依赖树
└── .npmrc # 项目级配置
node_modules/ 是 npm 安装依赖的目标目录。npm 3.0+ 采用扁平化安装策略:将所有依赖提升到 node_modules/ 根层级,仅在版本冲突时嵌套到子目录。这大幅减少了目录深度和磁盘占用,但引入了"幽灵依赖"问题——项目中未显式声明但可被 require 到的依赖。
package.json
package.json 是项目的核心清单文件,声明了项目的元信息、依赖关系和脚本命令:
{
"name": "my-app",
"version": "1.0.0",
"type": "module",
"dependencies": {
"express": "^4.21.0"
},
"devDependencies": {
"vitest": "^2.0.0"
},
"peerDependencies": {
"react": ">=18.0.0"
},
"optionalDependencies": {
"fsevents": "^2.3.3"
},
"overrides": {
"minimist": "^1.2.8"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"test": "vitest"
}
}依赖类型说明:
| 类型 | 字段 | 用途 | 安装时机 |
|---|---|---|---|
| 生产依赖 | dependencies | 运行时必需 | npm install |
| 开发依赖 | devDependencies | 构建、测试、开发 | npm install(非 --omit=dev) |
| 对等依赖 | peerDependencies | 宿主环境必须提供 | npm 7+ 自动安装 |
| 可选依赖 | optionalDependencies | 可选功能,安装失败不中断 | npm install(失败跳过) |
| 覆盖依赖 | overrides | 强制子依赖使用指定版本 | 依赖解析时应用 |
Lock Files
package-lock.json 锁定依赖树的精确版本和完整性哈希:
{
"name": "my-app",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "my-app",
"version": "1.0.0",
"dependencies": {
"express": "^4.21.0"
}
},
"node_modules/express": {
"version": "4.21.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
"integrity": "sha512-...",
"dependencies": {
"accepts": "~1.3.8"
}
}
}
}Lock file 确保团队成员和 CI 环境安装完全一致的依赖树。lockfileVersion: 3 是 npm 7+ 的格式,npm 11 使用此格式。
依赖解析算法
npm 的依赖解析遵循以下流程:
- 读取
package.json:解析所有依赖声明和版本范围 - 查询 Registry:获取每个包的可用版本列表
- 版本匹配:根据 semver 范围选择最高兼容版本
- 扁平化:尝试将所有依赖提升到根层级,版本冲突时嵌套
- 写入 Lock File:记录解析结果,包含版本号、resolved URL 和 integrity hash
- 下载与安装:下载 tarball 并解压到
node_modules/
核心特性
1. Workspaces(工作区)
npm 原生支持 monorepo 管理,通过 workspaces 字段定义:
{
"name": "my-monorepo",
"private": true,
"workspaces": [
"packages/*",
"apps/*"
]
}# 在工作区安装包
npm install lodash --workspace=packages/utils
# 在工作区运行脚本
npm run build --workspace=apps/web
# 链接工作区包(自动)
# 工作区之间互相引用自动使用 symlink2. 语义化版本(Semver)
npm 严格遵循语义化版本规范,支持多种版本范围语法:
npm install lodash # ^4.17.21(默认,兼容更新)
npm install lodash@~4.17.0 # ~4.17.x(仅补丁更新)
npm install [email protected] # 精确版本
npm install lodash@>=4.0.0 # 范围匹配
npm install lodash@* # 最新版本
npm install lodash@latest # latest 标签
npm install lodash@next # next 标签3. Scripts(脚本系统)
npm scripts 是项目自动化的核心入口,支持生命周期钩子:
{
"scripts": {
"preinstall": "node scripts/check-node-version.js",
"postinstall": "node scripts/build-native.js",
"prebuild": "npm run lint",
"build": "tsc",
"postbuild": "node scripts/copy-assets.js",
"prepare": "husky install"
}
}生命周期钩子执行顺序:
preinstall → install → postinstall
prepublish → prepare → prepublishOnly
prebuild → build → postbuild
pretest → test → posttest
4. npx
npx 随 npm 5.2+ 一同发布,用于执行包中的二进制命令而无需全局安装:
# 执行本地 node_modules 中的命令
npx vitest run
# 临时下载并执行包
npx create-next-app@latest my-app
# 指定版本执行
npx @angular/cli@17 new my-project
# 执行 GitHub gist
npx https://gist.github.com/user/gist-id5. npm audit
内置安全审计功能,检测已知漏洞:
# 审计当前项目依赖
npm audit
# 以 JSON 格式输出
npm audit --json
# 自动修复可修复的漏洞
npm audit fix
# 强制修复(可能引入破坏性变更)
npm audit fix --force6. 发布与版本管理
# 自动升版并发布
npm version patch # 1.0.0 → 1.0.1
npm version minor # 1.0.0 → 1.1.0
npm version major # 1.0.0 → 2.0.0
# 发布预发布版本
npm version prerelease --preid=beta
# 1.0.0 → 1.0.1-beta.0
# 发布到指定 tag
npm publish --tag next
# 撤销发布(72 小时内)
npm unpublish [email protected]
# 废弃版本(不删除,标记为废弃)
npm deprecate my-package@"<1.0.0" "该版本已废弃,请升级到 1.0.0+"7. Overrides(依赖覆盖)
强制子依赖使用指定版本,解决依赖冲突和安全漏洞:
{
"overrides": {
"minimist": "^1.2.8",
"semver": {
".": "^7.5.4",
"nested-dep": "2.0.0"
}
}
}8. 缓存机制
npm 维护本地缓存以加速重复安装:
# 查看缓存目录
npm config get cache
# 清理缓存
npm cache clean --force
# 验证缓存完整性
npm cache verify9. 作用域包(Scoped Packages)
# 创建作用域包
mkdir @mycompany/utils
npm init --scope=@mycompany
# 安装作用域包
npm install @mycompany/utils
# 发布作用域包
npm publish --access public10. Fund 与问题报告
# 查看当前项目依赖中哪些接受赞助
npm fund
# 查看依赖的问题追踪器
npm bugs express
# 打开 https://github.com/expressjs/express/issues生态图
npm 生态系统
│
┌──────────────┼──────────────┐
│ │ │
┌─────▼─────┐ ┌────▼────┐ ┌──────▼──────┐
│ npm │ │ 工具链 │ │ CI/CD │
│ Registry │ │ │ │ 集成 │
└─────┬─────┘ └────┬────┘ └──────┬──────┘
│ │ │
┌─────────┼─────┐ ┌───┼────┐ ┌────┼─────┐
│ │ │ │ │ │ │ │ │
公开包 私有包 作用域 npx npm GitHub GitLab Jenkins
300万+ 企业级 @scope CLI Work Actions
│ │ │ │ spaces
└─────────┼─────┘ └───┼────┘ └────┼─────┘
│ │ │
┌────▼──────────────▼──────────────▼────┐
│ package.json │
│ 项目依赖与脚本声明 │
└─────────────────┬─────────────────────┘
│
┌────────────┼────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌───▼─────┐
│ Node.js │ │ 前端 │ │ 全栈 │
│ 应用 │ │ 框架 │ │ 框架 │
└─────────┘ └─────────┘ └─────────┘
核心生态组件:
- npm Registry:300 万+ 包的全球分发网络
- npm CLI:命令行工具,安装、发布、管理依赖
- npx:包执行器,无需全局安装即可运行命令
- npm Workspaces:monorepo 原生支持
- GitHub Packages:与 GitHub 集成的私有包托管
- npm Enterprise:企业级私有 registry 解决方案
- package.json / package-lock.json:项目清单与锁定文件
相关工具:
| 工具 | 用途 | 说明 |
|---|---|---|
| npx | 包执行 | 临时运行包命令 |
| npm-check | 依赖检查 | 检查过时依赖 |
| npm-check-updates | 版本更新 | 批量更新 package.json 中的版本范围 |
| np | 发布工具 | 更友好的发布工作流 |
| npm-run-all | 脚本并行 | 并行/串行运行多个 npm scripts |
| concurrently | 并发执行 | 同时运行多个命令 |
| changesets | 版本管理 | monorepo 版本发布工具 |
适用场景
1. Node.js 后端应用开发
npm 是 Node.js 应用的默认包管理器,适用于 Express、Fastify、NestJS 等框架的依赖管理。其 scripts 字段提供了开发、构建、测试的完整生命周期入口。
# 典型的 Node.js 项目工作流
npm install # 安装依赖
npm run dev # 开发模式启动
npm run build # 构建生产版本
npm test # 运行测试
npm start # 生产模式启动2. 前端项目构建
npm 管理前端框架(React、Vue、Angular、Svelte)和构建工具(Vite、Webpack、Rollup)的依赖。通过 devDependencies 区分开发和生产依赖,scripts 定义构建流水线。
3. Monorepo / 多包项目管理
npm Workspaces 为 monorepo 提供原生支持,无需额外工具即可管理工作区间的依赖共享、脚本编排和包链接。适合中大型团队统一代码库。
# monorepo 典型结构
my-monorepo/
├── package.json # 定义 workspaces
├── packages/
│ ├── ui/ # 共享 UI 组件库
│ ├── utils/ # 工具函数库
│ └── config/ # 共享配置
└── apps/
├── web/ # Web 应用
└── mobile/ # 移动端应用4. CLI 工具开发与分发
npm 是分发命令行工具的标准渠道。通过 bin 字段注册命令,用户通过 npx 或全局安装即可使用。
{
"name": "my-cli",
"bin": {
"my-cli": "./dist/cli.js"
}
}5. 企业私有包管理
通过配置私有 registry(如 GitHub Packages、Verdaccio、Artifactory),npm 支持企业内部包的分发和权限管理。@scope 作用域机制确保企业包与公共包隔离。
6. CI/CD 流水线集成
npm 与所有主流 CI/CD 平台深度集成。npm ci 命令专为 CI 环境设计,确保快速、确定性的依赖安装。
# GitHub Actions 示例
- uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'npm'
- run: npm ci
- run: npm test
- run: npm run build7. 开源项目维护
npm 是开源 JavaScript 项目分发的标准渠道。维护者通过 npm publish 发布版本,通过 npm version 管理版本号,通过 npm deprecate 废弃旧版本。
开发与工程化
开发工作流
# 1. 项目初始化
npm init -y
# 2. 安装开发依赖
npm install -D typescript vitest eslint @types/node
# 3. 配置 scripts
# package.json 中定义开发脚本
{
"scripts": {
"dev": "tsc --watch",
"build": "tsc",
"test": "vitest",
"test:watch": "vitest --watch",
"lint": "eslint src/",
"lint:fix": "eslint src/ --fix",
"typecheck": "tsc --noEmit",
"prepare": "husky install"
}
}
# 4. 开发循环
npm run dev # 终端 1:TypeScript 监听编译
npm run test:watch # 终端 2:测试监听CI/CD 集成
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20, 22, 24]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm run typecheck
- run: npm test
- run: npm run buildnpm ci vs npm install:
| 特性 | npm ci | npm install |
|---|---|---|
| 要求 Lock File | 必须存在 | 可选 |
| 安装速度 | 更快(跳过依赖解析) | 较慢(需要解析) |
| 确定性 | 严格一致 | 可能产生差异 |
| 修改 Lock File | 不允许 | 允许 |
| 删除 node_modules | 先删除再安装 | 增量安装 |
| 适用场景 | CI/CD、Docker 构建 | 本地开发 |
Monorepo 管理
npm Workspaces 提供以下能力:
# 在根目录执行
npm install # 安装所有工作区依赖
npm install lodash -w packages/utils # 为特定工作区安装依赖
# 运行工作区脚本
npm run build --workspace=packages/ui
npm run build --workspace=apps/web
# 列出所有工作区
npm query ':workspace'
# 过滤工作区执行
npm run test --workspace=packages/*工作区间依赖链接:
// packages/ui/package.json
{
"name": "@mycompany/ui",
"version": "1.0.0",
"dependencies": {
"@mycompany/utils": "workspace:*" // npm workspaces 协议
}
}注意:npm Workspaces 使用
"workspace:*"协议需要 npm 9+。早期版本依赖自动 hoisting 实现工作区包之间的引用。
Scripts 编排
{
"scripts": {
// 并行运行多个开发服务器
"dev": "concurrently \"npm:dev:*\"",
"dev:server": "node --watch src/server.js",
"dev:client": "vite",
// 构建流水线(串行,使用 &&)
"build": "npm run clean && npm run typecheck && npm run compile && npm run bundle",
"clean": "rimraf dist",
"typecheck": "tsc --noEmit",
"compile": "tsc",
"bundle": "rollup -c",
// 测试流水线
"test": "npm run test:unit && npm run test:e2e",
"test:unit": "vitest run --coverage",
"test:e2e": "playwright test",
// 发布流水线
"release": "npm run build && npm test && npm publish"
}
}性能与安全
性能特征
npm 的性能在主流包管理器中处于中等水平:
| 操作 | npm 11 | pnpm 9 | Yarn 4 | Bun 1.x |
|---|---|---|---|---|
| 冷安装(无缓存) | 基准 | ~30% 快 | ~10% 快 | ~60% 快 |
| 热安装(有缓存) | 基准 | ~40% 快 | ~20% 快 | ~70% 快 |
| 磁盘占用 | 基准 | ~60% 小 | ~20% 小 | ~40% 小 |
| Lock File 解析 | 基准 | ~50% 快 | ~30% 快 | ~80% 快 |
性能优化手段:
# 1. 使用 npm ci 替代 npm install(CI 环境)
npm ci --prefer-offline
# 2. 优先使用本地缓存
npm install --prefer-offline
# 3. 减少网络请求
npm install --maxsockets 50 # 增加并发数
# 4. 跳过可选依赖(Docker/CI 优化)
npm install --omit=optional
# 5. 使用 --ignore-scripts 跳过安装脚本
npm install --ignore-scripts # 安全敏感场景npm v12 安全变革(2026 年 7 月)
npm v12 带来了以供应链安全为核心的重大变更,这是 npm 历史上最激进的一次安全加固:
1. 安装脚本默认禁用:
preinstall、install、postinstall 脚本默认不再执行。
# 显式允许安装脚本
npm install --ignore-scripts=false
# 或在全局配置中允许
npm config set ignore-scripts false
# 在项目 .npmrc 中配置
ignore-scripts=false2. Git 依赖默认禁用:
# 不再允许:
npm install github:user/repo
npm install git+https://github.com/user/repo.git
# 显式允许:
npm install --allow-git=github.com/user/repo3. 远程 URL 依赖默认禁用:
# 不再允许:
npm install https://example.com/package.tgz
# 显式允许:
npm install --allow-remote=true影响范围:
- 大量依赖
postinstall脚本的包(如esbuild、core-js、node-sass)需要显式配置 - Git 依赖的 CI 流水线需要添加白名单
- 企业私有 registry 可能需要调整配置
npm audit 安全审计
# 基础审计
npm audit
# 按严重级别过滤
npm audit --audit-level=high
# 查看详细信息
npm audit --verbose
# JSON 输出(集成到安全工具链)
npm audit --json | jq '.vulnerabilities'
# 自动修复
npm audit fix
# 生产环境审计(跳过 devDependencies)
npm audit --omit=dev供应链安全最佳实践
# 1. 定期审计
npm audit
# 2. 锁定精确版本(减少不确定性)
npm config set save-exact true
# 3. 验证包完整性
# npm 自动验证 tarball integrity hash
# 4. 使用 --ignore-scripts 减少攻击面
npm install --ignore-scripts
# 5. 限制 registry 来源
# .npmrc
registry=https://registry.npmjs.org/
# 禁止从其他来源下载技术对比
npm vs pnpm vs Yarn vs Bun
| 维度 | npm 11 | pnpm 9 | Yarn 4 (Berry) | Bun 1.x |
|---|---|---|---|---|
| 存储策略 | 扁平 node_modules | 内容寻址存储 + 硬链接 | PnP / node_modules 混用 | 扁平 + 缓存优化 |
| 安装速度 | 中等 | 快(硬链接复用) | 中等 | 最快(Zig 实现) |
| 磁盘占用 | 高(每项目独立拷贝) | 低(全局 store 共享) | PnP 模式最低 | 中等 |
| 幽灵依赖 | 存在 | 严格隔离(默认无) | PnP 严格隔离 | 存在 |
| Lock File | package-lock.json | pnpm-lock.yaml | yarn.lock | bun.lockb |
| Monorepo | Workspaces(原生) | Workspaces(原生) | Workspaces(原生) | Workspaces(兼容) |
| Node.js 兼容 | 原生支持(默认) | 完全兼容 | 完全兼容 | 替代 Node.js |
| 离线支持 | 本地缓存 | 全局 store + 缓存 | 本地缓存 + PnP | 全局缓存 |
| 安全审计 | npm audit(内置) | 需外部工具 | 需外部工具 | 需外部工具 |
| 发布工具 | npm publish(内置) | 兼容 npm registry | yarn npm publish | bun publish |
| 社区规模 | 最大 | 快速增长 | 稳定 | 新兴 |
| 维护方 | GitHub / Microsoft | 社区(vdoing) | Meta / 社区 | Oven |
选择建议
| 场景 | 推荐 | 原因 |
|---|---|---|
| 新项目,无特殊需求 | npm | 零配置,随 Node.js 安装,生态最完整 |
| Monorepo,磁盘敏感 | pnpm | 硬链接存储,安装快,磁盘占用低 |
| 需要严格依赖隔离 | pnpm / Yarn PnP | 消除幽灵依赖 |
| 追求极致速度 | Bun | 原生安装速度最快 |
| 企业私有 registry | npm | 内置支持最完善,审计工具齐全 |
| 已有 Yarn 历史项目 | Yarn 4 | 迁移成本考虑 |
| CI/CD 流水线 | npm ci / pnpm | 确定性安装,npm ci 专为 CI 设计 |
| 供应链安全优先 | npm 12 | v12 安全加固最激进 |
最佳实践
生产环境配置
1. 使用精确版本锁定:
# .npmrc
save-exact=true// package.json 中使用精确版本
{
"dependencies": {
"express": "4.21.2", // 不使用 ^ 或 ~
"lodash": "4.17.21"
}
}2. CI/CD 使用 npm ci:
# 始终使用 npm ci 而非 npm install
- run: npm ci --prefer-offline --no-audit3. Docker 构建优化:
FROM node:24-slim
WORKDIR /app
# 仅复制 lock 文件,利用 Docker 缓存
COPY package.json package-lock.json ./
# 仅安装生产依赖
RUN npm ci --omit=dev --ignore-scripts --prefer-offline
# 复制源码
COPY . .
CMD ["node", "dist/index.js"]4. 定期安全审计:
// package.json
{
"scripts": {
"audit": "npm audit --audit-level=high",
"audit:fix": "npm audit fix",
"audit:json": "npm audit --json > audit-report.json"
}
}5. 版本范围策略:
| 依赖类型 | 推荐策略 | 说明 |
|---|---|---|
| 核心框架(React、Next.js) | 精确版本 | 避免意外升版导致破坏 |
| 稳定工具(lodash、dayjs) | ^ 范围 | 兼容更新,Lock File 锁定 |
| 快速迭代包 | ~ 范围 | 仅接受补丁更新 |
| 类型定义(@types/*) | ^ 范围 | 与主包版本对齐 |
6. .npmrc 生产配置模板:
# .npmrc(生产项目推荐配置)
registry=https://registry.npmjs.org/
save-exact=true
loglevel=warn
audit-level=high
# 禁用安装脚本(安全)
ignore-scripts=true
# 引擎检查
engine-strict=true
# 禁止从 Git 安装(npm v12 默认)
allow-git=团队协作规范
// package.json
{
"engines": {
"node": ">=22.0.0",
"npm": ">=11.0.0"
},
"scripts": {
"preinstall": "node scripts/check-engines.js",
"prepare": "husky install"
}
}依赖更新工作流:
# 检查过时依赖
npm outdated
# 使用 npm-check-updates 批量更新
npx npm-check-updates -u
npm install
# 使用 Renovate / Dependabot 自动化更新
# 在 CI 中自动创建更新 PR技术局限与边界
已知局限
1. 安装速度较慢:
npm 的安装速度在主流包管理器中不是最快的。对于大型项目(100+ 依赖),冷安装可能需要 30 秒以上,而 pnpm 或 Bun 可能只需 10-15 秒。根本原因是 npm 的扁平化安装策略需要为每个项目独立下载和复制依赖。
2. node_modules 体积膨胀:
扁平化的 node_modules 目录可能占用大量磁盘空间。一个中等规模的 Next.js 项目,node_modules 可能达到 500MB 以上。多个项目并存时,磁盘浪费更为显著。pnpm 的内容寻址存储从根本上解决了这一问题。
3. 幽灵依赖问题:
扁平化安装导致未在 package.json 中声明的依赖也可能被 require 到。这会造成"在我的机器上能跑,在你那里不行"的问题。pnpm 的严格模式和 Yarn PnP 彻底消除了幽灵依赖。
4. Lock File 冲突:
package-lock.json 在多人协作时容易产生 Git 合并冲突。由于 Lock File 格式较为冗长,合并冲突的解决成本较高。Yarn 的 yarn.lock 格式相对更紧凑。
5. 安装脚本安全风险:
postinstall 等生命周期脚本可以执行任意代码,是供应链攻击的主要入口。npm v12 已默认禁用安装脚本,但这也意味着部分依赖安装脚本的包需要额外配置。
6. 缺乏内置的依赖隔离:
npm 不默认隔离依赖的访问范围。一个包可以访问同层级其他包的依赖,这违反了最小权限原则。pnpm 和 Yarn PnP 通过严格隔离解决了这一问题。
7. 单 Registry 模型:
npm 默认使用单一 Registry(虽然可以按 scope 配置),无法像 pnpm 那样原生支持多 Registry 代理和缓存层。企业环境中,这可能导致对公共 Registry 的直接依赖。
边界场景
| 场景 | npm 表现 | 替代方案 |
|---|---|---|
| 超大型 monorepo(500+ 包) | 性能下降,安装慢 | pnpm Workspaces |
| 极致安装速度需求 | 中等 | Bun / pnpm |
| 严格依赖隔离 | 不支持 | pnpm strict / Yarn PnP |
| 边缘计算 / 嵌入式 | 体积过大 | Bun |
| 离线开发 | 缓存可用但不如 pnpm 全局 store | pnpm |
学习资源
官方文档
- npm 官方文档:https://docs.npmjs.com/
- npm CLI 手册:https://docs.npmjs.com/cli/
- npm Registry API:https://github.com/npm/registry
- semver 计算器:https://semver.npmjs.com/
- npm 博客:https://github.blog/(npm 团队在 GitHub Blog 发布更新)
核心概念深入
- 语义化版本规范:https://semver.org/lang/zh-CN/
- package.json 字段参考:https://docs.npmjs.com/cli/configuring-npm/package-json
- npm scripts 生命周期:https://docs.npmjs.com/cli/using-npm/scripts
- 依赖解析算法:https://docs.npmjs.com/cli/v11/configuring-npm/package-lock-json
教程与指南
- npm 入门教程:https://docs.npmjs.com/cli/v11/using-npm
- 创建和发布包:https://docs.npmjs.com/cli/v11/using-npm/developers
- Monorepo 与 Workspaces:https://docs.npmjs.com/cli/v11/using-npm/workspaces
- 安全审计指南:https://docs.npmjs.com/cli/v11/using-npm/security
- 私有包管理:https://docs.npmjs.com/cli/v11/using-npm/scope
社区与进阶
- npm GitHub Discussions:https://github.com/npm/cli/discussions
- npm 问题追踪:https://github.com/npm/cli/issues
- Node.js 最佳实践:https://github.com/goldbergy/nodejsbestpractices
- 《How npm works》:https://github.com/npm/cli/blob/latest/docs/
视频与博客
- npm 官方 YouTube:https://www.youtube.com/@npmjs
- Isaac Z. Schlueter 的演讲:npm 创始人的技术分享
- Node.js 官方博客:https://nodejs.org/en/blog
2026 年现状
npm v11 稳定期
截至 2026 年 7 月,npm v11.18.0 是当前稳定版本,随 Node.js 24 LTS 一同分发。v11 系列自 2025 年初发布以来,经过多次迭代已在安全性和易用性上取得显著进步:
- v11.9.0(2026 年 2 月):引入
allowGit标志,改进 WebAuth 错误信息 - v11.7.0(2025 年 12 月):多项 bug 修复和依赖更新
- 持续改进:Dependabot 安全更新、性能优化、错误提示改善
npm v12 即将到来
npm v12 预计于 2026 年 7 月发布,这是 npm 历史上最重要的安全导向版本:
三大核心变更:
- 安装脚本默认禁用 —
preinstall、install、postinstall不再执行,需显式 opt-in - Git 依赖默认禁用 —
npm install github:user/repo不再可用 - 远程 URL 依赖默认禁用 —
npm install https://...不再可用
影响评估:
- 约 15-20% 的流行包依赖
postinstall脚本(如esbuild、core-js、@prisma/client) - 使用 Git 依赖的 CI 流水线需要添加白名单配置
- 企业需要审查和更新内部
.npmrc配置
迁移路径:
# 提前测试 v12 兼容性
nvm install 25 # Node.js 25 可能默认包含 v12
# 检查项目是否依赖安装脚本
npm ls --json | grep -E "preinstall|install|postinstall"
# 为已知安全的包允许安装脚本
# .npmrc
allow-scripts=true
# 或使用白名单
# allow-scripts=@esbuild/postinstall,@prisma/clientCorepack 移除
Node.js 25(2026 年 4 月发布)已默认禁用并移除 Corepack。这意味着:
- npm 不再通过 Corepack 管理,需要直接安装
- Yarn 和 pnpm 的使用方式发生变化
- 开发者需要直接使用
npm install -g pnpm或corepack enable(如仍可用)
生态系统地位
npm 仍然是 JavaScript 生态系统的默认选择和最大包注册表。尽管 pnpm 在速度和磁盘效率上具有优势,Bun 在安装速度上领先,npm 凭借以下优势保持主导地位:
- 零配置:随 Node.js 安装,无需额外设置
- 生态最大:300 万+ 包,所有框架和工具的首选发布渠道
- 企业支持:GitHub / Microsoft 维护,企业信任度高
- 标准制定:
package.json、package-lock.json格式的事实标准 - 安全领先:v12 的安全加固使其成为供应链安全的标杆
版本路线图
| 版本 | 发布时间 | 关键特性 |
|---|---|---|
| v11.0 | 2025 年初 | 安全性、可靠性、易用性提升 |
| v11.7 | 2025 年 12 月 | Bug 修复,依赖更新 |
| v11.9 | 2026 年 2 月 | allowGit 标志,WebAuth 改进 |
| v11.18 | 2026 年 7 月 | 当前稳定版本 |
| v12.0 | 2026 年 7 月 | 供应链安全变革:禁用安装脚本、Git 依赖、远程 URL |
| v12.x | 2026 年下半年 | 渐进式安全加固,社区适配 |
选型建议(2026 年)
| 场景 | 推荐 |
|---|---|
| 新项目,快速启动 | npm — 零配置,随 Node.js 安装 |
| 大型 monorepo,磁盘敏感 | pnpm — 硬链接存储,安装快速 |
| 追求极致速度 | Bun — 原生最快安装 |
| 供应链安全优先 | npm v12 — 最激进的安全加固 |
| 已有 Yarn 项目 | Yarn 4 — 迁移成本最低 |
| Node.js 25+ 环境 | npm — Corepack 移除后的直接选择 |
文档维护说明:本文档反映 2026 年 7 月的 npm 生态现状。npm v12 的发布标志着供应链安全进入新阶段,建议在 v12 正式发布后及时更新迁移指南部分。