摘要:今天我们来聊一聊运行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文件:

  "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这样的命令了。

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

当你运行npm run命令时,会发生什么?的更多相关文章

  1. Vue运行npm run dev 时修改端口

    进入项目文件的config文件夹E:\myapp\myproject\config,找到index.js,修改里面的8080端口,改成8088(确定不被别的程序使用的都可以)

  2. 在mac下运行 npm run eject 出现报错问题解决方法

    当使用create-react-app创建项目后,接着运行npm run eject时,如果出现下面的错误 可能是脚手架添加了.gitignore这个文件,但是没有本地仓库,可以使用以下代码解决这个问 ...

  3. mpvue使用vant Weapp运行npm run build命令打包后失效

    最近在使用mpvue开发微信小程序,在开发过程中使用有赞的小程序ui框架—— vant Weapp ,至于如何使用在我个人博客中有一篇关于如何使用vant Weapp ,需要的同学请点进这里自行查看. ...

  4. sudo 运行 npm或node时,出现找不到命令

    sudo 运行 npm或node时,出现找不到命令的情况,运行下面这些命令, sudo ln -s /usr/local/bin/node /usr/bin/node sudo ln -s /usr/ ...

  5. react 记录:运行npm run eject命令暴露配置文件都报这个错误

    问题: react 使用create-react-app命令创建一个项目,运行npm run eject命令暴露配置文件都报这个错误 原因:主要是脚手架添加 .gitgnore文件,但是却没有本地仓库 ...

  6. create-react-app创建项目后运行npm run eject命令报错解决办法

    最近在用create-react-app创建项目,因要配置各种组件,比如babel,antd等, 需要运行npm run eject命令把项目的配置文件暴露出来,但是还是一如既然碰到报错,因为是在本地 ...

  7. react创建项目后运行npm run eject命令将配置文件暴露出来时报错解决方法

    最近在用create-react-app创建项目,因要配置各种组件,比如babel,antd等, 需要运行npm run eject命令把项目的配置文件暴露出来,但是还是一如既然碰到报错,因为是在本地 ...

  8. 运行npm install命令的时候会发生什么?

    摘要:我们日常在下载第三方依赖的时候,都会用到一个命令npm install,那么你知道,在运行这个命令的时候都会发生什么吗? 本文分享自华为云社区<运行npm install命令的时候会发生什 ...

  9. 当运行npm install 命令的时候带上ignore-scripts,会发生什么?

    摘要:运行npm install 命令的时候带上ignore-scripts, 可以避免一个恶意包里的病毒. 本文分享自华为云社区<运行npm install 命令的时候带上--ignore-s ...

  10. 三面面试官:运行 npm run xxx 的时候发生了什么?

    事情是这样的,直接开讲 面试官:npm run xxx的时候,发生了什么?讲的越详细越好. 我(心想,简单啊): 首先,DNS 解析,将域名解析成 IP 地址,然后 TCP 连接,TCP 三次握手.. ...

随机推荐

  1. 18. 从零开始编写一个类nginx工具, 主动式健康检查源码实现

    wmproxy wmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感 ...

  2. Stride游戏引擎试毒

    想找别的引擎用, 主要还是因为unity和国内盗版用户的互相伤害, 就算用免费的个人版也要不停的验证. stride引擎, 原名xenko, 再原名paradox... 一开始是日本厂商开发的引擎, ...

  3. 创建一个自己的 Linux系统

    简单来说就是一个文件传递的机制,首先创建/安装一个硬盘,然后把前硬盘中的一部分文件先转移到Linux系统上,再通过Linux系统转移到创建的新硬盘,之后用虚拟机,把新硬盘装在其中,就可以在新硬盘上做到 ...

  4. Go语言基准测试(benchmark)三部曲之一:基础篇

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于基准测试(benchmark) Go的标准库内置的 ...

  5. 手撕Vuex-实现actions方法

    经过上一篇章介绍,完成了实现 mutations 的功能,那么接下来本篇将会实现 actions 的功能. 本篇我先介绍一下 actions 的作用,然后再介绍一下实现的思路,最后再实现代码. act ...

  6. URL, URI 和 URN 之间的区别

    英文原文:What's the difference between a URI and a URL?  URI 标识一个事物 , URL 定位一个事物:然而,位置同样可以标识一个事物,所以,每个 U ...

  7. AI歌姬,C位出道,基于PaddleHub/Diffsinger实现音频歌声合成操作(Python3.10)

    懂乐理的音乐专业人士可以通过写乐谱并通过乐器演奏来展示他们的音乐创意和构思,但不识谱的素人如果也想跨界玩儿音乐,那么门槛儿就有点高了.但随着人工智能技术的快速迭代,现在任何一个人都可以成为" ...

  8. 记录jdk17相对于jdk8增加的一下主要语法糖和新特性

    jdk17 发布已经好久了,作为java的长期支持版本,引入了许多有趣且实用的新特性.这些特性不仅提高了开发效率,还增强了语言的表现力和安全性.并且是SpringBoot 3.0以后版本的硬性要求,之 ...

  9. 大立科技DM63红外相机SDK开发Ⅱ-获取仪器红外图像

    目录 1.开发准备 2.导入头文件 3.数据初始化 4.获取红外图像 5.关闭红外图像 6.完整代码 1.开发准备 为了方便发开,需要下载Visual Studio,本开发基于Visual Studi ...

  10. python,opencv-python人脸识别,并且发邮件对镜头前未知人员进行报警

    我们在任意一个硬盘的根目录下创建一个Code-project文件夹 在该文件夹下分别创建C-project和Python-project文件夹 在Python-project文件夹下创建face re ...