写点什么

当你运行 npm run 命令时,会发生什么

  • 2022 年 5 月 13 日
  • 本文字数:1386 字

    阅读完需:约 5 分钟

本文分享自华为云社区《运行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 文件:

  "name": "angular-cli-xxxx-project",  "version": "0.0.0",  "scripts": {    "ng": "ng",    "start": "node ./src/index.js",    "build": "ng build",    "watch": "ng build --watch --configuration development",    "test": "ng test"  }
复制代码

那么,当我们运行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这样的命令了。


点击关注,第一时间了解华为云新鲜技术~​

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
当你运行npm run命令时,会发生什么_JavaScript_华为云开发者社区_InfoQ写作社区