網站首頁 編程語言 正文
為啥要修改
有時候使用npm上的包,發現有bug,我們知道如何修改,但是別人可能一時半會沒法更新,或者是我們特殊需求,別人不愿意修改,這時候我們只能自己動手豐衣足食。
那么我們應該如何修改別人的源碼呢?首先,直接修改node_modules里面的文件是不太行的,重新安裝依賴就沒有了。
一般常用辦法有兩個:
- 下載別人代碼到本地,放在src目錄,修改后手動引入。
- fork別人的代碼到自己倉庫,修改后,從自己倉庫安裝這個插件。
這兩個辦法的缺陷就是:
- 更新麻煩,我們每次都需要手動去更新代碼,無法與插件同步更新。
- 如果我們要修改的代碼僅僅是別人的一個小模塊,其他大部分代碼都不動,這時候有一個很投機的操作:利用 webpack alias 來覆蓋別人代碼。
webpack alias會替換我們寫的“簡寫路徑”,并且它對node_modules里面的文件也是生效的。 我們可以將別人源碼里面引用模塊的路徑替換成我們自己的文件。
chainWebpack: config => {
? ? config.resolve.alias
? ? ? .set('@', resolve('src'))
? ? ? .set('#', resolve('src/views/page1'))
? ? ? .set('&', resolve('src/views/page2'));
},
? 具體操作如下:
- 找到別人源碼里面的需要修改的模塊,復制代碼到src目錄
- 修改其中的bug,注意里面引用其他的文件都需要寫成絕對路徑
- 找到這個模塊被引入的路徑(我們需要攔截的路徑)
- 配置webpack alias </aside>
實際操作
// 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
相關推薦
- 2022-06-10 C語言?模擬實現strcpy與strcat函數詳解_C 語言
- 2022-11-07 Android內置SQLite的使用詳細介紹_Android
- 2022-05-06 Sqlite 刪除數據后為什么文件大小不變
- 2023-05-31 Pandas.DataFrame刪除指定行和列(drop)的實現_python
- 2023-05-19 Python基于TensorFlow接口實現深度學習神經網絡回歸_python
- 2022-06-14 go語言中的udp協議及TCP通訊實現示例_Golang
- 2022-10-13 Python線性表種的單鏈表詳解_python
- 2022-03-22 C++對象與繼承使用中一些問題介紹_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支