详解如何修改 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 相关文章推荐
url 编码 js url传参中文乱码解决方案
Apr 11 Javascript
Node.js的包详细介绍
Jan 14 Javascript
js变形金刚文字特效代码分享
Aug 20 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
Jan 04 Javascript
微信小程序 css使用技巧总结
Jan 09 Javascript
React中常见的动画实现的几种方式
Jan 10 Javascript
vue地区选择组件教程详解
May 04 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
May 27 Javascript
jquery中为什么能用$操作
Jun 18 jQuery
jQuery实现简单评论功能
Aug 19 jQuery
vue-admin-template配置快捷导航的代码(标签导航栏)
Sep 04 Javascript
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
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
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
php截取中文字符串函数实例
2015/02/23 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
简单实现js放大镜效果
2017/07/24 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
JS实现分页导航效果
2020/02/19 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
python3将变量写入SQL语句的实现方式
2020/03/02 Python
在TensorFlow中实现矩阵维度扩展
2020/05/22 Python
Python sublime安装及配置过程详解
2020/06/29 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
最受欢迎的自我评价
2013/12/22 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
会计系毕业生求职信
2014/05/28 职场文书
党的生日活动方案
2014/08/15 职场文书
《植树问题》教学反思
2016/03/03 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python