npm run 执行原理

193 阅读3分钟

1. npm run 执行原理

npm run 命令的原理是执行 package.json 文件中定义的脚本。当你在命令行中运行 npm run 时,npm 会查找 package.json 文件中的 scripts 字段,然后执行对应的脚本命令。

2. 示例

输入图片说明

2.1 以 dev:weapp 为例

  1. 运行 npm run dev:weapp 命令;
  2. npm 会查找 package.json 文件中的 scripts 的 dev:weapp;
  3. 由于配置的命令是 "dev:weapp": "npm run build:weapp -- --watch";
  4. 因此执行 npm run build:weapp -- --watch 命令;
  5. npm 会查找 package.json 文件中的 scripts 的 build:weapp;
  6. 由于配置的命令是 "build:weapp": "taro build --type weapp";
  7. 因此执行 taro build --type weapp 命令;
  8. 最后使用 taro 进行打包。

2.2 查看命令执行流程

输入图片说明

3. taro 脚本查找规则

  1. 从当前项目的 node_modules/.bin 去查找可执行命令 taro;
  2. 从全局的 node_modules 去找可执行命令 taro;
  3. 从环境变量中查找;
  4. 上边三步都没找到,就进行报错。

3.1 当前 .bin 的 taro

输入图片说明

3.2 全局 taro

3.3 环境变量

输入图片说明

3.4 报错

输入图片说明

4. npm 特殊脚本

在 npm 脚本中,pre 和 post 脚本是特殊的脚本,它们会在主脚本执行之前或之后自动执行。

如果你有一个 build 脚本,你可以定义一个 prebuild 脚本,它会在 build 脚本执行之前运行。

4.1 创建脚本生命周期

由于在 npm 中,pre 和 post 是特殊的前缀,用于定义在某个脚本执行之前或之后自动运行的脚本。这些前缀可以与任何自定义脚本结合使用,以创建一个脚本执行的生命周期。

4.2 测试 pre

输入图片说明

4.3 命令

"prebuild:weapp:test": "node ./config/node_npm.js --env=test",
"build:weapp:test": "taro build --type weapp",
"dev:weapp:test": "npm run build:weapp:test -- --watch",

4.4 说明

  1. 执行 dev:weapp:test 命令;
  2. 执行 build:weapp:test 主命令前先执行 prebuild:weapp:test;
  3. 再执行 build:weapp:test 命令。

5. 创建脚本生命周期总结

创建脚本生命周期后,我们就可以在执行打包命令前,执行我们自己开发的脚本,然后再执行打包。比如上边示例,就是我通过脚本命令传递参数,来决定当前项目运行的测试接口环境还是正式接口环境。通过命令简化每次切换接口环境需要人工手动改写。

6. 参数的传递与获取

上边示例中的 --watch 和 --env=test 都是我们通过命令传递给脚本的参数,在我们写的脚本中,可以获取对应的参数来决定脚本的一些执行逻辑。

6.1 获取参数

const args = process.argv.slice(2);
const env = args.find(arg => arg.startsWith('--env='));

6.2 执行结果

输入图片说明

7. 总结

  1. npm run 的执行原理,查找 package.json 文件中的 scripts 字段,然后执行对应的脚本命令。
  2. 脚本执行的查找规则:当前 .bin > 全局 node_modules > 环境变量 > 报错。
  3. 使用特殊的脚本前缀,创建脚本执行生命周期,可以在主命令执行之前或者之后完成我们自己的脚本。
  4. 通过脚本命令传递参数,使用参数来决定脚本的执行逻辑,参数获取。