npm生命周期钩子详解
npm在执行脚本时自动运行pre和post钩子,无需手动编排,实现构建流程自动化。
生命周期钩子
pre与post钩子
为任意自定义脚本添加pre/post前缀即可定义钩子:
JSON
{
"scripts": {
"prebuild": "echo '清理旧产物...' && rm -rf dist",
"build": "tsc",
"postbuild": "echo '构建完成'"
}
}
执行npm run build时,实际执行顺序为:prebuild → build → postbuild。
钩子执行规则
- pre钩子失败则主脚本不执行
- 主脚本失败则post钩子不执行
- 钩子脚本本身也是普通shell命令
- 可链式使用:prebuild → build → postbuild → postpostbuild
JSON
{
"scripts": {
"pretest": "npm run lint",
"test": "jest",
"posttest": "npm run coverage"
}
}
钩子失败会中断后续脚本。如果prebuild返回非零退出码,build不会执行。
内置生命周期事件
install相关
| 钩子 | 触发时机 |
|---|---|
| preinstall | npm install之前 |
| install | 安装时 |
| postinstall | npm install之后 |
| prepare | install后/publish前 |
JSON
{
"scripts": {
"postinstall": "node scripts/setup.js",
"prepare": "husky install"
}
}
publish相关
| 钩子 | 触发时机 |
|---|---|
| prepublishOnly | 仅publish前执行 |
| prepack | npm pack前 |
| postpack | npm pack后 |
| prepack | publish前打包 |
JSON
{
"scripts": {
"prepublishOnly": "npm test && npm run lint",
"prepack": "npm run build"
}
}
start与restart
| 钩子 | 触发时机 |
|---|---|
| prestart | npm start前 |
| start | 启动应用 |
| poststart | npm start后 |
| prerestart | npm restart前 |
prepare是最常用的内置钩子,husky等工具依赖它在install后初始化Git钩子。prepublishOnly比已废弃的prepublish更安全,仅在publish时触发。
要点总结
- pre/post钩子自动在主脚本前后执行,无需手动调用
- 钩子失败会中断后续脚本链
- postinstall和prepare是最常用的内置钩子
- prepublishOnly仅在npm publish时触发,避免误执行
- 内置生命周期事件覆盖install、publish、start等核心操作