1. Предпосылки
История разворачивается из ежедневной совместной разработки команды и используется всей командойreact + antd4
Создайте фронтальную страницу, которую я нашел в разработкеantd4.9.*
версияInput.TextArea
Есть ошибка компонентов, производительность ошибкаmaxLength
Ограничение атрибута не соответствует ожиданиям. При вводе китайских иероглифов этот атрибут будет ограничивать количество предварительно введенных слов пиньинь, соответствующих китайскому языку, что блокирует ввод длины китайских иероглифов. Проверив проблему с репозиторием github и соответствующий журнал изменений, мы обнаружили, что ошибка официально исправлена в версии v4.15.*.
Когда я сталкиваюсь с такой проблемой, как и большинство людей, первое, о чем я думаю, это обновить и тд до последней версии, поэтому я ничего не говорю о работе.После обновления проблема решена~
Но действительно ли проблема решена? Часто все не так гладко, как ожидалось. Я думал, что волна счастливых обновлений отлично решила проблему, но после недели хорошего времени одноклассник А прислал привет: «Я нашел иv4.15.3
В версии есть ошибка,upload
компонент вwindows
не может вызватьbeforeUpload
Крюк, новую функцию торопился проверить, поэтому поставил антд на версию 4.9.4". Такие плохие новости, естественно, вызвали большой дискомфорт в моем сердце. Между дилеммой и дилеммой, я слышал об этом раньше, но было лень попробовать.ПластырьДафа, начни операцию, не говоря ни слова.
2. Исправьте пакет npm
1. Установите патч-пакет
npm i patch-package --save-dev
2. Измените пакет npm
Чтобы избежать неизвестных ошибок в других компонентах до версии 4.15.3, мы исправляем компонент загрузки на основе версии 4.15.3 в этом патче.
Откройте целевой код проектаnode_modules
Папка, подтвердите, что это версия 4.15.3
Откройте неиспользуемый проект, установите версию v4.9.4, а также откройте каталог antd.
Используйте метод копирования, чтобы скопировать код компонента загрузки, который мы хотим изменить с 4.9.4 на 4.15.3, а затемnpm run dev
Запустите проект и проверьте, исправлена ли ошибка компонента загрузки.
3. Создайте патч
Было подтверждено, что эффект, как и ожидалось, в настоящее времяcd
Перейдите к записи Genmu и выполните следующую команду для создания файла исправления:
npx patch-package antd
На этом этапе вы получите следующие файлы в корневом каталоге
очень любопытный.patch
Что это за файл, вы можете сразу увидеть, когда откроете файл, на самом деле это какой-тоgit diff
Запишите описание, патч впринципе вот-вот выйдет ——patch-package
будет текущимnode_modules
Приведенный ниже исходный код сравнивается с оригинальным исходным кодом.git diff
, и создайтеpatch
патч-файл.
4. Добавьте управление версиями
Пока файл исправления создан, нам нужно отправить его наgit
, просто выполняйте обычные операции git напрямую:
git add patches/antd+4.15.3.patch
git commit -m "feat:添加antd补丁"
git push
5. Улучшить npm-скрипты
Как применить патч, когда другие коллеги тянут код? На основании вышеперечисленных операций мыnpm install
после казниpatch-package
Команда, этот процесс можно использоватьnpm script
понял, вpackage.json
изscript
Добавьте следующие поля и содержимое:
{
"postinstall":"patch-package"
}
Выполните завершенную «установку зависимостей -> выпуск сборки», все, как и ожидалось, и все готово ~
3. Другие способы
Я на самом деле хочу просто изменитьnpm
Пакетный метод — это не только патч-пакет, представленный в этой статье, но и, сравнивая другие методы, мы можем почувствовать, почему патч-пакет является оптимальным решением.
1. Метод модификации одним файлом
Принцип заключается в том, чтобы сначала найти тот, который нужно изменить.npm
package, сначала скопируйте этот файл в каталог проекта, затем измените содержимое файла и используйте
- копировать-перезаписывать
все еще используюpostinstall
Этот хук, выполнить в этом хукеcp
измененный файл./node_modules/包名/原始文件
скопировать прошлое, в конце концовnode_modules
Файл ниже становится измененным файлом, и приложение в этом примере antd выглядит следующим образом:
"scripts": {
"postinstall": "cp ./patches/upload/* ./node_modules/antd/lib/"
}
То есть логика перезаписи исходного файла измененным файлом выполняется после каждой установки пакета.
- Измененный закон о цитировании
настроитьwebpack alias
псевдоним, например'原始文件的引用路径': '修改后文件的引用路径'
, так что ссылка на окончательный измененный файл выглядит следующим образом:
resolve: {
alias: {
'antd/upload': path.resolve(__dirname, './patched/upload/*'),
}
}
2. Общий метод копирования проекта
Скопируйте весь исходный код проекта пакета, который нужно изменить, измените его, а затем используйте
-
прямое цитирование
Используйте готовый исходный код напрямую и больше не ссылайтесь на него через пакеты npm.
-
Опубликовать закон о частной библиотеке
Это подходит для сценария, когда один пакет npm используется несколькими проектами.Измененный исходный код может быть выпущен в частный репозиторий npm для использования в проекте, так что нескольким проектам нужно изменить исходный код только один раз.
3. Метод модификации внешнего кода
Этот метод напрямую не модифицируетсяnode_modules
Исходный код, но использование функций js при выполнении изменяет внутренние свойства этого пакета для достижения цели.
Проще говоря, используйтеdefineProperty
,prototype
и другие характеристики изменяют классы в пакете, например,Vue2.0
используется вdefineProperty
Сделать экземпляр компонента数据劫持和代理
. В проекте vue мы также частоmain.js
середина, чтобы датьVue根实例
пройти черезVue.prototype.xxx=xxxx
Перехватите некоторые глобальные свойства и методы.
4, преимущество пакета исправлений
Хотя использование вышеперечисленных трех методов может решить проблемы в некоторых конкретных сценариях с помощью некоторых хитрых операций, их нельзя избежать.版本升级
Если пакет npm будет обновлен, это может привести к ошибкам в исходной модификации, поэтому, если вы хотите использовать три вышеуказанных метода, лучше всего записать номер версии насмерть. Тем не менее, patch-package имеет следующие особенности:
-
пробная версия и ошибка
Если версия установленного вами пакета отличается от версии, записанной в ранее сгенерированном патче,
npx patch-package
сообщит об ошибке напрямую**ERROR** Failed to apply patch for package xxxx at path
, с помощью подсказки вам будет легче найти проблему -
сэкономить место
использовать
git diff
Переопределенный метод для записи патча, чем источник большего пространства,即安全
,又便捷
Суммировать
Благодаря введению этой статьи, я считаю, что выpatch-package
При хорошем понимании его можно элегантно решить в ежедневном развитии.鱼和熊掌不可兼得
Однако, хотя пластырь может укрыть от ветра, он не такой теплый, как новая одежда.Когда возникает проблема, лучше искать наиболее фундаментальное решение по формальным каналам, таким как предоставление официального совета.issue
И обращайте внимание на обновления версий и исправления ошибок, чтобы вовремя обновлять или удалять патчи. Пусть пятно мира сменится на новую одежду как можно скорее~