使用npm link调试本地未发布模块
在使用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" 转载请保留原文链接及作者。