当你运行 npm run 命令时,会发生什么
本文分享自华为云社区《运行npm run命令的时候会发生什么?》,作者:gentle_zhou 。
先前发了一篇“运行npm install命令的时候会发生什么?”的文章,解析了输入npm install
命令之后会发生什么的一系列过程。就有一些看过文章的小伙伴来问我,那么运行npm run
命令之后会发生什么呢,本文就来啦。
script 字段
当我们用 npm(node package manager)来管理 JavaScript/TypeScript 项目的时候,都会在项目的根目录下生成一个 package.json 文件。而这个文件里的 script 字段就是用于适配npm run XXX
命令的。举个例子,像下图里 package.json 文件:
那么,当我们运行npm run build
命令的时候,就会去 scripts 字段里找到build
对应的ng build
命令去执行。可能有小伙伴会问了,那为什么不能直接执行ng build
命令呢?因为这样会报错,操作系统里只有 npm 相关的命令,不存在ng build
这条命令;而我们在下载安装依赖的时候,会在 node_modules/.bin 目录下创建好名为 ng 的可执行文件:
.bin 这个目录并不是任何 npm 包,其目录底下的可执行文件都是一个个软链接;其余 node_modules 目录下的文件夹都是一个个下载下来的依赖模块。
而在.bin 目录下,一般针对一个依赖模块,会有 3 个可执行文件,没有后缀名的是对应 Unix 系的 shell 脚本,.cmd 为后缀名的是 windows bat 脚本,.ps1 为后缀名的则是 PowerShell 中可执行文件(可以跨平台),三者作用都是用 node 执行一个 js 文件。我们可以打开名为 ng 的这个文件,看看里面的内容:
由此,我们得知,当我们运行npm run build
命令的时候,虽然 ng 没有全局安装,但是 npm 会到./node_modules/.bin 目录里找到 ng.js 文件作为 node 脚本来执行,也就是相当于执行了./node_modules/.bin/ng build
命令(最后的 build 作为参数传入)。
那么为啥在执行 start 命令的时候,可以默认执行node server.js
命令呢?那是因为 node 是已经全局安装了,可以直接被调用。这里多一嘴,如果 scripts 字段里没有start
,也不会报错,会去默认执行node server.js
命令。
p.s.:如果我们只运行了npm run
命令,那么就会去执行 scripts 字段里所有的脚本命令。
.bin 目录下的软链接
我们继续往下看,既然.bin 目录下的执行文件是一个个软链接,那么这些软链接文件是哪里来的呢?npm 又是怎么知道这些软链接是指向哪里呢?
我们可以直接在项目根目录下的 package-lock.json 文件里搜索 ng.js,可以看到 npm 在 install 的时候,就将 bin/ng.js 作为 bin 声明了:
因此在 npm 安装的时候,就把 bin/ng.js 文件软链接到了./node_modules/.bin 目录下,而 npm 还会自动把 node_modules/.bin 加入 $PATH 变量内,这样 ng 就可以不用全局安装了,直接作为命令来运行、开发依赖程序。也就是说,软链接相当于是一种映射,在执行npm run xxx
的时候,就会到 node_modules/.bin 目录里找到对应的映射文件,然后再找到相对应的 js 文件来执行。
而如果我们想不用软链接的方式,直接使用全局安装的命令的话,我们就需要在安装包的时候,使用npm install -g xxx
来安装这个依赖,那么就会将 xxx 其中的 bin 文件加入到全局中;这样就可以和 node 一样,直接使用诸如xxx build
这样的命令了。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/aef31b9ba0083c8f80dc1cc27】。文章转载请联系作者。
评论