npm run 命令解析与node_modules .bin下的文件解析

npm run 命令解析

在vue和react项目中,我们常常用到npm run dev命令来起本地服务,那么npm run dev到底做了什么?

package.json文件中的字段script的每一个属性都是一个自定义的脚本命令,npm run 其实执行了package.json中的script脚本

下面的例子,我们以vue-cli3脚手架搭建的项目为例说明,所以当我们输入命令npm run serve命令,底层相当执行vue-cli-service serve --port 8055命令

// package.json
"scripts": {
    "serve": "vue-cli-service serve --port 8055",
    "build": "vue-cli-service build",
    "build:test": "vue-cli-service build --mode test",
    "build:beta": "vue-cli-service build --mode beta",
    "lint": "vue-cli-service lint",
    "inspect-old": "vue-cli-service inspect --mode production > webpack.inspect.js",
    "inspect": "vue inspect --mode production",
    "inspectwebpack": "vue inspect --mode production > output.js"
}
知识点总结

npm run如果不加任何参数,直接运行,会列出package.json里面所有可以执行的脚本命令(script字段里面的内容)。

npm start可以运行是为了方便开发者使用,npm start会执行scripts里的start字段。 如果没有start字段则执行node server.js。

This runs an arbitrary command specified in the package‘s "start" property of its "scripts" object. If no "start" property is specified on the "scripts" object, it will run node server.js.

执行原理

使用npm run script执行脚本的时候都会创建一个shell,然后在shell中执行指定的脚本。

这个shell会将当前项目的可执行依赖目录(即node_modules/.bin)添加到环境变量path中,当执行之后再恢复原样。就是说脚本命令中的依赖名会直接找到node_modules/.bin下面的对应脚本,而不需要加上路径,所以scripts字段里面调用命令时不用加上路径,这就避免了全局安装NPM模块

执行顺序
'&' 并行执行顺序,同时执行
"dev":"node test.js & webpack"

'&&'继发顺序,执行前面之后才可以执行后面
"dev":"node test.js && webpack"
顺序钩子
"predev":"node test_one.js",
"dev":"node test_two.js",
"postdev":"node test_three.js"

当执行 npm run dev 的时候默认就会执行

npm run predev && npm run dev && npm run postdev
四个可以简写的脚本执行命令

npm start === npm run start

npm stop === npm run stop

npm test === npm run test

npm restart === npm run stop && npm run restart && npm run start

使用package.json内部变量

通过npm_package_前缀,npm脚本可以拿到npm的内部变量

// package.json
{
  "name":"zhy",
  "test":"node test.js"
}

test.js:
console.log(process.env.npm_package_name) //zhy

node_modules/.bin文件夹内容解析

下面是vue-cli3搭建的项目node_modules/.bin文件夹下面的文件名

eslint
eslint.cmd
lessc
lessc.cmd
uuid
uuid.cmd
vue-cli-service
vue-cli-service.cmd

对于一个npm包,有两个可执行文件,没有后缀名的是是对应unix系的shell脚本,.cmd文件对应的是windows bat脚本,内容都是用node执行一个js文件

// vue-cli-service.cmd文件内容
// windows bat脚本
@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\..\[email protected][email protected]@@vue\cli-service\bin\vue-cli-service.js" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node  "%~dp0\..\[email protected][email protected]@@vue\cli-service\bin\vue-cli-service.js" %*
)

这里是windows的cmd中的语法
~dp0指执行脚本的当前目录,这句话的意思是如果当前目录下有node.exe,就用node.exe执行... ...webpack.js文件 %*是指执行bat时命令中输入的后续参数
否则 @SETLOCAL设置本次批处理命令中的环境变量
PATHEXT是windows下的文件扩展名环境变量 后面的语法是从PATHEXT中删除.JS 然后执行 node ... ... webpack.js 命令,
去除掉扩展名的作用是为了防止执行到node.js文件
比如当前文件夹下有一个node.js文件, 如果直接执行node命令可能会默认用vscode打开这个.js文件

// vue-cli-service文件内容
// unix系的shell脚本
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

case `uname` in
    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac

if [ -x "$basedir/node" ]; then
  "$basedir/node"  "$basedir/../[email protected][email protected]@@vue/cli-service/bin/vue-cli-service.js" "[email protected]"
  ret=$?
else
  node  "$basedir/../[email protected][email protected]@@vue/cli-service/bin/vue-cli-service.js" "[email protected]"
  ret=$?
fi
exit $ret

原文地址:https://www.cnblogs.com/HYZhou2018/p/12195670.html

时间: 2024-11-07 14:55:22

npm run 命令解析与node_modules .bin下的文件解析的相关文章

du命令的使用-----查看当前目录下的文件信息

du命令的使用-----查看当前目录下的文件信息 1.du 参数: (1)  du -a  (2) du -s (3) du -k (4) du -m (5)du -g (6) du -l (7) du -r (8) du -x (9) du -H (10)du -L 注意: du -某参数 后面可以添加文件名字,表示查看指定文件的信息,如果不写,默认是当前目录下所有文件信息. (1)  du -a :为每个指定文件显示使用磁盘的情况.或为每个目录显示使用磁盘的情况.注意 该参数与 du -s的

【翻译自mos文章】尽管指定了目的地,asmcmd cp命令还是在 +DATA/ASM 下创建文件

尽管指定了目的地,asmcmd cp命令还是在  +DATA/ASM 下创建文件 参考原文: ASMCMD Cp Creates Files In +DATA/ASM Instead Of Destination Specified (Doc ID 1488934.1) 适用于: Oracle Database - Enterprise Edition - Version 11.2.0.3 and later Information in this document applies to any

【翻译自mos文章】虽然指定了目的地,asmcmd cp命令还是在 +DATA/ASM 下创建文件

虽然指定了目的地.asmcmd cp命令还是在  +DATA/ASM 下创建文件 參考原文: ASMCMD Cp Creates Files In +DATA/ASM Instead Of Destination Specified (Doc ID 1488934.1) 适用于: Oracle Database - Enterprise Edition - Version 11.2.0.3 and later Information in this document applies to any

通过svn命令实现创建版本库下的文件夹,并且可以操作访问

1.Windows+R,输入cmd进入DOS命令窗口 2.进入到计算机磁盘中的Repository 3.输入命令:SVNadmin create test2,在当前目录下创建一个test2的版本库,输入dir命令,查看是否创建成功. 4.版本库创建成功,需要配置相应的权限,用户以及组才能够实现操作,具体步骤如下: a.将新创建的版本库test2中的svnserve.conf配置文件作如下修改 修改前 修改后 b.将新创建的版本库test2中的authz配置文件作如下修改 修改前 修改后 c.将新

jdk1.8.0_101/bin下各文件解释

appletviewer - Runs applets outside of a web browser. extcheck - Detects version conflicts between a target Java Archive idlj - Generates Java bindings for a specified Interface Definition Language (IDL) file. jar - Manipulates Java Archive (JAR) fil

vue 关于npm run build 的小问题

vue项目使用npm run build命令进行打包操作,打包之后试运行报错,报错为: 且命令行警告信息为: 解决办法: 找到项目目录下的config文件夹里的index.js文件,将build对象下的assetsPublicPath中的"/",改为"./"即可,就在前面加个点就可以了, 再次运行命令行: npm run build,将打包好的dist文件放到本地服务器下,浏览器打开对应地址即可. PS: 查看打包后dist 文件是否可以正常运行有一个前提,需要将d

修改目录下所有文件的某段内容

利用xargs 和 sed命令 比如,修改当前目录下所有文件(包括子目录下的文件),将文本中出现的 aaa替换为 bbb find . -type f | xargs sed -i 's/aaa/bbb/'

find 查找目录下的文件

1. 命令功能 find命令用于查到目录下的文件,同时也可以调用其它命令执行相应操作. 2. 语法格式 find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] find  [-H] [-L] [-P] [-Olevel]  [pathname]  [expression] find  [选项]            [ 路径 ]        [操作语句] 常见用

Laravel 框架在 Mac 上使用命令 npm run dev 时报错问题

我是看的Summer写的 Laravel 入门教程,用的 Mac 上 Homestead---Vagrant 第四章时一个步骤是要将 Laravel 默认生成的 .scss 文件编译成 .css 才行. 命令如下: npm run dev Linux 或 Mac 或 Windows 的环境都会碰到 cross-env 的问题,这时在评论方看到一个解决办法 其原理已经讲的很清楚了,算是 windows 的锅呗.貌似很多人通过这里的方法都解决了问题. 但是我这冥顽不灵,删除了 cross-env 还