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


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

全局安装都干了什么

  1. 从官网下载的 node-v10.16.0-x86.mis 安装包,一路默认安装完毕。
  2. 之后发现 系统变量 中的path字段增加了一个路径c:\Program Files\nodejs\,这正是node的安装路径,来看一下这个路径下都有什么

    其中node.exenpm.cmdnpx.cmd 都是可执行文件,这就解释了为什么在任意目录下都可以直接运行node npm npx这三个命令
  3. 上图中还有一个node_modules目录,这个目录里只有一个包npm,原来npm自己本身就是一个包,npm和npx这两个命令运行的就是这个包中的代码
  4. 除了 系统变量 发生变化,用户变量也新增了一个路径c:\users\用户名\appData\Roamming\npm

    它里面是空的,全局安装一个gulp看看有啥变化npm install -g gulp

    可以看到出现了gulp.cmd可执行文件和node_modules文件夹,文件夹里面不用看也知道一定包含了gulp的代码包。

    这就解释了为什么全局安装的包,能够在任意文件夹调用。我顺手也安装了jquery和lodash这两个包,但他们并没有生成可执行文件。尽管知道两个包不存在cli的命令,但为什么没有可执行文件呢。
    带着疑问对比了这三个包,发现gulp的包描述文件package.json中包含一个bin字段,这个字段对应的值正是可执行文件中描述的值。而jquerylodash的包描述文件中没有bin字段,


    我猜测:原来,当使用npm install -g 命令时,npm会查看包描述文件,如果发现了bin字段就会在node_module同级目录创建可执行文件,没有这个字段则不创建。

本地安装呢

  1. 本地安装会在当前目录创建一个node_modules的文件夹,如果已经存在文件夹就直接安装到里面。
  2. 细心一点发现,本地安装了gulp之后,虽然node_modules的同级目录没有出现可执行文件,但子目录中却多出了一个.bin的文件夹,打开它看到

    哈哈,原来本地安装命令也会查看宝描述文件并创建可执行文件,只是创建的位置不一样。那么问题也来了,这个目录并没有配置到系统环境变量中,难道每次运行他们都要进入到.bin目录里去运行么?是的,在npx出现之前确实比较麻烦!

npx

还记得安装node.js的时候,在node.exe的相同路径下有一个npx可执行文件么,这个npx的作用就是能够运行本地的node_module中的js包。
npx gulp 会去当前目录中的node_module/.bin中寻找gulp.cmd,如果没有就去环境变量path里面找,都找不到就认为当前的node_module中缺少这个模块,然后下载这个模块到临时目录中并运行,运行之后即清除。下次运行会重新下载。
使用--no-install参数能够强制使用本地模块而不下载,没找到就会报错。
相反--ignore-existing参数会强制使用远程下载模块。
可以通过指定版本号来实现node运行环境的切换$ npx node@0.12.8 -v,原理就是使用npm中的node模块
本节部分内容参考了阮一峰博客对npx的总结

深究.js文件的运行过程

  1. .js文件通常需要这样运行 node path\test.js
  2. 可执行文件到底是什么,为什么运行它就能启动node并运行指定的js文件


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM