详解如何修改 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 相关文章推荐
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
javascript:void(0)的作用示例介绍
Oct 28 Javascript
JavaScript DOM事件(笔记)
Apr 08 Javascript
jQuery实现的Div窗口震动效果实例
Aug 07 Javascript
详解JavaScript中的4种类型识别方法
Sep 14 Javascript
AngularJS通过$location获取及改变当前页面的URL
Sep 23 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
Feb 10 Javascript
Node.js使用MySQL连接池的方法实例
Feb 11 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
Aug 17 Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
Element Notification通知的实现示例
Jul 27 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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
请php正则走开
2008/03/15 PHP
Yii框架登录流程分析
2014/12/03 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
Vue异步加载about组件
2017/10/31 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
python操作字典类型的常用方法(推荐)
2016/05/16 Python
python正则表达式的使用
2017/06/12 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
机械专业应届生求职信
2013/09/21 职场文书
企划经理的岗位职责
2013/11/17 职场文书
超市国庆节促销方案
2014/02/20 职场文书
师恩难忘教学反思
2014/04/27 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
居安思危观后感
2015/06/11 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技