详解如何修改 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的25个步骤 千倍级效率提升
Feb 11 Javascript
javascript 广告后加载,加载完页面再加载广告
Nov 25 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
Dec 23 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
Jan 10 Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 Javascript
实例详解ECMAScript5中新增的Array方法
Apr 05 Javascript
详解react-router如何实现按需加载
Jun 15 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 Javascript
微信小程序 swiper组件构建轮播图的实例
Sep 20 Javascript
jquery简单实现纵向的无缝滚动代码实例
Apr 01 jQuery
Vue 实现登录界面验证码功能
Jan 03 Javascript
Vuejs中的watch实例详解(监听者)
Jan 05 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
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
php时区转换转换函数
2014/01/07 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
PHP crc32()函数讲解
2019/02/14 PHP
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
Python中的异常处理学习笔记
2015/01/28 Python
python 文件转成16进制数组的实例
2018/07/09 Python
使用tensorflow实现线性回归
2018/09/08 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
车间副主任岗位职责
2013/12/24 职场文书
给物业的表扬信
2014/01/21 职场文书
《尊严》教学反思
2014/02/11 职场文书
机关党员公开承诺书
2014/08/30 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
文明单位申报材料
2014/12/23 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
python某漫画app逆向
2021/03/31 Python
MySQL系列之二 多实例配置
2021/07/02 MySQL
python在package下继续嵌套一个package
2022/04/14 Python
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js