有时候使用npm
上的包,发现有bug
,咱们知道如何修改,可是别人可能一时半会无法更新,或者是咱们特殊需求,别人不肯意修改,这时候咱们只能本身动手丰衣足食。那么咱们应该如何修改别人的源码呢?首先,直接修改node_modules
里面的文件是不太行的,从新安装依赖就没有了。通常经常使用办法有两个:vue
src
目录,修改后手动引入。fork
别人的代码到本身仓库,修改后,从本身仓库安装这个插件。这两个办法的缺陷就是:更新麻烦,咱们每次都须要手动去更新代码,没法与插件同步更新。若是咱们要修改的代码仅仅是别人的一个小模块,其余大部分代码都不动,这时候有一个很投机的操做:利用 webpack alias
来覆盖别人代码。node
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
src
目录bug
,注意里面引用其余的文件都须要写成绝对路径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
里面的文件更方便
步骤也很简单:
patch-package
:npm i patch-package --save-dev
package.json
,新增命令postinstall
:"scripts": {
+ "postinstall": "patch-package"
}
复制代码
node_modules
里面的代码npx patch-package qiankun
。第一次使用patch-package
会在项目根目录生成patches
文件夹,里面有修改过的文件diff
记录。
当这个包版本更新后,执行命令:git apply --ignore-whitespace patches/qiankun+2.0.11.patch
便可。其中qiankun+2.0.11.patch
是它生成的文件名。
这个办法虽然投机,也有不少局限性,可是也很好用,技术就是须要不断的探索。有什么问题或者错误,欢迎指出!