предисловие
иногда используетсяnpmна упаковке обнаружил, что естьbug, мы знаем, как изменить его, но другие могут не иметь возможности обновлять его какое-то время или из-за наших особых потребностей другие не хотят его изменять. В настоящее время мы можем сделать это только сами. Так как же нам модифицировать чужой исходный код? Во-первых, непосредственно изменитьnode_modulesФайлы внутри не очень, а зависимости пропадут после переустановки. Есть два широко используемых метода:
- Скачай чужой код на локалку, вставь
srcКаталог, импортированный вручную после модификации. -
forkЧужой код на свой склад, после модификации установить этот плагин со своего склада.
Недостаток этих двух способов в том, что обновлять хлопотно, нам нужно каждый раз вручную обновлять код, и нельзя обновляться синхронно с плагином. Если код, который мы хотим изменить, является лишь небольшим модулем кого-то другого, а большая часть остального кода не перемещается, в настоящее время существует очень спекулятивная операция: использоватьwebpack aliasдля покрытия чужого кода.
Роль псевдонима webpack
webpack aliasОбычно используется для настройки псевдонимов пути, чтобы мы могли написать меньше кода пути:
chainWebpack: config => {
config.resolve.alias
.set('@', resolve('src'))
.set('#', resolve('src/views/page1'))
.set('&', resolve('src/views/page2'));
},
То есть,webpack aliasзаменит "сокращенный путь", который мы написали, и будетnode_modulesФайлы внутри также действительны. В настоящее время мы можем заменить путь модуля, на который указывает ссылка, в исходном коде других на наш собственный файл.
Конкретные операции заключаются в следующем:
- Найдите модуль, который нужно изменить в чужом исходном коде, скопируйте код в
srcсодержание - изменить
bug, обратите внимание, что другие файлы, на которые он ссылается, должны быть записаны как абсолютные пути - Найдите путь, по которому импортируется этот модуль (Путь, который нам нужно перехватить)
- настроить
webpack alias
Сделайте это на практике
кqiankunобрамленныйpatchersПример модуля:
Путь, на который ссылается файл:./patchers(путь, который мы хотим перехватить)
Содержимое файла:
скопировать содержимое вsrc/assets/patchers.js, изменить егоimportПуть абсолютный и добавляем наш код:
настроить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это имя файла, который он генерирует.
конец
Хотя этот метод умозрительный и имеет много ограничений, это также очень полезно. Технология нуждается в постоянном разведке. Если есть какие-либо проблемы или ошибки, пожалуйста, укажите их!