利用npm内置命令构建脚本工具

npm 的内置生命周期脚本(Lifecycle Scripts)是一系列预定义的钩子,会在执行特定 npm 命令时自动触发 ,核心分为「核心命令钩子」「发布相关钩子」「安装/卸载钩子」等类别,且遵循 prexxx → xxx → postxxx 的执行顺序(如 prebuild → build → postbuild)。

以下是完整的内置生命周期脚本分类及说明:

一、核心命令钩子(最常用)

这类钩子对应 npm run <cmd>npm <cmd> 核心命令,是日常开发中最常使用的:

钩子名 触发时机 示例场景
pre<cmd> 执行 npm run <cmd> 前自动触发 prebuild → 执行 npm run build
post<cmd> 执行 npm run <cmd> 后自动触发 postbuild → 执行 npm run build
pretest 执行 npm test 前触发 测试前清理测试目录、校验环境
test 执行 npm test 时触发(需手动配置脚本) 运行单元测试(如 jest、mocha)
posttest 执行 npm test 后触发 测试后生成测试报告、清理临时文件
prestart 执行 npm start 前触发 启动前检查端口、初始化配置
start 执行 npm start 时触发(需手动配置) 启动项目(如 node server.js)
poststart 执行 npm start 后触发 启动后输出日志、发送健康检查
prestop 执行 npm stop 前触发 停止前保存进程状态
stop 执行 npm stop 时触发(需手动配置) 停止项目(如 kill 进程)
poststop 执行 npm stop 后触发 停止后清理资源
prerestart 执行 npm restart 前触发(= prestop + prestart) 重启前预处理
restart 执行 npm restart 时触发(= stop + start) 重启项目
postrestart 执行 npm restart 后触发(= poststop + poststart) 重启后校验

二、包发布相关钩子(npm publish)

这类钩子仅在发布 npm 包时触发,是发布流程的关键节点:

钩子名 触发时机
prepublish (已废弃,不推荐) 执行 npm publishnpm pack 前触发
prepare 替代 prepublish,执行 npm publish/npm pack/npm install 时触发
prepublishOnly 仅在 npm publish 前触发(不会在 npm install 时触发,推荐替代 prepublish)
prepack 执行 npm pack/npm publish 前触发(打包 tarball 前)
postpack 执行 npm pack/npm publish 后触发(打包 tarball 后)
publish/postpublish 执行 npm publish 成功后触发(发布到 npm 仓库后)

关键区别:

  • preparenpm install/publish/pack 都会触发(适合编译源码、生成产物);
  • prepublishOnly:仅 npm publish 触发(适合发布前校验、签名等)。

三、安装/卸载相关钩子(npm install/uninstall)

这类钩子在安装/卸载包(本地/全局)时触发,注意:仅对当前包生效,不影响依赖包

钩子名 触发时机
preinstall 执行 npm install 前触发(当前包安装前)
install/postinstall 执行 npm install 成功后触发(当前包安装后,适合编译二进制、初始化配置)
preuninstall 执行 npm uninstall 前触发(当前包卸载前)
uninstall/postuninstall 执行 npm uninstall 后触发(当前包卸载后,适合清理残留文件)
preversion 执行 npm version <newver> 前触发(修改版本号前,如校验版本格式)
version 执行 npm version <newver> 时触发(修改版本号后,如更新 CHANGELOG)
postversion 执行 npm version <newver> 后触发(修改版本号后,如提交 git 版本)

四、其他特殊钩子

钩子名 触发时机
audit 执行 npm audit 时触发(需手动配置,用于自定义审计逻辑)
preaudit/postaudit 执行 npm audit 前/后触发
fund 执行 npm fund 时触发(自定义开源资助信息展示)
ci 执行 npm ci 时触发(替代 npm install,适合 CI/CD 环境)
preci/postci 执行 npm ci 前/后触发

五、核心规则(必知)

  1. 执行顺序prexxx 失败 → xxxpostxxx 不会执行;prexxx 成功 → 执行 xxx → 无论 xxx 成功/失败,都会执行 postxxx(除非进程终止)。
  2. 自定义脚本兼容 :对自定义脚本(如 npm run build),自动生成 prebuild/postbuild 钩子,无需额外配置。
  3. 跨平台兼容 :Windows/macOS/Linux 通用,推荐使用 rimraf/mkdirp 替代系统命令(如 rm -rf/mkdir -p)。
  4. 优先级 :若手动配置了钩子脚本(如 package.json 中写了 "prebuild": "xxx"),则执行自定义逻辑;无配置则不执行。

六、实用示例(结合你的场景)

json 复制代码
{
  "scripts": {
    // 打包前清理旧产物
    "prebuild": "rimraf static-customer",
    // 打包 + 压缩
    "build": "father build && node scripts/zip-dist.js",
    // 打包后提示
    "postbuild": "echo '✅ 打包+压缩完成!'",
    // 发布前校验版本和产物
    "prepublishOnly": "npm run build && node scripts/check-publish.js",
    // 安装后初始化配置
    "postinstall": "node scripts/init-config.js"
  }
}

七、如何查看当前包的生命周期脚本

执行以下命令可列出当前项目已配置的所有生命周期脚本:

bash 复制代码
npm run ls

或查看完整的生命周期执行顺序:

bash 复制代码
npm help scripts

总结:日常开发中最常用的是 prexxx/postxxx(如 prebuild/postbuild)、发布相关的 prepare/prepublishOnly、安装相关的 postinstall,掌握这些即可覆盖 90% 的场景。

相关推荐
windliang14 小时前
Claude Code 源码分析(二):CC 的心脏 queryLoop Agent主循环
前端·ai编程·claude
Revolution6114 小时前
reactive 对象重新赋值后,表单为什么没有恢复默认值
前端·vue.js·面试
米饭同学i14 小时前
微信小程序 input maxlength 遇上输入法拼音被截断?这是最完整的解决方案
前端
董员外14 小时前
RAG 系统进化论(二):Naive RAG,检索增强生成的最小闭环
前端·人工智能·后端
JasonMa15314 小时前
从零搭建一个微信小程序活动管理平台(一):架构设计与技术选型
javascript·微信小程序·node.js
脾气有点小暴14 小时前
ECharts 伪 3D 柱状图完整注释 + 实现原理说明
前端·3d·信息可视化·vue·echarts
掘金一周14 小时前
看看大家每月的成本有多少 | 沸点周刊 7.30
前端·人工智能·后端
ji_shuke15 小时前
从零深入:基于 Playwright + Pytest + Allure 的企业级 Web 端到端自动化测试框架实战
前端·自动化测试·docker·jenkins·pytest·allure·playwright
陆枫Larry15 小时前
用 CSS Mask + background-color 给图标「换色」
前端
幼儿园技术家16 小时前
原来不用发版也可以做到版本更新
前端·js or ts