npm 完整生命周期脚本及特点

npm 完整生命周期脚本及特点

生命周期脚本 触发时机 执行次数 主要用途 示例 特点与注意事项
preinstall npm install 执行 每次安装 环境检查、前置依赖安装 "preinstall": "check-node-version" 1. 在依赖下载前执行 2. 适合系统检查 3. 不要安装项目依赖
install 依赖安装过程中 自动 (很少手动定义) - npm 内部使用,一般不需要定义
postinstall 依赖安装完成后 每次安装 编译原生模块、生成配置文件 "postinstall": "node-gyp rebuild" 1. 用户安装后运行 2. 适合二进制编译 3. 用户可见
prepare 1. npm install 后 2. npm publish 前 3. npm pack 多次 构建任务、Git 钩子安装 "prepare": "husky install" 最常用 1. 保证发布前构建 2. 本地开发也执行 3. 推荐用于构建
prepublish npm publish 前(已废弃) 发布时 向后兼容 "prepublish": "echo 'deprecated'" npm@4 后废弃prepare 替代
prepublishOnly npm publish 发布时 发布前的专用检查 "prepublishOnly": "npm test" 1. 仅发布时运行 2. 适合运行测试 3. 不干扰开发
prepack npm packnpm publish 前(打包前) 打包时 准备打包文件 "prepack": "clean-dist-folder" 1. 在创建 tarball 前 2. 可修改打包内容
postpack 创建 tarball 后 打包时 清理临时文件 "postpack": "rm -rf ./temp" 打包后的清理工作
preprepare prepare 之前 依赖 prepare 极少使用 - 几乎不需要
postprepare prepare 之后 依赖 prepare 极少使用 - 几乎不需要
prestart npm start 每次启动 启动前准备 "prestart": "npm run build" 启动应用前的准备
poststart npm start 每次启动 启动后处理 "poststart": "echo 'App started'" 启动后的通知等
prerestart npm restart 重启时 重启前操作 - 很少使用
restart npm restart 重启时 自定义重启逻辑 - 覆盖默认重启行为
postrestart npm restart 重启时 重启后操作 - 很少使用

执行顺序流程图


常用场景对比

🛠️ 开发环境设置

选择 理由
prepare (推荐) 保证开发者和 CI 环境一致性
postinstall 如果只需要用户安装后运行

📦 包发布流程

脚本 用途
prepublishOnly 运行测试,确保发布质量
prepare 构建生产代码
prepack 最终调整打包内容

🔧 原生模块编译

选择 理由
postinstall 用户安装后需要编译(如 node-gyp)

实用示例配置

json

复制代码
{
  "scripts": {
    // 开发相关
    "preinstall": "npx only-allow pnpm",
    "postinstall": "npm run build:addons",
    "prepare": "husky install && npm run build",
    
    // 构建相关
    "build": "tsc",
    "build:addons": "node-gyp rebuild",
    
    // 测试相关
    "test": "jest",
    "prepublishOnly": "npm run test && npm run build",
    
    // 启动相关
    "prestart": "npm run build",
    "start": "node dist/index.js",
    
    // 打包相关
    "prepack": "npm run clean-dist",
    "pack": "npm pack"
  }
}

重要注意事项

  1. prepare vs postinstall

    • 对于包开发者 :用 prepare(保证发布前构建)

    • 对于包使用者postinstall 会在安装后运行

    • 对于构建工具 :用 prepare(如 Husky、TypeScript 编译)


避免的陷阱

  • ❌ 不要在 preinstall 中安装项目依赖

  • ❌ 避免 prepare 中有副作用(应幂等)

  • prepublishOnly 只用于发布相关任务


环境变量

bash

复制代码
# 判断是否在生产环境
if [ "$NODE_ENV" = "production" ]; then
  # 生产环境逻辑
fi

# 判断是否是 CI 环境
if [ "$CI" = "true" ]; then
  # CI 环境逻辑
fi

性能考虑

  • 生命周期脚本应尽量快速

  • 避免阻塞操作

  • 考虑添加进度提示

相关推荐
C_心欲无痕13 小时前
nodejs - pnpm解决幽灵依赖
前端·缓存·npm·node.js
C_心欲无痕14 小时前
nodejs - npm serve
前端·npm·node.js
‿hhh1 天前
综合交通运行协调与应急指挥平台项目说明
java·ajax·npm·json·需求分析·个人开发·规格说明书
ChangYan.1 天前
直接下载源码但是执行npm run compile后报错
前端·npm·node.js
C_心欲无痕1 天前
nodejs - npm run原理
前端·npm·node.js
C_心欲无痕1 天前
nodejs - npm和package.json文件解析
前端·npm·json
A_one20101 天前
利用npm内置命令构建脚本工具
前端·npm·node.js
青衫折扇2 天前
执行 npm 安装命令时,包被装到了 C 盘用户目录下,而非项目根目录
前端·npm·node.js
青春不败 177-3266-05202 天前
基于OpenLCA、GREET、R语言的生命周期评价方法、模型构建及典型案例应用
生命周期
小徐_23333 天前
2025 前端开源三年,npm 发包卡我半天
前端·npm·github