浅谈一下
前段时间,开发了一个组件,需要在本地debug
验证相关功能,有些纠结是用npm link
还是npx link
,亦或是npm install
。。。
有些忘记了相关用法以及带来的影响…觉得还是有必要写一篇文章记录一下过程,以及新的东西。😮💨😮💨😮💨
npm link
是干啥的?
npm 文档 也有说明:为了方便你的迭代测试,npm link
将在全局的node_modules
创建一个指向当前自定义的npm
模块的软链接,并在你需要使用的地方通过npm link packagename
创建一个从全局安装的package-name
到当前文件夹/node_modules
的符号链接。你对自定义包的任何改动都将同步到link
到的项目中。可以理解为 mklink
第一视角带你学习link
指令
准备好预发布包
mkdir my-test-component-zhl
cd ./my-test-component-zhl
npm init -y
# 准备入口文件 index
# (() => {
# console.log('这是我的组件模块');
# })();
准备一个用于测试的项目*
cd ../
mkdir my-test-project
cd ./my-test-project
npm init -y
为预发布包创建软链接
cd ../my-test-component-zhl
npm link
结果预览:
链接的位置就是你nodejs
安装目录下的node_modules
目录下,指向了当前的组件。
在项目中引用这个预发布包
你会发现,link
的包并不会在package.json
的dependencies
里出现。
cd ../my-test-project
npm link my-test-component-zhl
结果预览:
实际使用调试:
require('my-test-component-zhl');
调试
修改my-test-component-zhl
的内容,会同步更新到当前引用的项目中…很方便。
效果:
解除link
npm unlink --no-save packagename && npm install
查阅了文档,发现unlink
其实是uninstall
的别名。-> 戳这里
当然,如果你不需要link
该组件包进行测试时,建议你同时也卸载掉link
到全局的包。如下:
cd ../my-test-component-zhl
npm unlink [-g]
说说npm link
的缺点
好用确实是好用,但是也有几个缺点(槽点):
建立了 link 过后,跨 node 版本使用容易出错
其实这个在我本机上没有遇到,前面测试的时候,细心的伙伴可能也发现了,link
的global
地址并没有带node
版本信息(并不是在nvm/nodeversion/node_modules
下,意味着我换一个node
的版本,软链接仍然是存在且有效的。😮💨😮💨😮💨 如何做到的?小伙伴可以自己验证一下是否可行
配置npm
的全局安装位置:
npm config set prefix xxx
link 失败不会报错并且会回退到直接从 npm 仓库进行安装
这个确实,如果link
本地预发布包失败,npm
会全局安装一个你link 的 packagename
包,然后再建立软链接,如果npm-registry
仓库也没有这个包,才会抛异常。💀💀💀 潜在问题,不容易发现,当然你可以通过为自己模块添加私有前缀避免这一问题
会有预期之外的二进制可执行文件安装
通过 npm uninstall -g packagename
可以同时卸载全局包和它的二进制执行文件。那么根据unlink
是uninstall
的别名,可以很容易推出另外一个等价指令:
npm unlink [-g]
不符合预期的软链接删除
每一次的npm link
,都是一次重新建立软链接的过程,这个过程会取消之前已经链接的包。
如果你想同时保留多个包的软链接,记得同时link
多个:
npm link ../packageA ../packageB
这么一分析,好像也就不是问题了…😂😂😂 不过还是介绍一下另外的两种方式:
npm install
替代
使用安装指令,拼上你自定义的模块的路径地址,可以是相对路径
,这种方式同样是建立软链接,并不是真的将资源下载到node_modules
,只不过少了个global
的中间过程。貌似更加方便一点。
npm install <package-path>
如果你不想写入package.json
,可以带上--no-save
参数:
npm install –no-save <package-path>
取消的话,可以用uninstall
:
npm uninstall package-path
扩展【仅做了解】
通过link
工具避免上面提到的问题。-> 详见
npm i -g link
# 方式一
npx link package-path
# 方式二:项目根目录添加 link.config.json 配置文件,再执行
npx link