package.json文件的“scripts”属性支持许多内置脚本,及其预设的生命周期事件。特别是,当运行npm run <stage>这些命令时,也将运行其前置和后置命令…


一、npm scripts生命周期

1.install

npm install命令,更多参考 官网

当你运行 npm install -g <pkg name> 时,以下命令也会运行

  • preinstall
  • install
  • postinstall
  • prepublish
  • preprepare
  • prepare
  • postprepare

更多介绍,请参考 npm sscripts / life-cycle-operation-order


二、npm scripts常见问题

1. 如何封装【npm package在安装时自动执行】的脚本?

场景:在业务项目project_a安装npm package A时,自动执行npm package A内置的脚本,触发某些操作

方案:
package A的生命周期中定义脚本test,脚本test会在安装package A时自动执行

以上方案衍生出两个新的问题:

  • 触发时机:如何严格要求,是项目project_apostinstall时机,才去执行某些逻辑。package A自身安装的时候,自身不会触发内部定义的postinstall逻辑 —— 通过【环境变量】可解
  • 多包的安装执行时机:monorepo架构下,如何控制多包的安装执行时机?是否可以单独patch-package某个包?—— 【无解】,官方不支持单独patch某个包

以下是封装【package A在安装时自动执行脚本】的具体示例:

  • 1.在A包中,定义在【X生命周期】执行的脚本: 例如,在A包的package.json中定义postinstall脚本postinstall.js,脚本postinstall.js将在A包安装后运行

    A包的package.json:

    {
      "name": "A",
      "version": "1.0.0",
      "scripts": {
        "postinstall": "IS_PACKAGE_A=true node ./scripts/postinstall.js"
      },
      "main": "index.js"
    }
    
  • 2.编写postinstall.js脚本:A包中创建scripts/postinstall.js脚本文件

    使用环境变量或命令行参数,来判断是否要执行特定的逻辑。例如,scripts/postinstall.js中,通过检查环境变量IS_PACKAGE_A是否存在,来决定是否执行脚本中的逻辑

    // Check if the script is running in the context of project_a
    if (process.env.IS_PACKAGE_A) {
      console.log('Running postinstall script for project_a...');
    
      // Add your custom logic here
    } else {
      console.log('Skipping postinstall script for package A');
    }
    
  • 3.在业务项目project_a中安装A包,A包的postinstall脚本会自动运行

    cd /path/to/project_a
    npm install /path/to/A
    
  • 4.在业务项目project_a中监听生命周期事件:如果你希望在project_a中的 postinstall时机前后做一些清理操作,可在project_apackage.json中定义相应的生命周期脚本。

    • project_apackage.json
    {
      "name": "project_a",
      "version": "1.0.0",
      "scripts": {
        "prepostinstall": "echo 'Running pre-postinstall script for project_a...'",
        "postinstall": "echo 'Running postinstall script for project_a...' && node ./scripts/cleanup.js"
      },
      "dependencies": {
        "A": "file:../path/to/A"
      }
    }
    
    • project_ascripts/cleanup.js
    // This script will run after the package is installed
    console.log('Performing cleanup operations for project_a...');
    
  • 5.执行顺序:在project_a中安装A包时,脚本的执行顺序如下:
    i. project_aprepostinstall 脚本
    ii. A 包的 postinstall 脚本
    iii. project_apostinstall 脚本


参考


最后, 希望大家早日实现:成为编程高手的伟大梦想!
欢迎交流~

微信公众号

本文版权归原作者曜灵所有!未经允许,严禁转载!对非法转载者, 原作者保留采用法律手段追究的权利!
若需转载,请联系微信公众号:连先生有猫病,可获取作者联系方式!