npm logo

npm

Node.js 默认包管理器,JavaScript 生态系统中最大的软件注册表

精选工具包管理器Node.js包注册表开源生态

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.json v2,支持 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/
GitHubhttps://github.com/npm/cli
LicenseArtistic License 2.0
最新版本v11.18.0(2026 年 7 月)
主要维护者GitHub / OpenJS Foundation
首次发布2010 年
编写语言JavaScript(Node.js)
支持平台Windows / macOS / Linux
默认 Registryhttps://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/node

3. 管理脚本:

{
  "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 test

4. 发布包到 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 Tagslatestnextbeta 等标签,指向特定版本

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 的依赖解析遵循以下流程:

  1. 读取 package.json:解析所有依赖声明和版本范围
  2. 查询 Registry:获取每个包的可用版本列表
  3. 版本匹配:根据 semver 范围选择最高兼容版本
  4. 扁平化:尝试将所有依赖提升到根层级,版本冲突时嵌套
  5. 写入 Lock File:记录解析结果,包含版本号、resolved URL 和 integrity hash
  6. 下载与安装:下载 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
 
# 链接工作区包(自动)
# 工作区之间互相引用自动使用 symlink

2. 语义化版本(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-id

5. npm audit

内置安全审计功能,检测已知漏洞:

# 审计当前项目依赖
npm audit
 
# 以 JSON 格式输出
npm audit --json
 
# 自动修复可修复的漏洞
npm audit fix
 
# 强制修复(可能引入破坏性变更)
npm audit fix --force

6. 发布与版本管理

# 自动升版并发布
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 verify

9. 作用域包(Scoped Packages)

# 创建作用域包
mkdir @mycompany/utils
npm init --scope=@mycompany
 
# 安装作用域包
npm install @mycompany/utils
 
# 发布作用域包
npm publish --access public

10. 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 build

7. 开源项目维护

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 build

npm ci vs npm install

特性npm cinpm 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 11pnpm 9Yarn 4Bun 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=false

2. Git 依赖默认禁用:

# 不再允许:
npm install github:user/repo
npm install git+https://github.com/user/repo.git
 
# 显式允许:
npm install --allow-git=github.com/user/repo

3. 远程 URL 依赖默认禁用:

# 不再允许:
npm install https://example.com/package.tgz
 
# 显式允许:
npm install --allow-remote=true

影响范围:

  • 大量依赖 postinstall 脚本的包(如 esbuildcore-jsnode-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 11pnpm 9Yarn 4 (Berry)Bun 1.x
存储策略扁平 node_modules内容寻址存储 + 硬链接PnP / node_modules 混用扁平 + 缓存优化
安装速度中等快(硬链接复用)中等最快(Zig 实现)
磁盘占用高(每项目独立拷贝)低(全局 store 共享)PnP 模式最低中等
幽灵依赖存在严格隔离(默认无)PnP 严格隔离存在
Lock Filepackage-lock.jsonpnpm-lock.yamlyarn.lockbun.lockb
MonorepoWorkspaces(原生)Workspaces(原生)Workspaces(原生)Workspaces(兼容)
Node.js 兼容原生支持(默认)完全兼容完全兼容替代 Node.js
离线支持本地缓存全局 store + 缓存本地缓存 + PnP全局缓存
安全审计npm audit(内置)需外部工具需外部工具需外部工具
发布工具npm publish(内置)兼容 npm registryyarn npm publishbun publish
社区规模最大快速增长稳定新兴
维护方GitHub / Microsoft社区(vdoing)Meta / 社区Oven

选择建议

场景推荐原因
新项目,无特殊需求npm零配置,随 Node.js 安装,生态最完整
Monorepo,磁盘敏感pnpm硬链接存储,安装快,磁盘占用低
需要严格依赖隔离pnpm / Yarn PnP消除幽灵依赖
追求极致速度Bun原生安装速度最快
企业私有 registrynpm内置支持最完善,审计工具齐全
已有 Yarn 历史项目Yarn 4迁移成本考虑
CI/CD 流水线npm ci / pnpm确定性安装,npm ci 专为 CI 设计
供应链安全优先npm 12v12 安全加固最激进

最佳实践

生产环境配置

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-audit

3. 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 全局 storepnpm

学习资源

官方文档

核心概念深入

教程与指南

社区与进阶

视频与博客

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 历史上最重要的安全导向版本

三大核心变更:

  1. 安装脚本默认禁用preinstallinstallpostinstall 不再执行,需显式 opt-in
  2. Git 依赖默认禁用npm install github:user/repo 不再可用
  3. 远程 URL 依赖默认禁用npm install https://... 不再可用

影响评估:

  • 约 15-20% 的流行包依赖 postinstall 脚本(如 esbuildcore-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/client

Corepack 移除

Node.js 25(2026 年 4 月发布)已默认禁用并移除 Corepack。这意味着:

  • npm 不再通过 Corepack 管理,需要直接安装
  • Yarn 和 pnpm 的使用方式发生变化
  • 开发者需要直接使用 npm install -g pnpmcorepack enable(如仍可用)

生态系统地位

npm 仍然是 JavaScript 生态系统的默认选择和最大包注册表。尽管 pnpm 在速度和磁盘效率上具有优势,Bun 在安装速度上领先,npm 凭借以下优势保持主导地位:

  1. 零配置:随 Node.js 安装,无需额外设置
  2. 生态最大:300 万+ 包,所有框架和工具的首选发布渠道
  3. 企业支持:GitHub / Microsoft 维护,企业信任度高
  4. 标准制定package.jsonpackage-lock.json 格式的事实标准
  5. 安全领先:v12 的安全加固使其成为供应链安全的标杆

版本路线图

版本发布时间关键特性
v11.02025 年初安全性、可靠性、易用性提升
v11.72025 年 12 月Bug 修复,依赖更新
v11.92026 年 2 月allowGit 标志,WebAuth 改进
v11.182026 年 7 月当前稳定版本
v12.02026 年 7 月供应链安全变革:禁用安装脚本、Git 依赖、远程 URL
v12.x2026 年下半年渐进式安全加固,社区适配

选型建议(2026 年)

场景推荐
新项目,快速启动npm — 零配置,随 Node.js 安装
大型 monorepo,磁盘敏感pnpm — 硬链接存储,安装快速
追求极致速度Bun — 原生最快安装
供应链安全优先npm v12 — 最激进的安全加固
已有 Yarn 项目Yarn 4 — 迁移成本最低
Node.js 25+ 环境npm — Corepack 移除后的直接选择

文档维护说明:本文档反映 2026 年 7 月的 npm 生态现状。npm v12 的发布标志着供应链安全进入新阶段,建议在 v12 正式发布后及时更新迁移指南部分。