浅谈一下

前段时间,开发了一个组件,需要在本地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

结果预览:

npm-link-p1

链接的位置就是你nodejs安装目录下的node_modules目录下,指向了当前的组件。

在项目中引用这个预发布包

你会发现,link的包并不会在package.jsondependencies里出现。

cd ../my-test-project
npm link my-test-component-zhl

结果预览:

npm-link-p2
npm-link-p3

实际使用调试:

require('my-test-component-zhl');

npm-link-p4

调试

修改my-test-component-zhl的内容,会同步更新到当前引用的项目中…很方便。

效果:

npm-link-p5

npm unlink --no-save packagename && npm install

查阅了文档,发现unlink其实是uninstall的别名。-> 戳这里

当然,如果你不需要link该组件包进行测试时,建议你同时也卸载掉link到全局的包。如下:

cd ../my-test-component-zhl
npm unlink [-g]

说说npm link的缺点

好用确实是好用,但是也有几个缺点(槽点):

建立了 link 过后,跨 node 版本使用容易出错

其实这个在我本机上没有遇到,前面测试的时候,细心的伙伴可能也发现了,linkglobal地址并没有带node版本信息(并不是在nvm/nodeversion/node_modules下,意味着我换一个node的版本,软链接仍然是存在且有效的。😮‍💨😮‍💨😮‍💨 如何做到的?小伙伴可以自己验证一下是否可行

配置npm的全局安装位置:

npm config set prefix xxx

link 失败不会报错并且会回退到直接从 npm 仓库进行安装

这个确实,如果link本地预发布包失败,npm会全局安装一个你link 的 packagename包,然后再建立软链接,如果npm-registry仓库也没有这个包,才会抛异常。💀💀💀 潜在问题,不容易发现,当然你可以通过为自己模块添加私有前缀避免这一问题

会有预期之外的二进制可执行文件安装

通过 npm uninstall -g packagename可以同时卸载全局包和它的二进制执行文件。那么根据unlinkuninstall的别名,可以很容易推出另外一个等价指令:

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