最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 如何“优雅”地修改 node_modules 下的代码? - 掘金

    正文概述 掘金(王力国)   2021-10-24   580

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

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

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

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

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

    如何“优雅”地修改 node_modules 下的代码? - 掘金

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

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

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

    node_modules/lodash/toString.js

    var baseToString = require('./_baseToString')
    
    function toString(value) {
      return value == null ? '' : baseToString(value);
    }
    
    module.exports = toString;
    

    src/app.js

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

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

    第一步:安装依赖

    yarn add patch-package postinstall-postinstall -D
    

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

    function toString(value) {
    	console.log('it works!!!'); // 这里插入一行代码
      return value == 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.js
    index 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 文件。

    参考资料:

    • github.com/ds300/patch…

    起源地下载网 » 如何“优雅”地修改 node_modules 下的代码? - 掘金

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元