【小知识点】npm 全局安装原理

964 阅读1分钟

浅析 npm 全局安装原理

npm install express -g

概述

npm 包全局安装并不是把一个包安装为全局包,不是说在任何地方都可以通过 require() 引用到它。

这个称谓会引起误会,实际上应该是,将包安装为全局可用的可执行命令。

它根据 package.json 中 bin 字段的配置,将包中的实际脚本,链接到与 node 可执行文件相同的目录下

下面举个栗子:

"bin": {"express": "./bin/express"}

全局模式安装的包,安装到了哪?

通过全局模式安装的包,文件安装到了这个目录下:

npm root -g
/Users/xxx/.nvm/versions/node/v10.16.0/lib/node_modules

bin 中的配置如何生效?

"bin": {"express": "./bin/express"}

express 是执行的全局可用的命令名称

会在和 node 可执行文件的同级目录下创建一个软链接,我们可以通过下面的方式获得 node 可执行文件的路径

console.log(process.execPath)
// /Users/xxx/.nvm/versions/node/v10.16.0/bin/node

那么 express 的软链接被创建在:

/Users/xxx/.nvm/versions/node/v10.16.0/bin/express

软链接到了这里:

/Users/xxx/.nvm/versions/node/v10.16.0/lib/node_modules/express/bin/express(包安装地址+配置的路径) 

由于 bin 目录会在运行时加入系统的 PATH 变量,因此在运行 npm 时,就可以不带路径,直接通过命令来调用这些脚本

总结一下栗子

软链接地址(并且在运行时会加入到系统的 PATH 变量,于是可以直接通过命令调用)

/Users/xxx/.nvm/versions/node/v10.16.0/bin/express

软链接到了

/Users/xxx/.nvm/versions/node/v10.16.0/lib/node_modules/express/bin/express(包安装地址)