浅析 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(包安装地址)