实验环境:window7 32bit
实验素材:node v10.16.0
时间:2019-06-12
全局安装都干了什么
- 从官网下载的
node-v10.16.0-x86.mis
安装包,一路默认安装完毕。
- 之后发现 系统变量 中的
path
字段增加了一个路径c:\Program Files\nodejs\
,这正是node的安装路径,来看一下这个路径下都有什么
其中node.exe
、npm.cmd
、npx.cmd
都是可执行文件,这就解释了为什么在任意目录下都可以直接运行node
npm
npx
这三个命令 - 上图中还有一个
node_modules
目录,这个目录里只有一个包npm
,原来npm自己本身就是一个包,npm和npx这两个命令运行的就是这个包中的代码
- 除了 系统变量 发生变化,用户变量也新增了一个路径
c:\users\用户名\appData\Roamming\npm
它里面是空的,全局安装一个gulp
看看有啥变化npm install -g gulp
:
可以看到出现了gulp.cmd
可执行文件和node_modules
文件夹,文件夹里面不用看也知道一定包含了gulp的代码包。
这就解释了为什么全局安装的包,能够在任意文件夹调用。我顺手也安装了jquery和lodash这两个包,但他们并没有生成可执行文件。尽管知道两个包不存在cli的命令,但为什么没有可执行文件呢。
带着疑问对比了这三个包,发现gulp
的包描述文件package.json
中包含一个bin
字段,这个字段对应的值正是可执行文件中描述的值。而jquery
和lodash
的包描述文件中没有bin
字段,
我猜测:原来,当使用npm install -g
命令时,npm会查看包描述文件,如果发现了bin
字段就会在node_module
同级目录创建可执行文件,没有这个字段则不创建。
本地安装呢
- 本地安装会在当前目录创建一个
node_modules
的文件夹,如果已经存在文件夹就直接安装到里面。 - 细心一点发现,本地安装了gulp之后,虽然
node_modules
的同级目录没有出现可执行文件,但子目录中却多出了一个.bin
的文件夹,打开它看到
哈哈,原来本地安装命令也会查看宝描述文件并创建可执行文件,只是创建的位置不一样。那么问题也来了,这个目录并没有配置到系统环境变量中,难道每次运行他们都要进入到.bin
目录里去运行么?是的,在npx出现之前确实比较麻烦!
npx
还记得安装node.js的时候,在node.exe的相同路径下有一个npx可执行文件么,这个npx的作用就是能够运行本地包的cli。它并不是去找.bin
文件夹,而是直接查找gulp这个包文件夹,再通过读取package.json运行gulp\bin\gulp.js
。 而且据说npx在找不到gulp时,会自动下载gulp到缓存中,我没有尝试过,因为不喜欢这种方式。
深究.js文件的运行过程
- .js文件通常需要这样运行
node path\test.js
- 可执行文件到底是什么,为什么运行它就能启动node并运行指定的js文件(未完)