公告:九九网站目录为广大站长提供免费收录网站服务,会员可在线完成投稿无需添加友情链接。只收录内容正规合法的网站;快审网站软文10元

点击这里在线咨询客服
新站提交
  • 网站:8462
  • 待审:16
  • 小程序:9
  • 文章:3610
  • 会员:21113

 

直接修改 node_modules 下的代码不是被推荐的做法,应该仅在应急情况下考虑

在实际开发过程中当我们遇到node_modules中的 A 包有 bug 时候,通常开发者有几个选择:

方法一:给 A 包提 issue 等待他人修复并发布:做好石沉大海或修复周期很长的准备。

方法二:给 A 包提 mr 自行修复并等待发布:很棒,不过你最好祈祷作者发版积极,并且新版本向下兼容。

方法三:把 A 包的源码拖出来自己维护:有点暴力且事后维护成本较高,不过应急时也能勉强接受。

等等,可如果出问题的包是幽灵依赖呢,比如项目的依赖链是: A -> B -> C,此时 C 包有 bug。那么上面三个方法的改动需要同时影响到 A、B、C 三个包,修复周期可能就更长了,可是你今晚就要上线啊,这可怎么办?

上线要紧,直接手动修改node_modules下的代码给缺陷包打个临时补丁吧,可问题又来了,改动只能在本地生效,构建却在云端, 积极的同学开始写起了脚本,然后陷入一个个坑里...

上述场景下即可考虑使用patch-package这个包,假设我们现在的源码结构如下所示:

├── node_modules  
│    └── lodash         
│        └── toString.js 
├── src                     
│    └── app.js // 依赖 lodash 的 toString 方法
└── package.json

node_modules/lodash/toString.js

varbaseToString=require(./_baseToString)functiontoString(value){returnvalue==null?:baseToString(value);}module.exports=toString;

src/app.js

consttoString=require(lodash/toString)console.log(toString(123));

假设现在需要修改node_modules/lodash/toString.js文件,只需要遵循以下几步即可优雅完成修改:

第一步:安装依赖

yarn add patch-package postinstall-postinstall -D

第二步:修改node_modules/lodash/toString.js文件

functiontoString(value){console.log(it works!!!);// 这里插入一行代码returnvalue==null?:baseToString(value);}module.exports=toString;

第三步:生成修改文件

npx patch-package lodash

这一步运行后会生成patches/lodash+4.17.21.patch,目录结构变成下面这样:

├── node_modules  
│    └── lodash         
│        └── toString.js 
├── patches                     
│    └── lodash+4.17.21.patch
├── src                     
│    └── app.js
└── package.json

其中 .patch 文件内容如下:

diff --git a/node_modules/lodash/toString.js b/node_modules/lodash/toString.jsindex daaf681..8308e76 100644--- a/node_modules/lodash/toString.js+++ b/node_modules/lodash/toString.js@@ -22,6 +22,7 @@ var baseToString = require(./_baseToString);* // => 1,2,3
  */
 function toString(value) {+  console.log(it works!!!);return value == null ?  : baseToString(value);
 }

第四步:修改package.json文件

"scripts":{+"postinstall":"patch-package"}

最后重装一下依赖,测试最终效果:

rm -rf node_modules
yarn
node ./src/app.js

// it works!!!
// 123

可以看到,即便重装依赖,我们对node_modules下代码的修改还是被patch-package还原并最终生效。

至此我们便完成一次临时打补丁的操作,不过这并非真正优雅的长久之计,长期看还是需要彻底修复第三方包缺陷并逐步移除项目中的.patch文件。

参考资料:

分享到:

  admin

注册时间:

网站:0 个   小程序:3 个  文章:0 篇

  • 462

    网站

  • 9

    小程序

  • 3610

    文章

  • 113

    会员

赶快注册账号,推广您的网站吧!
热门网站
最新入驻小程序

跳一跳2022-08-22

跳一跳是微信开发的一款小游戏,有

数独大挑战2018-06-03

数独一种数学游戏,玩家需要根据9

答题星2018-06-03

您可以通过答题星轻松地创建试卷

全阶人生考试2018-06-03

各种考试题,题库,初中,高中,大学四六

运动步数有氧达人2018-06-03

记录运动步数,积累氧气值。还可偷

每日养生app2018-06-03

每日养生,天天健康