摘要:今天我们来聊一聊运行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. [Python急救站课程]蟒蛇的绘制

    Python的英文是有蟒蛇的意思,用Python画一条蟒蛇试试吧 一.普通蟒蛇的绘制 import turtle # 调用turtle(海龟绘图)加as t表示将库名改命名为t,后续用t.(函数名表式 ...

  2. vue 中引入pingfang字体 或者其他字体 支持ttf otf格式

    新建一个font 文件 里面放字体文件 可以百度搜索你想要的字体下载下来 一般10m左右 新建一个font.css 里面配置字体 @font-face {     font-family: 'PF'; ...

  3. 重学Java(二):对象无处不在

    前言 本系列文章内容来自于<Thinking in Java>作者的最新续作<On Java>基础卷,作者根据最新 Java 8.11.17的内容,重讲了Java的编程思想,值 ...

  4. C#12中的Collection expressions(集合表达式语法糖)

    C#12中引入了新的语法糖来创建常见的集合.并且可以使用..来解构集合,将其内联到另一个集合中. 支持的类型 数组类型,例如 int[]. System.Span<T> 和 System. ...

  5. Net 高级调试之十:轻量级代码生成的调试

    一.简介 今天是<Net 高级调试>的第十篇文章.说起来,高级调试,调试的内容还是挺多的,技巧也不少,但是,要想做一个合格的高级调试人员,还需要掌握如何调试动态生成的IL代码.今天要探讨的 ...

  6. Python输入某年某月某日,判断这一天是这一年的第几天?

    while 1: year = int(input('year:\n')) #输入年.月.日 month = int(input('month:\n')) day = int(input('day:\ ...

  7. CLion安装与配置教程

    一.下载并安装CLion 1.下载 1.官网: Download CLion 2.注意: 这里建议使用2021.1.3版本之前,为之后的使用便利而做打算. (这里以Windows系统为例,其他系统类似 ...

  8. jmeter测试计划中的“独立运行每个线程组”Demo演示

    一:jmeter的运行顺序 测试计划-->线程组 其次执行顺序为:配置元件.前置处理器.定时器.取样器.后置处理器.断言.监听器 当一个测试计划中有多个线程组,当多个线程组都是是执行状态时,就会 ...

  9. STM32外设:信号转换器 ADC、DAC

    主要外设: ADC:Analog to Digital Converter 模数转换器 DAC:Digital to Analog Converter 数模转换器 ADC_IN` 主要功能:测外部引脚 ...

  10. [cnn][julia]Flux实现卷积神经网络cnn预测手写MNIST

    julia_Flux 1.导入Flux.jl和其他所需工具包 using Flux, MLDatasets, Statistics using Flux: onehotbatch, onecold, ...