前端面试之输入npm run后执行原理
作者:小胖子学习笔记 发布时间:2024-05-05 09:21:55
引言
在前端开发的工作当中,使用 npm run dev
的命令启动本地开发环境,是再正常不过的事了。那么,当输入完类似 npm run xxx
的命令后,究竟是如何触发各种构建工具的构建命令以及启动 Node 服务等功能的呢?
首先我们知道,Node 作为 JavaScript 的运行时,可以把 .js
文件当做脚本来运行,像这种:
node index.js
当我们使用 npm
来管理项目(或者 yarn
)时,会在根目录下生成一个 package.json
文件,其中的 scripts
属性,就是用于配置 npm run xxx
命令的,比如我有如下配置:
// package.json
{
// ...
"scripts": {
"start": "node ./src/index.js",
"build": "react-scripts build",
},
// ...
}
当执行 npm start
时,对于 npm
来说,相当于执行 npm run start
,则映射为 scripts
属性下的 start
命令,即
npm start
# 相当于
npm run start
# 相当于
node ./src/index.js
这个比较好理解,就是直接使用全局安装的 Node 命令来执行了 ./src
目录下的 index.js
文件而已。
如上面类似,执行 npm run build
即相当于执行 react-scripts build
命令。这个命令,是使用 create-react-app
搭建 React 项目时默认配置的。与 Node 不同,react-scripts
并没有全局安装,怎么就能直接执行呢?
这时我们不妨看一下,使用 create-react-app
搭建的项目(使用 vue-cli
搭建的项目也一样),在 npm install
后,其 node_modules
目录下面的样子:
如图可以看到有一个 .bin
目录,这个目录不是任何一个 npm
包。目录下的文件,右面都有一个小箭头(VS Code 上这样显示),表示这是一个软链接,打开文件可以看到文件顶部写着 #!/user/bin/env node
,表示这是一个通过使用 Node 执行的脚本。
由此我们可以知道,当使用 npm run build
执行 react-scripts build
时,虽然没有安装 react-scripts
的全局命令,但是 npm
会到 ./node_modules/.bin
中找到 react-scripts.js
文件作为 Node 脚本来执行,则相当于执行了 ./node_modules/.bin/react-scripts build
(最后的 build
作为参数传入)。
npm run build
# 相当于
./node_modules/.bin/react-scripts build
前面说过,react-scripts
是一个软链接,那么它的指向是哪里,又是怎么来的呢?
我们可以在 node_modules
目录下,直接找到 react-scripts
包,查看其目录结构和 package.json
如下:
从 package.json
中可知,这个包将 ./bin/react-scripts.js
作为 bin
声明了。所以在 npm install
时,npm
读到该配置后,就将该文件软链接到 ./node_modules/.bin
目录下,而 npm
还会自动把node_modules/.bin加入$PATH,这样就可以直接作为命令运行依赖程序和开发依赖程序,不用全局安装了。
假如我们在安装包时,使用 npm install -g xxx
来安装,那么会将其中的 bin
文件加入到全局,比如 create-react-app
和 vue-cli
,在全局安装后,就可以直接使用如 vue-cli projectName
这样的命令来创建项目了。
来源:https://juejin.cn/post/6971723285138505765


猜你喜欢
- iniconf博主前两天在写一个小的go语言项目,想找一个读取ini格式配置和的三方库,在网上找了一圈感觉都不是很好用, 使用起来非常的奇怪
- 调用时输入参数如: www.jb51.net/表示删除www.jb51.net首页的缓存, www.jb51.net/test.
- 今天主题是实现并发服务器,实现方法有多种版本,先从简单的单进程代码实现到多进程,多线程的实现,最终引入一些高级模块来实现并发TCP服务器。说
- 今天在编写PHPDoc的导出文档的时候发现一个很郁闷的错误,虽然这个warning不是什么重要错误,但是看着总是很不爽的。于是就去网上找了很
- 1:在终端下:mysql -V。 以下是代码片段:[shengting@login ~]$ mysql -Vmysql Ver 14.7 D
- python jenkins 打包构建代码# pip install python-jenkinsimport jenkinsimport
- 由于pytorch的whl 安装包名字都一样,所以我们很难区分到底是基于cuda 的哪个版本。有一条指令可以查看import torchpr
- Python读写文件模式 1、r 打开只读文件,该文件必须存在。 2、r+ 打开可读写的文件,该文件必须存在。 3、w 打开只写文件,若文件
- import urllib.parse,os.path,time,sysfrom http.client import HTTPSConne
- Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。r.set('2', '4028b2883
- 前言相比大家都听过自动化生产线、自动化办公等词汇,在没有人工干预的情况下,机器可以自己完成各项任务,这大大提升了工作效率。编程世界里有各种各
- 一个XML文档如果符合一些基本的规范,那它就是结构规范的。XML格式有一套比HTML简单的解析规则,允许XML解析器不需要外部描述或了解数据
- 在这篇文章中,我们将分析一个网络爬虫。网络爬虫是一个扫描网络内容并记录其有用信息的工具。它能打开一大堆网页,分析每个页面的内容以便寻找所有感
- 每天急匆匆赶地铁上班的时候总会一不小心就会忘记打卡,尤其是软件打卡,那有没有什么办法可以解决忘打卡的问题呢?今天给大家推荐一下一款神器,利用
- 写一个简单的例子程序:# coding:utf-8import flaskfrom flask import json, jsonify,
- 我们都知道 Python 中else的基本用法是在条件控制语句中的 if...elif...else...,但是 else 还有两个其它的用
- GIT作为源码管理的方式现在是越来越流行了,在VisualStudio 2012中,就通过插件的现实对GIT进行了官方支持,并且这个插件在V
- 我就废话不多说了,直接上代码吧!>>> import torch>>> from torch.autog
- 使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体,打包位置是
- 本文实例讲述了Python3.5迭代器与生成器用法。分享给大家供大家参考,具体如下:1、列表生成式通过列表生成式可以直接创建一个列表。代码: