使用npm link调试本地未发布模块

  1. 开发历程
  2. 核查原因
  3. 解决办法
  4. 尚存问题

在使用npm包时,未研究npm同步原理,致使在下载新npm包时本地开发的模块丢失。通过npm link命令,使本地开发未发布的包成为可能。


开发历程

在开发unifiedjs的过程中,需要对已存在的模块rehype-document进行修改。为了方便,直接将该模块复制并更名为rehype-document-test,移入开发工程的./node_modules/目录下。开发过程中,又按照npm包格式新建了临时的my-addon-hasttreeedit包用以存放功能函数。
由于开发需要,使用命令npm install <target>下载新包。下载完毕后,控制台显示已移除部分包并安装新包,查看工作区发现正在编辑的index.js文件及其所在的my-addon-hasttreeedit包已被移除。
立刻新建index.js文件,将vscode工作区缓存的代码复制粘贴保存。查看rehype-document-test包,发现其未受影响。

核查原因

初步怀疑是因为在下载时需要核对包名,若不符则删除,依照这个想法查到了package-lock.json,发现其中有复制后的rehype-document-test包,但是由于我只是对包名进行了重命名操作,因此package-lock.json中对应的字段除名称不同外仍为原包信息,也因此通过npm检查未被移除。
经尝试,在使用npm更新包时,会根据package-lock.json文件更新包信息,因此在包中直接加入未发布的自定义模块是不可行的。

解决办法

经过搜索,在互联网上找到了一篇问答,其中介绍了应对的方法。
根据官方文档,使用npm link命令可解决本地包引入的问题。

cd ~/projects/node-redis    # go into the package directory
npm link                    # creates global link
cd ~/projects/node-bloggy   # go into some other package directory.
npm link redis              # link-install the package

使用自然语言可描述如下:
在准备引入的包路径下打开CMD并执行命令npm link,再切换至需要安装的包路径下执行npm link <packagename>引入包。

在Windows系统下,目标项目的node_modules文件夹中,从外部引入的包文件夹以快捷方式形式出现。此时,即可直接在项目中引用此包。

尚存问题

经过测试,该方案可解决因为npm包更新导致的本地包删除,但由于package-lock.json的特性,每一次npm install操作后,链接的快捷方式都会被删除,此时需要重新链接,如果本地调试包较多则设置时非常麻烦。另一个解决办法是个人维护package-lock.json,但复杂度显然更高。可见,这种方法仅适用于调试,一劳永逸的解决办法仍是发布于npm。


3.14修改:
事实上可以做到开发项目更新npm包后仍可使用链接——只需将链接链至npm全局下即可,此时局部的包更新并不会影响全局变量。当然全局包更新后亦需重新配置。

文章标题:使用npm link调试本地未发布模块

文章字数:782

本文作者:szz1204

发布时间:2020-03-13, 17:25:56

最后更新:2020-05-28, 14:52:17

原始链接:https://blog.foundation42.work/2020/03/13/使用npm-link调试本地未发布模块/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录