今天,我们来探索,npm run 到底是怎么执行命令的,模块是否一定要全局安装呢?
下面我们分四个步骤来详细总结一下
- npm 的命令行存放位置
- npm 命令添加过程
- npm 命令执行过程
- 项目本地安装是否必要
npm 命令行包存放位置
npm 中所有可供调用的命令行包 存放在 项目根目录的 ./node_modules/.bin/
大家可以看到一个 cmd 文件 和一个 无后缀的文件
cmd文件 是 一个 windows 内核脚本文件,可以直接双击运行
我们以 grunt 为例,可以看到有两个文件,一个 grunt,一个 grunt.cmd
看一下 grunt.cmd 内容,大概就是 使用node 执行 gurnt 的包入口文件
而 window 下 npm run 调用的也是这个 cmd 文件
npm 命令添加过程
npm 在 执行 install 时,会分析每个依赖包的 package.json 中的 bin 字段,并将包含的命令安装到 ./node_modules/.bin 目录中
我们 现在来添加一下自己的包,来测试一下
在 自己创建的包的 package.json 中,给 bin对象 添加一个键值对
配置格式 如下:
命令名称:入口执行文件
执行 npm install file:./npm-install-test
为什么这么做,可以参考我的另一篇文章 【npm】简化本地文件引用路径
好的查看 bin 目录,发现 我们的 apple 添加到 node_modules/bin 下面了!
npm 命令执行过程
npm run 命令执行的时候,会把 ./node_modules/.bin/ 目录添加到执行环境的 PATH 变量中
如果有些命令没有全局安装,只安装在了 当前项目的 node_modules 中
那么使用 npm run 一样可以调用命令
我们来测试一下,是不是真的可以这样
1、我们在根目录的 script 添加一条命令,用来执行 grunt
2、我们先确定并没有全局安装 grunt,保证 npm run g 并不是调用 全局的 grunt 命令
3、本地项目下安装 grunt
4、运行命令,perfect!!
那么,我们就能确定啦,npm run 运行命令的时候,会把 bin 目录下的命令行包 添加到 执行环境变量中,而不用 全局安装
项目本地安装是否必要
有些工具,全局安装的同时,也必须本地项目安装
因为 不同项目依赖的 版本不同,比如说 webpack,webpack.config.js 只兼容特定版本的 webpack
项目本身依赖的 webpack3 ,而全局安装是 webpack4,如果此时项目不安装 webpack ,那么无法构建成功
结尾
本来文章的内容是直接从我的笔记复制过来的
但是复制过来一检查,诶,这个没讲明白,那个没说清楚。
虽然说没人看,但是保不定哪天有人看没看明白呢??
然后就是一顿捣鼓,导致最后内容越来越多.....当然了,自己也了解了更详细了一些