網(wǎng)站首頁 編程語言 正文
為啥要修改
有時(shí)候使用npm上的包,發(fā)現(xiàn)有bug,我們知道如何修改,但是別人可能一時(shí)半會(huì)沒法更新,或者是我們特殊需求,別人不愿意修改,這時(shí)候我們只能自己動(dòng)手豐衣足食。
那么我們應(yīng)該如何修改別人的源碼呢?首先,直接修改node_modules里面的文件是不太行的,重新安裝依賴就沒有了。
一般常用辦法有兩個(gè):
- 下載別人代碼到本地,放在src目錄,修改后手動(dòng)引入。
- fork別人的代碼到自己倉庫,修改后,從自己倉庫安裝這個(gè)插件。
這兩個(gè)辦法的缺陷就是:
- 更新麻煩,我們每次都需要手動(dòng)去更新代碼,無法與插件同步更新。
- 如果我們要修改的代碼僅僅是別人的一個(gè)小模塊,其他大部分代碼都不動(dòng),這時(shí)候有一個(gè)很投機(jī)的操作:利用 webpack alias 來覆蓋別人代碼。
webpack alias會(huì)替換我們寫的“簡(jiǎn)寫路徑”,并且它對(duì)node_modules里面的文件也是生效的。 我們可以將別人源碼里面引用模塊的路徑替換成我們自己的文件。
chainWebpack: config => {
? ? config.resolve.alias
? ? ? .set('@', resolve('src'))
? ? ? .set('#', resolve('src/views/page1'))
? ? ? .set('&', resolve('src/views/page2'));
},
? 具體操作如下:
- 找到別人源碼里面的需要修改的模塊,復(fù)制代碼到src目錄
- 修改其中的bug,注意里面引用其他的文件都需要寫成絕對(duì)路徑
- 找到這個(gè)模塊被引入的路徑(我們需要攔截的路徑)
- 配置webpack alias </aside>
實(shí)際操作
// qiankun
// 新建文件 src/assets/patchers.js
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
/**
* @author Kuitos
* @since 2019-04-11
*/
import { SandBoxType } from 'qiankun/es/interfaces';
import patchDynamicAppend from 'qiankun/es/sandbox/patchers/dynamicAppend';
import patchHistoryListener from 'qiankun/es/sandbox/patchers/historyListener';
import patchInterval from 'qiankun/es/sandbox/patchers/interval';
import patchWindowListener from 'qiankun/es/sandbox/patchers/windowListener';
import patchUIEvent from 'qiankun/es/sandbox/patchers/UIEvent';
console.log('patchers.js');
export function patchAtMounting(appName, elementGetter, sandbox, singular) {
? var _patchersInSandbox;
? var _a;
? var basePatchers = [function () {
? ? return patchInterval();
? }, function () {
? ? return patchWindowListener();
? }, function () {
? ? return patchHistoryListener();
? }, function () {
? ? return patchDynamicAppend(appName, elementGetter, sandbox.proxy, true, singular);
? }];
? var patchersInSandbox = (_patchersInSandbox = {}, _defineProperty(_patchersInSandbox, SandBoxType.LegacyProxy, [].concat(basePatchers, [function () {
? ? return patchUIEvent(sandbox.proxy);
? }])), _defineProperty(_patchersInSandbox, SandBoxType.Proxy, [].concat(basePatchers, [function () {
? ? return patchUIEvent(sandbox.proxy);
? }])), _defineProperty(_patchersInSandbox, SandBoxType.Snapshot, basePatchers), _patchersInSandbox);
? return (_a = patchersInSandbox[sandbox.type]) === null || _a === void 0 ? void 0 : _a.map(function (patch) {
? ? return patch();
? });
}
export function patchAtBootstrapping(appName, elementGetter, sandbox, singular) {
? var _patchersInSandbox2;
? var _a;
? var basePatchers = [function () {
? ? return patchDynamicAppend(appName, elementGetter, sandbox.proxy, false, singular);
? }];
? var patchersInSandbox = (_patchersInSandbox2 = {}, _defineProperty(_patchersInSandbox2, SandBoxType.LegacyProxy, basePatchers), _defineProperty(_patchersInSandbox2, SandBoxType.Proxy, basePatchers), _defineProperty(_patchersInSandbox2, SandBoxType.Snapshot, basePatchers), _patchersInSandbox2);
? return (_a = patchersInSandbox[sandbox.type]) === null || _a === void 0 ? void 0 : _a.map(function (patch) {
? ? return patch();
? });
}
配置webpack
const path = require('path');
module.exports = {
? chainWebpack: config => {
? ? config.resolve.alias
? ? ? .set('./patchers', path.resolve(__dirname, 'src/assets/patchers.js'))
? }
};
使用
import { patchAtBootstrapping } from "./patchers";
原文鏈接:https://blog.csdn.net/SeriousLose/article/details/122286371
相關(guān)推薦
- 2022-11-04 ASP.NET?MVC使用正則表達(dá)式驗(yàn)證手機(jī)號(hào)碼_實(shí)用技巧
- 2022-07-22 Python動(dòng)態(tài)屬性有什么用
- 2022-04-09 Oracle?19c?RAC?手工建庫的搭建過程_oracle
- 2022-04-09 MyBatis 查詢返回?cái)?shù)據(jù)類型Map,空字段數(shù)據(jù)不返回
- 2021-12-09 Quartz在.NET中的使用教程_實(shí)用技巧
- 2022-10-25 在IIS上部署Go?API項(xiàng)目_win服務(wù)器
- 2022-10-07 numpy拼接矩陣的實(shí)現(xiàn)_python
- 2022-01-29 yii 關(guān)聯(lián)表外鍵用法
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支