如何修改 node_modules 里的文件(同事看了直呼内行)

前言

有时候使用npm上的包,发现有bug,咱们知道如何修改,可是别人可能一时半会无法更新,或者是咱们特殊需求,别人不肯意修改,这时候咱们只能本身动手丰衣足食。那么咱们应该如何修改别人的源码呢?首先,直接修改node_modules里面的文件是不太行的,从新安装依赖就没有了。通常经常使用办法有两个:vue

  1. 下载别人代码到本地,放在src目录,修改后手动引入。
  2. fork别人的代码到本身仓库,修改后,从本身仓库安装这个插件。

这两个办法的缺陷就是:更新麻烦,咱们每次都须要手动去更新代码,没法与插件同步更新。若是咱们要修改的代码仅仅是别人的一个小模块,其余大部分代码都不动,这时候有一个很投机的操做:利用 webpack alias 来覆盖别人代码。node

webpack alias 的做用

webpack alias通常用来配置路径别名,使咱们能够少写路径代码:webpack

chainWebpack: config => {
    config.resolve.alias
      .set('@', resolve('src'))
      .set('#', resolve('src/views/page1'))
      .set('&', resolve('src/views/page2'));
},
复制代码

也就是说,webpack alias会替换咱们写的“简写路径”,而且它对node_modules里面的文件也是生效的。这时候咱们能够将别人源码里面引用模块的路径替换成咱们本身的文件。git

具体操做以下:web

  1. 找到别人源码里面的须要修改的模块,复制代码到src目录
  2. 修改其中的bug,注意里面引用其余的文件都须要写成绝对路径
  3. 找到这个模块被引入的路径(咱们须要拦截的路径
  4. 配置webpack alias

实际操做一下

qiankun框架的patchers模块为例:vue-cli

文件被引用的路径为:./patchers(咱们要拦截的路径)npm

文件内容为:json

复制内容到src/assets/patchers.js,修改其 import 路径为绝对路径,并添加咱们的代码:app

配置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'))
  }
};

复制代码

运行代码,控制台打印成功,代表咱们已经成功覆盖别人的代码,并且别人的代码有更新时,咱们也能够同步更新,只是这个模块的代码使用咱们自定义的。打包以后也是能够的。

补充:使用patch-package来修改

经掘友 @Leemagination 指点,使用patch-package来修改node_modules里面的文件更方便

步骤也很简单:

  1. 安装patch-packagenpm i patch-package --save-dev
  2. 修改package.json,新增命令postinstall:
"scripts": {
+ "postinstall": "patch-package"
 }
复制代码
  1. 修改node_modules里面的代码
  2. 执行命令:npx patch-package qiankun

第一次使用patch-package会在项目根目录生成patches文件夹,里面有修改过的文件diff记录。

当这个包版本更新后,执行命令:git apply --ignore-whitespace patches/qiankun+2.0.11.patch便可。其中qiankun+2.0.11.patch是它生成的文件名。

结尾

这个办法虽然投机,也有不少局限性,可是也很好用,技术就是须要不断的探索。有什么问题或者错误,欢迎指出!

相关文章
相关标签/搜索