# 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找的对应的可执行文件执行的