# npm link 的应用场景
- 开发脚手架时,在本地调试命令
开发脚手架时,在项目所在目录,执行npm link
命令,就可以在全局执行项目的package.json
文件的bin
属性里面配置的命令 - 可以在项目里,直接使用本地包,从而对本地包进行调试
当我们开发包a
时,可以在发布前直接npm link
,将包a
链接到全局,然后在项目里npm link a
,这样就可以在项目里面使用包a
,从而对包进行调试 - MultiRepo 多仓库多模块应用 本地开发时,多模块之间共享代码的一种解决方案
当仓库a
要使用仓库b
提供的代码的时候,可以在b
仓库目录下,npm link
从而将仓库b
链接到全局,然后再在仓库a
里执行npm link b
, 然后就可以在a
里导入b
了。从而实现多仓库共享代码
# 本地包里执行 npm link 发生了什么?
在 npm 的全局模块目录(node 安装目录下的
node_modules
)下会创建一个软连接(符号链接)
,指向本地包。根据
bin
配置的命令,在可执行目录下创建一个符号链接,指向bin
里配置的可执行文件。
例如,如果你的package.json
文件中有如下配置:{
"name": "your-project",
"version": "1.0.0",
"bin": {
"your-script": "./bin/your-script.js"
}
}
执行
npm link
后,将在全局的可执行文件目录下创建一个名为your-script
的符号链接,指向你项目中./bin/your-script.js
文件。所以当我们在命令行里执行your-script
的时候,实际相当于执行了./bin/your-script.js
当我们全局安装包的时候,对
bin
的处理也是类似的,在全局的可执行目录下创建一个符号链接,指向 npm 全局模块目录下我们安装的全局包对应的可执行文件
# 项目里面执行 npm link <package-name>
发生了什么
- 在项目的
node_modules
目录下创建一个符号链接,指向 npm 的全局模块目录
下对应的符号链接(这个符号链接是我们在对应的本地包里执行npm link
的时候创建的)。然后当我们导入这个包的时候,就会在项目的node_modules
里找,从而就会找到对应的符号链接,然后这个符号链接又指向 npm 全局模块目录下的符号链接,而这个符号链接又指向本地包文件,从而正确的导入和使用。 - 在项目的
node_modules/.bin
目录下根据对应本地包的bin
创建对应的符号链接指向 npm 全局模块的对应的符号链接的可执行文件。当我们使用
npx
执行命令的时候,实际上是在node_modules/.bin
找的对应的可执行文件执行的