详解如何修改 node_modules 里的文件


Posted in Javascript onMay 22, 2020

前言

有时候使用npm上的包,发现有bug,我们知道如何修改,但是别人可能一时半会没法更新,或者是我们特殊需求,别人不愿意修改,这时候我们只能自己动手丰衣足食。那么我们应该如何修改别人的源码呢?首先,直接修改node_modules里面的文件是不太行的,重新安装依赖就没有了。一般常用办法有两个:

  • 下载别人代码到本地,放在src目录,修改后手动引入。
  • fork别人的代码到自己仓库,修改后,从自己仓库安装这个插件。

这两个办法的缺陷就是:更新麻烦,我们每次都需要手动去更新代码,无法与插件同步更新。如果我们要修改的代码仅仅是别人的一个小模块,其他大部分代码都不动,这时候有一个很投机的操作:利用 webpack alias 来覆盖别人代码。

webpack alias 的作用

webpack alias一般用来配置路径别名,使我们可以少写路径代码:

chainWebpack: config => {
  config.resolve.alias
   .set('@', resolve('src'))
   .set('#', resolve('src/views/page1'))
   .set('&', resolve('src/views/page2'));
},

也就是说,webpack alias会替换我们写的“简写路径”,并且它对node_modules里面的文件也是生效的。这时候我们可以将别人源码里面引用模块的路径替换成我们自己的文件。
具体操作如下:

  1. 找到别人源码里面的需要修改的模块,到src目录
  2. 修改其中的bug,注意里面引用其他的文件都需要写成绝对路径
  3. 找到这个模块被引入的路径(我们需要拦截的路径)
  4. 配置webpack alias

实际操作一下

以qiankun框架的patchers模块为例:

详解如何修改 node_modules 里的文件

文件被引用的路径为:./patchers(我们要拦截的路径)

详解如何修改 node_modules 里的文件

文件内容为:

详解如何修改 node_modules 里的文件

复制内容到src/assets/patchers.js,修改其 import 路径为绝对路径,并添加我们的代码:

详解如何修改 node_modules 里的文件

配置webpack alias(我用的是vue-cli4,配置文件是vue.config.js):

const path = require('path');
module.exports = {
 chainWebpack: config => {
  config.resolve.alias
   .set('./patchers', path.resolve(__dirname, 'src/assets/patchers.js'))
 }
};

运行代码,控制台打印成功,表明我们已经成功覆盖别人的代码,而且别人的代码有更新时,我们也可以同步更新,只是这个模块的代码使用我们自定义的。打包之后也是可以的。

详解如何修改 node_modules 里的文件

补充:使用patch-package来修改

经掘友 @Leemagination 指点,使用patch-package来修改node_modules里面的文件更方便

步骤也很简单:

  1. 安装patch-package:npm i patch-package --save-dev
  2. 修改package.json,新增命令postinstall:
"scripts": {
+ "postinstall": "patch-package"
 }

修改node_modules里面的代码

执行命令:npx patch-package qiankun。

第一次使用patch-package会在项目根目录生成patches文件夹,里面有修改过的文件diff记录。

详解如何修改 node_modules 里的文件

当这个包版本更新后,执行命令:git apply --ignore-whitespace patches/qiankun+2.0.11.patch即可。其中qiankun+2.0.11.patch是它生成的文件名。

结尾

这个办法虽然投机,也有很多局限性,但是也很好用,技术就是需要不断的探索。有什么问题或者错误,欢迎指出!

到此这篇关于详解如何修改 node_modules 里的文件的文章就介绍到这了,更多相关node_modules 修改内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
通过Javascript创建一个选择文件的对话框代码
Jun 16 Javascript
js+JQuery返回顶部功能如何实现
Dec 03 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 Javascript
png在IE6 下无法透明的解决方法汇总
May 21 Javascript
js限制文本框只能输入中文的方法
Aug 11 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
Jan 04 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 Javascript
jquery实现图片列表鼠标移入微动
Dec 01 Javascript
angularjs http与后台交互的实现示例
Dec 21 Javascript
JavaScript中的相等操作符使用详解
Dec 21 Javascript
jstree中的checkbox默认选中和隐藏示例代码
Dec 29 Javascript
JavaScript进阶(一)变量声明提升实例分析
May 09 Javascript
Node.js API详解之 readline模块用法详解
May 22 #Javascript
vue+canvas实现移动端手写签名
May 21 #Javascript
基于canvas实现手写签名(vue)
May 21 #Javascript
jQuery实现移动端笔触canvas电子签名
May 21 #jQuery
js cavans实现静态滚动弹幕
May 21 #Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
May 21 #Javascript
JavaScript实现HSL拾色器
May 21 #Javascript
You might like
第四节--构造函数和析构函数
2006/11/16 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
javascript生成json数据简单示例分享
2014/02/14 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
Python 去除字符串中指定字符串
2020/03/05 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
Python 中Operator模块的使用
2021/01/30 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
会计专业自我鉴定范文
2013/12/29 职场文书
亲子读书活动方案
2014/02/22 职场文书
作文评语大全
2014/04/23 职场文书
擅自离岗检讨书
2014/09/12 职场文书
入党积极分子考察意见
2015/06/02 职场文书
高中班主任心得体会
2016/01/07 职场文书
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript