详解如何修改 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 相关文章推荐
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
浅谈JavaScript函数节流
Dec 09 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
Apr 15 Javascript
bootstrap实现弹窗和拖动效果
Jan 03 Javascript
在web中js实现类似excel的表格控件
Sep 01 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
Vue中之nextTick函数源码分析详解
Oct 17 Javascript
ReactNative之FlatList的具体使用方法
Nov 29 Javascript
javascript中函数的写法实例代码详解
Oct 28 Javascript
Node.js如何对SQLite的async/await封装详解
Feb 14 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
Sep 06 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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
PHP MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
Script的加载方法小结
2011/01/12 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
3种vue组件的书写形式
2017/11/29 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
详解vue高级特性
2020/06/09 Javascript
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
linecache模块加载和缓存文件内容详解
2018/01/11 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
python3.7 sys模块的具体使用
2019/07/22 Python
jupyter notebook实现显示行号
2020/04/13 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
jupyter 添加不同内核的操作
2021/02/06 Python
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
大学生职业生涯规划书范文
2014/01/14 职场文书
高中学生期末评语
2014/04/25 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
公司委托书格式范文
2014/10/09 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
教师个人师德总结
2015/02/06 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书