npm run xxx的时候发生了什么?

320 阅读2分钟

npm run xxx,实际上是找到package.json中的script,执行了对应的命令。

{ 
    "scripts": { 
        "serve": "vue-cli-service serve",
        "build": "vue-cli-service build",
        "lint": "vue-cli-service lint"
    }
}

问答

问:为什么不直接执行vue-cli-service serve

答:直接执行vue-cli-service serve,会报错,因为操作系统中没有存在vue-cli-service这一条指令。

问:既然没有vue-cli-service这条指令,那为什么npm run serve可以找到,且执行成功?

答:我们在安装依赖的时候,是通过npm i xxx 来执行的,例如 npm i @vue/cli-service,npm 在安装这个依赖的时候,就会在node_modules/.bin/ 目录中创建好名为vue-cli-service 的几个可执行文件。

当使用 npm run serve 执行 vue-cli-service serve 时,虽然没有安装 vue-cli-service的全局命令,但是 npm 会到 ./node_modules/.bin 中找到 vue-cli-service 文件作为 脚本来执行,则相当于执行了 ./node_modules/.bin/vue-cli-service serve(最后的 serve 作为参数传入)。

npm install 时,npm 读到package-lock.json中的配置后,就将相应的文件软链接到 ./node_modules/.bin 目录下,而 npm 还会自动把node_modules/.bin加入$PATH,这样就可以直接作为命令运行依赖程序和开发依赖程序,不用全局安装了。

假如我们在安装包时,使用 npm install -g xxx 来安装,那么会将其中的 bin 文件加入到全局,比如 create-react-app 和 vue-cli ,在全局安装后,就可以直接使用如 vue-cli projectName 这样的命令来创建项目了。

总结

  1. 运行 npm run xxx的时候,npm 会先在当前目录的 node_modules/.bin 查找要执行的程序,如果找到则运行;
  2. 没有找到则从全局的 node_modules/.bin 中查找,npm i -g xxx就是安装到到全局目录;
  3. 如果全局目录还是没找到,那么就从 path 环境变量中查找有没有其他同名的可执行程序。

原文

juejin.cn/post/707892…