你知道的npm-scripts生命周期

26,551 阅读3分钟

大家都知道, package.json 中的"scripts" 字段非常强大,比如我们常用的npm run buildnpm run test之类的脚本,我们可以使用这些npm scripts进行常规的打包、单元测试、lint等等。

大多数人对于npm scripts的了解仅限于此,实际上npm scripts还有生命周期的概念,借助官方提供的这些生命周期可以实现非常多的功能。

1、Pre & Post Scripts

prepost是最常见的生命周期钩子,这俩个钩子的含义也非常简单

pre: 在xx脚本之前

post: 在xx脚本之后

{
  "scripts": {
    "preinstall": "node ./beforeInstall.js",
    "postinstall": "node ./afterInstall.js"
  }
}

比如最常见的,我们在package.json中的scripts字段中添加上面俩段。

所以当我们在安装项目依赖的时候

npm install | yarn

首先会执行preinstall脚本,按照上面的案例也就是node执行beforeInstall.js。至于beforeInstall.js文件什么内容,实现什么功能,全靠你的想象力,只能是这个想象空间非常巨大,比方说我们可以解决lock文件和依赖小版本自动升级的矛盾之类的问题,解决一些狗血的依赖关系问题。

然后preinstall.js中代码执行完毕之后,开始执行正常的依赖安装命令npm i | yarn

在依赖安装完成之后,触发了postinstall钩子,也就是去执行afterInstall.js代码。

当然,除了install这种npm内置命令之外,prepost钩子也支持那些npm scripts中自定义脚本。

{
  "scripts": {
    "lint": "lint-staged",
    "test": "jest",
    "compiler": "webpack",
    "precompiler": "npm run lint && npm run test",
    "postcompiler": "node ./afterBuild.js"
  }
}

比如这里的案例precompilerpostcompiler(这里故意不使用build,防止有些同学误认为build也是npm内置命令)

当然,上面scripts中的linttestcompiler全部都可以加上prepost钩子,具体使用就不详细说明了。

2、Life Cycle Scripts

除了上面的常用的prepost钩子之外,还有一些特殊的钩子(生命周期脚本),这些特殊的钩子只是会在特定的场景触发。这些钩子可以理解就是npm官方提供的特殊生命周期脚本,具体的如下:

  • prepare, prepublish, prepublishOnly, prepack, postpack

prepare (npm@4.0.0之后)

这个钩子触发的场景有很多,具体如下:

  • npm pack命令之前执行

    这里简单的介绍下npm pack命令,这个命令大家都不常用,实际上是官方提供的,给大家本地测试待发布的包,简单的说就是执行npm pack之后,会生成一个.tgz文件,和发布到npm仓库的一致,然后我们可以其他项目对其进行本地测试,简单的添加一下依赖即可:

    "dependencies": {
      "some-module": "file:~/some-module-1.0.0.tgz"
    }
    
  • npm publish命令之前执行

  • 在本地npm install命令之前 执行(但是npm install不能带其他参数)

  • prepublish之后, 在 prepublishOnly之前执行

prepublish (已弃用)

  • prepare一致

    为啥被弃用了,官方有解释,具体不详细说明,有兴趣自己看官方文档

prepublishOnly

  • npm publish 之前执行

prepack

  • npm pack之前和npm publish还有安装git依赖之前执行

    这里面npm publish命令也会触发npm pack命令,也就是说实际上你在发布一个包到npm仓库之前,首先会在本地进行进行打包(.tgz包)

  • NOTE: "npm run pack" 和 "npm pack"不同. "npm run pack" 用户自定义脚本, 而 "npm pack" 官方提供的命令

postpack

  • npm pack之后执行。

3、Life Cycle Operation Order

直接从官方搬运,也就是说官方提供的命令的相关的生命周期脚本执行顺序

npm publish

  • prepublishOnly
  • prepare
  • prepublish
  • publish
  • postpublish

npm pack

  • prepack
  • postpack

npm install

  • preinstall
  • install
  • postinstall

Also triggers

  • prepublish (when on local)
  • prepare (when on local)

npm start

npm run start has an npm start shorthand.

  • prestart
  • start
  • poststart