Node.js 开发手册NODE.JS

CHAPTER 04工程化 · PACKAGING

npm 与包管理

package.json、语义化版本、依赖类型、npx 与 workspaces。让项目可复现、可协作、可发布。

开始阅读难度中级先修第一章约1.5小时
04.1

package.json 结构

package.json 是项目的身份证与清单:名称、版本、入口、依赖、脚本。它是 npm 安装与运行的根依据。

{
  "name": "my-api",
  "version": "1.0.0",
  "type": "module",
  "main": "dist/index.js",
  "scripts": { "start": "node .", "dev": "node --watch ." },
  "dependencies": { "express": "^4.19.2" },
  "devDependencies": { "vitest": "^1.6.0" }
}
type 字段

设为 "module" 后,.js 被视为 ESM;否则是 CommonJS。新项目建议 ESM。

04.2

语义化版本

版本号 MAJOR.MINOR.PATCH。npm 用符号控制升级范围:^ 允许兼容的 MINOR/PATCH,~ 只允许 PATCH,* 任意。

写法可升级到适用
^1.2.31.x.x 最新常规依赖(向下兼容)
~1.2.31.2.x 最新谨慎、仅补丁
1.2.3仅此版本锁定(配合 lockfile)
永远提交 lockfile

package-lock.json 锁定依赖树,保证 CI 与本地一致。务必提交到版本库。

04.3

依赖类型

dependencies 是运行必需;devDependencies 仅开发/构建/测试用;peerDependencies 由宿主提供(库常用)。

npm i express            # 写入 dependencies
npm i -D vitest          # 写入 devDependencies
npm i -P react           # 写入 peerDependencies
04.4

scripts 与生命周期

scripts 把常用命令固化。pre/post 前缀钩子会在同名脚本前后自动执行(如 prestart)。

{
  "scripts": {
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node dist/index.js",
    "test": "vitest run"
  }
}
04.5

npx 与可执行

npx 临时下载并运行某个包的可执行文件,无需全局安装。bin 字段声明的命令会被安装到 node_modules/.bin。

npx create-vite@latest my-app   # 一次性脚手架
npm i -g pino-pretty             # 全局安装(谨慎)
npx pino-pretty < app.log       # 用本地/临时 bin
少用全局安装

全局包难以锁定版本、易团队不一致。优先 npx 或项目内 npm run 调用本地 bin。

04.6

workspaces 单体仓库

workspaces 让一个仓库包含多个包,共享顶层 node_modules,适合库 + 应用同仓管理。

{
  "name": "monorepo",
  "private": true,
  "workspaces": ["packages/*"]
}
npm install            # 一次性安装所有 workspace 依赖
npm run build -w @org/ui   # 只构建 ui 包
04.7

发布与私有源

用 npm publish 发布到 registry。企业内部可指向私有源(如 Verdaccio、Nexus)。

npm version patch      # 自增版本号并提交
npm publish --access public
npm config set registry https://私服地址
别发布密钥

用 .npmignore 或 files 字段限制发布内容;.env 与 node_modules 绝不能进包。

04.8

常见陷阱与 FAQ

dependencies 和 devDependencies 混淆会怎样?

把运行必需的放进 dev 会导致生产 npm install --production 缺依赖而崩溃;把仅测试用的放进 dependencies 会膨胀生产镜像。

lockfile 该不该提交?

必须提交。它是可复现安装的关键,CI 应使用 npm ci 严格按 lockfile 安装。

peerDependencies 是干什么的?

声明"我的库需要宿主提供某个版本",例如 React 组件库声明 peer react。避免重复打包 React 多份。

04.9

实战练习与资源

延伸资源