详解如何修改 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.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
Oct 11 Javascript
JQuery查找DOM节点的方法
Jun 11 Javascript
js随机生成字母数字组合的字符串 随机动画数字
Sep 02 Javascript
全面解析Bootstrap布局组件应用
Feb 22 Javascript
js 上传文件预览的简单实例
Aug 16 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
Nov 28 Javascript
原生JS实现的雪花飘落动画效果
May 03 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
Aug 17 Javascript
微信小程序使用template标签实现五星评分功能
Nov 03 Javascript
JavaScript中callee和caller的区别与用法实例分析
Jun 28 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
May 12 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
Jul 17 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
coreseek 搜索英文的问题详解
2013/06/08 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
基于jquery的拖动布局插件
2011/11/25 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
JavaScript知识点整理
2015/12/09 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
vue内置指令详解
2018/04/03 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python中http请求方法库汇总
2016/01/06 Python
python生成验证码图片代码分享
2016/01/28 Python
python文件与目录操作实例详解
2016/02/22 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
django缓存配置的几种方法详解
2018/07/16 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
缓刑人员思想汇报
2014/10/11 职场文书
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python