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

性能考虑

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

  • 避免阻塞操作

  • 考虑添加进度提示

相关推荐
登山者1 天前
npm发布报错急救手册:快速解决2FA与令牌问题
前端·npm
Asurplus1 天前
【VUE】15、安装包管理工具yarn
前端·vue.js·npm·node.js·yarn
fpl11161 天前
npm :无法加载文件 D:\...\nodejs\npm.ps1,因为在此系统上禁止运行脚本
前端·vscode·npm·node.js·命令模式
vipbic2 天前
解决npm publish的404/403和配置警告全记录
前端·npm·node.js
松莫莫2 天前
Windows 下使用 nvm 安装与管理 Node.js(完整指南)
windows·笔记·npm·node.js
LYFlied3 天前
幽灵依赖详解
npm·pnpm·打包工具·yarn·工程化·包管理工具·幽灵依赖
LYFlied3 天前
前端项目包管理器怎么选?
前端·面试·npm·pnpm·yarn·工程化·包管理器
几个高兴3 天前
npm证书过期
前端·npm·node.js
工业甲酰苯胺3 天前
npm几个实用命令
前端·npm·node.js