最新要闻
- 前沿资讯!科考中的意外收获!中国科学家在非洲发现消失百余年的濒危植物
- 天天速读:极氪001再遭奇葩故障:中控黑了、仪表花了、HUD“涂马赛克”
- 刚买两个月的谷歌Pixel 7 Pro翻车:绿屏无响应 用户绝望了
- 世界今头条!《和平精英》将推出开放世界玩法“绿洲世界” 能发射火箭
- 焦点信息:连过三科!新疆小伙1天拿到驾驶证
- 全球即时看!方正证券研究报告:行到水穷处,坐看云起时
- 环球快资讯丨不怕零下40℃极寒!我国复兴号高寒智能动车组投入运行
- 天天播报:为防员工摸鱼办公桌旁装监控 员工:很无语、感觉没隐私
- 《王者荣耀》花木兰新皮肤明日上线:143元 美背歌姬
- 世界时讯:海底捞回应禁止自带菜:可自带酒水饮品
- 天天短讯!RTX 4090高画质如何?《原子之心》PC平台性能分析:多配置流畅运行
- 全球快播:联想首款GeekPro游戏本真机公布:1TB SSD 超高性价比
- 环球微头条丨我国研发人员总量稳居世界首位 顶尖科技人才加速涌现
- 跑着跑着天窗会掉 奔驰中国召回超2万辆汽车
- 68岁成龙18年后再拍《神话2》 定名《传说》 古力娜扎主演
- 观速讯丨外卖员穿工装禁入成都高端商场 成都SKP回应:内部规定
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当前最新:记录--前端项目中运行 npm run xxx 的时候发生了什么?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
npm 是 node 捆绑的依赖管理器,常用程度可想而知。那么你每天都在 npm/yarn run 的命令到底是如何运行项目的呢?
前端项目中运行 npm run xxx 的时候发生了什么?大家都知道目前的 node 是捆绑 npm 的。npm 是 node 的依赖管理器,虽然它不是唯一的选择,我们还有 pnpm/yarn/cnpm/ni 。
但是,的依赖管理器都是在解决 npm 的某个痛点。对于 npm 依赖声明文件
(资料图)
package.json
本身是基本没有变化的。
例如我们可以使用
npm run serve
运行某个命令, 也可以使用
yarn serve
运行某个命令。
可以看到在这个地方 yarn 可以省略 run 这个参数。
但是,他们都只是对
package.json
进行解析而已,例如下面的文件,当运行
npm run serve
时,其实就是运行该 json 文件中的
scripts
下的
serve
键对应的命令。
{"name": "h5","version": "1.0.7","private": true,"scripts": {"serve": "vue-cli-service serve" },"dependencies": {"axios": "^0.19.2","vuex": "^3.4.0" },"devDependencies": {"node-sass": "^4.12.0" }}
上面说是 命令 只是用于方便理解,例如:
npm run server# 类似于在命令行运行以下命令vue-cli-service serve
通过 npm run 与直接运行命令的区别
还是用上面的配置来描述:
{"scripts": {"serve": "vue-cli-service serve" }}
npm 在运行
vue-cli-service serve
这条命令的时候,会先在当前
node_modules/.bin
下面看有没有同名的可执行文件,如果有,则使用其运行。
这里我们可以打开这个目录看看:
如果直接在命令行中运行
vue-cli-service serve
这条命令,是不会从 node_modules 中查找可执行程序的。
运行可执行文件
那么什么叫可执行文件呢?上面的图中有很多个同名的 vue-cli-service ,到底是运行哪个?
我们先来分析这几个文件怎么来的?
例如
@vue/cli-service
有以下
package.json
文件,注意 bin 字段,当我们运行
npm i @vue/cli-service
这条命令时,npm 就会在
node_modules/.bin/
目录中创建好以
vue-cli-service
为名的几个可执行文件了。
{"name": "@vue/cli-service","version": "4.4.6","description": "local service for vue-cli projects","main": "lib/Service.js","typings": "types/index.d.ts","bin": {"vue-cli-service": "bin/vue-cli-service.js" }}
对于可执行这个定义,每个系统不一样。在 windows 系统上,可执行文件是通过组策略和环境变量决定的。
使用
set pathext
可以查看
pathext
这个环境变量,他定义了可以作为可执行文件的后缀。
# 查看可执行文件后缀set pathext
由上面的配置可以发现,我们常见的 exe 也在其中,这个可执行文件在 windows 上,在命令行中输入文件名或双击时即可以运行。
在 unix 系统上面,是通过设置文件的属性为可执行,再在文件中的第一行声明解释器来运行的。
如果我们在 cmd 里运行的时候,windows 一般是调用了
vue-cli-service.cmd
这个文件,这是 windows 下的批处理脚本:
@ECHO offSETLOCALCALL :find_dp0SET _maybeQuote="IF EXIST "%dp0%\node.exe" ( SET "_prog=%dp0%\node.exe") ELSE ( SET _maybeQuote= SET "_prog=node" SET PATHEXT=%PATHEXT:;.JS;=;%)%_maybeQuote%%_prog%%_maybeQuote% "%dp0%\..\_@vue_cli-service@4.4.6@@vue\cli-service\bin\vue-cli-service.js" %*ENDLOCALEXIT /b %errorlevel%:find_dp0SET dp0=%~dp0EXIT /b
所以当我们运行
vue-cli-service serve
这条命令的时候,就相当于运行
node_modules/.bin/vue-cli-service.cmd serve
然后这个脚本会使用 node 去运行
vue-cli-service.js
这个 js 文件,由于 node 中可以使用一系列系统相关的 api ,所以在这个 js 中可以做很多事情,例如读取并分析运行这条命令的目录下的文件,根据模板生成文件等。
# unix 系默认的可执行文件,必须输入完整文件名vue-cli-service# windows cmd 中默认的可执行文件,当我们不添加后缀名时,自动根据 pathext 查找文件vue-cli-service.cmd# Windows PowerShell 中可执行文件,可以跨平台vue-cli-service.ps1
这里多提了下,在 windows 中 cmd 脚本使用得比较多,兼容性也较好。 powerShell 虽然比较强大,但他运行命令的方式由于和 cmd 命令有较大不同,这会导致你常常搞不清什么命令应该在什么解释器里运行。
示例:运行命令的方式不兼容
示例:windows 很多系统会默认禁止此脚本运行,导致 npm 命令运行错误
所以如果遇到 powerShell 相关错误时建议用 cmd 试试。
注入相关运行时信息
这一节我们通过调试 npm 的源码来进行说明。
首先我们在 mockm 这个前端接口联调工具的源码中先来个 debugger, 注意有从 process.env 中获取 NPM_CONFIG_REGISTRY 这个环境变量,这是 npm 安装时可配置的镜像地址。
然后我们再看一下这个环境变量,在当前系统中是没有定义的。
让我们开始调试 mockm package.json 中的 scripts
npm run s2
{"scripts": {"s2": "node run.js remote --config=D:/git2/mockm/server/example/full.mm.config.js", }}
为了节省篇幅,这里直接断点在关键地点:
这是 npm@v6.x 的源码,可以发现 npm 使用了 npm-lifecycle 这个依赖来运行的子进程调用我们的
run.js
文件。
在通过 spawn 运行 run.js 的时候,同时设置了进程相关的一些信息,这是由 node 原生支持的。
例如刚刚说到的 NPM_CONFIG_REGISTRY 环境变量。
下面把继续进入下一个断点, run.js 文件:
可以发现子进程成功获取了父进程给予的信息。
总结
运行 npm run xxx的时候,npm 会先在当前目录的 node_modules/.bin 查找要执行的程序,如果找到则运行;没有找到则从全局的 node_modules/.bin 中查找,npm i -g xxx就是安装到到全局目录;如果全局目录还是没找到,那么就从 path 环境变量中查找有没有其他同名的可执行程序。
本文转载于:
https://blog.51cto.com/u_15077533/4531157
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
当前最新:记录--前端项目中运行 npm run xxx 的时候发生了什么?
前沿资讯!科考中的意外收获!中国科学家在非洲发现消失百余年的濒危植物
天天速读:极氪001再遭奇葩故障:中控黑了、仪表花了、HUD“涂马赛克”
刚买两个月的谷歌Pixel 7 Pro翻车:绿屏无响应 用户绝望了
世界今头条!《和平精英》将推出开放世界玩法“绿洲世界” 能发射火箭
焦点信息:连过三科!新疆小伙1天拿到驾驶证
今日热议:低代码选型,论协同开发的重要性
【JVM】运行时内存分配
opencv-python 批量更改图像分辨率并且保留图像原有的透明度
热点!数据库概念
世界滚动:k8s~ingress限流机制
全球即时看!方正证券研究报告:行到水穷处,坐看云起时
环球快资讯丨不怕零下40℃极寒!我国复兴号高寒智能动车组投入运行
天天播报:为防员工摸鱼办公桌旁装监控 员工:很无语、感觉没隐私
《王者荣耀》花木兰新皮肤明日上线:143元 美背歌姬
世界时讯:海底捞回应禁止自带菜:可自带酒水饮品
天天短讯!RTX 4090高画质如何?《原子之心》PC平台性能分析:多配置流畅运行
【世界热闻】单特征线性回归
全球实时:为什么说《ps1屠龙刀》是awk、sed的恩人?
天天最资讯丨C语言在线代码运行编译工具推荐
全球快播:联想首款GeekPro游戏本真机公布:1TB SSD 超高性价比
环球微头条丨我国研发人员总量稳居世界首位 顶尖科技人才加速涌现
跑着跑着天窗会掉 奔驰中国召回超2万辆汽车
68岁成龙18年后再拍《神话2》 定名《传说》 古力娜扎主演
观速讯丨外卖员穿工装禁入成都高端商场 成都SKP回应:内部规定
焦点日报:135期 手绘汽车壁纸|插画 卫士还是老款好看 路虎卫士无水印手机壁纸
每日快讯!手把手教你为基于Netty的IM生成自签名SSL/TLS证书
当前热门:《我想进大厂》之Spring夺命连环10问
《分布式技术原理与算法解析》学习笔记Day20
世界看点:数据治理如何做?火山引擎DataLeap帮助这款产品3个月降低计算成本20%
世界今头条!装饰器设计模式这样学,保你必懂!
当前速讯:手机端ChatGPT搜索来了!微软2周火速上线 @Bing即用
多辆房车霸占高速服务区露营:有车主搭帐篷还晒咸菜
魔兽等游戏停服一个月 暴雪真不着急:两家中国公司抢破头
P1219 [USACO1.5]八皇后 Checker Challenge
世界新资讯:Java单元测试浅析(JUnit+Mockito)
81python装饰器
环球聚焦:《龙之家族》第二季明年首播
环球播报:Nginx基础03:配置文件nginx.conf(Part2)
【独家焦点】Python工具箱系列(二十六)
有奖调研!第五期(2022-2023)传统行业云原生技术落地调研——金融篇
全球快资讯丨A/B 测试成为企业“新窗口”:增长盈利告别经验主义,数据科学才是未来
晨光文具批发总部电话_石家庄晨光办公用品有限公司
环球要闻:新款特斯拉Model 3实车谍照曝光:疑似加长、内饰大改
可口可乐风味饮品!柠檬道日式气泡酒大促:12罐不到30元
前沿资讯!《嗜血印》将推出女祭司1/4比例雕像 性感热辣吸睛
焦点快播:送礼新思路!淘宝公布2023年度丑东西:网红青蛙服入选“年度五丑”
天天快报!C# Socket 通信时,怎样判断 Socket 双方是否断开连接
易基因|ChIP-seq等组学研究鉴定出结直肠癌的致癌超级增强子:Nature子刊
报道:顶象APP加固的“蜜罐”技术有什么作用
为什么带NOLOCK的查询语句还会造成阻塞
全球今亮点!支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!
名山大川是什么意思?名山大川有哪些?
喜欢被剧透的人是什么心理?喜欢被剧透的人是什么倾向?
每日快报!58岁清华毕业找不到超5000元工作 网友:我不是清华的咋办
天天热门:爷青结!《DNF》端游正式更名《地下城与勇士:创新世纪》:图标、文字调整
全球即时:《原子之心》优化非常好 但Xbox Series S仍存掉帧问题
精致又简约!雷孜LaCie新棱镜移动硬盘评测:速度全程稳如初
小米13 Ultra手机壳曝光:中分四摄、凸起严重
戴拿奥特曼飞鸟信扮演者怎么了?戴拿奥特曼的结局是什么?
四要十不准是什么意思?四要十不准内容有哪些?
童话故事是什么文体?出自童话故事的成语有哪些?
八门神器怎么打不开?八门神器使用教程
格兰仕电烤箱功能及使用方法有哪些?格兰仕电烤箱售后电话是多少?
智能abc输入法属于什么码?智能abc怎么打空格?
联想p700怎么样?联想p700手机参数?
thinkpad平板电脑怎么样?thinkpad平板电脑推荐
天天头条:Linux视频上传及压缩
Java 在线代码运行编译工具推荐
湖北长江产投将入股?集度汽车:正常交流活动
会员收入创单季最高!龚宇:爱奇艺已解决债务问题
每日焦点!原味、藤椒味 肉香酥脆:亚明农家小酥肉15元/斤狂促
【环球报资讯】大批玩家称玩《原子之心》恶心想吐!官方称将更新FOV设置
手机的飞行模式还有这些妙用!看到不点开后悔一生
【环球报资讯】C# 获取电脑内存、CPU信息
今热点:塔吉克斯坦发生7.2级地震:新疆多地震感强烈
简讯:世界第二大啤酒制造商!比尔盖茨收购喜力啤酒股份:花了62亿
环球讯息:一周扭转广告业务无果:马斯克再裁数十名Twitter员工
御香山
环球热资讯!邓超主演!《中国乒乓》出品人回应票房不如预期:希望接下来能卖多少是多少
当前观察:洗衣机买波轮还是滚筒 答案你一定想不到
世界热头条丨销量下滑45岁以上买断工龄?上汽通用辟谣:无裁员计划
腾讯自研!开放世界生存手游《黎明觉醒:生机》开服:不限号不删档
环球即时看!iPhone 15真机照首曝:刘海屏时代终结 灵动岛成标配
读Java实战(第二版)笔记18_基于Lambda的领域特定语言
沪上阿姨外包装旗袍图被质疑不雅 开叉至大腿根部不正常?官方回应
008 - 检验 (1)
JVM基础学习笔记
当前快报:Nvidia宣布GeForceNow将获得RTX服务器
天天日报丨辣椒越皱 就越辣?科学家好好研究了一番
全球时讯:128位《王者荣耀》选手通过职业技能等级考试 获“电子竞技员”证书
世界滚动:风云气象卫星今年两连发:中国将成全世界唯一!
【当前热闻】有开机广告用户照样买 全球电视销量TOP5 中国产占3席
Intel 56核心发烧U跑分逼近AMD 64核心:峰值功耗1100W!
世界热头条丨易企盈控股集团 深圳有限公司_对于易企盈控股集团 深圳有限公司简单介绍
fusion app自定义事件源码介绍(下)
Spring IOC官方文档学习笔记(十二)之基于Java的容器配置
【世界热闻】Flink之间的组件通信
Model 3还要便宜 分析师看衰特斯拉:不降价达不到目标
爱奇艺:《狂飙》热度刷新历史纪录 会员规模有信心继续增长