node.js、npm中对全局安装的探索

实验环境:window7 32bit
实验素材:node v10.16.0
时间:2019-06-12

全局安装都干了什么

  1. 从官网下载的 node-v10.16.0-x86.mis 安装包,一路默认安装完毕。
    node.js、npm中对全局安装的探索
  2. 之后发现 系统变量 中的path字段增加了一个路径c:\Program Files\nodejs\,这正是node的安装路径,来看一下这个路径下都有什么
    node.js、npm中对全局安装的探索
    其中node.exenpm.cmdnpx.cmd 都是可执行文件,这就解释了为什么在任意目录下都可以直接运行node npm npx这三个命令
  3. 上图中还有一个node_modules目录,这个目录里只有一个包npm,原来npm自己本身就是一个包,npm和npx这两个命令运行的就是这个包中的代码
    node.js、npm中对全局安装的探索
  4. 除了 系统变量 发生变化,用户变量也新增了一个路径c:\users\用户名\appData\Roamming\npm
    node.js、npm中对全局安装的探索
    它里面是空的,全局安装一个gulp看看有啥变化npm install -g gulp
    node.js、npm中对全局安装的探索
    可以看到出现了gulp.cmd可执行文件和node_modules文件夹,文件夹里面不用看也知道一定包含了gulp的代码包。
    node.js、npm中对全局安装的探索
    这就解释了为什么全局安装的包,能够在任意文件夹调用。我顺手也安装了jquery和lodash这两个包,但他们并没有生成可执行文件。尽管知道两个包不存在cli的命令,但为什么没有可执行文件呢。
    带着疑问对比了这三个包,发现gulp的包描述文件package.json中包含一个bin字段,这个字段对应的值正是可执行文件中描述的值。而jquerylodash的包描述文件中没有bin字段,
    node.js、npm中对全局安装的探索
    node.js、npm中对全局安装的探索
    我猜测:原来,当使用npm install -g 命令时,npm会查看包描述文件,如果发现了bin字段就会在node_module同级目录创建可执行文件,没有这个字段则不创建。

本地安装呢

  1. 本地安装会在当前目录创建一个node_modules的文件夹,如果已经存在文件夹就直接安装到里面。
  2. 细心一点发现,本地安装了gulp之后,虽然node_modules的同级目录没有出现可执行文件,但子目录中却多出了一个.bin的文件夹,打开它看到
    node.js、npm中对全局安装的探索
    哈哈,原来本地安装命令也会查看宝描述文件并创建可执行文件,只是创建的位置不一样。那么问题也来了,这个目录并没有配置到系统环境变量中,难道每次运行他们都要进入到.bin目录里去运行么?是的,在npx出现之前确实比较麻烦!

npx

还记得安装node.js的时候,在node.exe的相同路径下有一个npx可执行文件么,这个npx的作用就是能够运行本地包的cli。它并不是去找.bin文件夹,而是直接查找gulp这个包文件夹,再通过读取package.json运行gulp\bin\gulp.js。 而且据说npx在找不到gulp时,会自动下载gulp到缓存中,我没有尝试过,因为不喜欢这种方式。

深究.js文件的运行过程

  1. .js文件通常需要这样运行 node path\test.js
  2. 可执行文件到底是什么,为什么运行它就能启动node并运行指定的js文件(未完)
上一篇:eslint 在webpack 中的配置


下一篇:npx