Привет всем, вот сок, я был занят обновлением структуры компании в начале года, и написание статьи было отложено, мне очень жаль. Я считаю, что все знают название, да! Все наши проекты используютVite
рефакторинг, удаление громоздкогоwebpack
, чтобы встретить новую эру развития. Я записал все ямы, с которыми мы столкнулись во время реконструкции, и отдал сообществу, надеюсь, что те, кто читал эту статью, не будут наступать на ямы повторно.
Почему выбирают Вите?
видел меня раньшестатьяДетская обувь должна знать, я читалvite1.x
Исходники версии, если честно на тот моментvite
больше похоже на экспериментdemo
формы, от производственной среды еще далеко, но я все еще уделяю внимание самому проекту, пока2021.2.17,vite
опубликовано2.0.0-release
Сам проект такжеRollupБыло проведено углубленное сотрудничество, был проведен рефакторинг базового кода и внедрен механизм подключаемых модулей.Vite
не только дляVue
Он стал настоящим кросс-фреймовым сервером разработки.
Увидев это, я думаю, что пора! С ростом количества предприятий эффективность локальной разработки проекта становится все ниже и ниже, сохраняйте код,webpack
На упаковку и обновление уходит несколько секунд, что действительно невыносимо. Скорость онлайн-упаковки также становится все медленнее и медленнее, что серьезно влияет на эффективность итерации!Vite
Просто чтобы решить эти болевые точки, чтобы легче справиться с будущим бизнесом, мы решили использоватьVite
Рефакторинг всего проекта.
Рекорд пит-пита
Но идеалы прекрасны, а реальность бьет меня по лицу, потому чтоVite
Экосистема еще не поднялась, и большинство проблем еще нужно избегать самих себя.Вот некоторые из наиболее очевидных ям, с которыми мы столкнулись во время реконструкции нашего проекта.
Uncaught ReferenceError: require is not defined
проблема вызывает
Эта проблема должна быть одной из самых распространенных проблем, потому чтоVite
полностью зависит отESM
Врожденная способность, то есть он знает толькоimport
,потому чтоVite
полагатьсяscript
изmodule
Атрибуты. Наш код в конечном итоге будет отправлен в браузер для выполнения,require
даcjs
Ключевое слово, сама среда браузера не определяет этот метод, и естественно сообщается об ошибке. здесь иwebpack
Разные,webpack
Перед отправкой файла в браузер он будет предварительно упакован.require
Преобразован в метод, совместимый с браузером.
Решение
В настоящее время нет особенно хорошего способа, если он полезен в модуле, написанном вамиrequire
ключевое слово, нужно заменить наimport
, но если это сторонний модуль, если он используется в пакетеrequire
Решения может не быть. Пакеты, встречающиеся в текущем проекте, включаютreact-intl
,bizcharts
Подождите, если вы также используете их в своем проекте, вы можете попробовать найти пакет для замены.
Кстати,
antd
Импорт стилей не работает сcss.js
Импорт, потому что он используется в немrequire
кавычки ключевых словless
файл, браузер также не сможет.
Методы, связанные с узлом, недоступны
проблема вызывает
Это также связано с тем, что он отправляется прямо в браузер без предварительной обработки, такой какprocess,eventЭтиnode
Объекты не могут найти определение в браузере.
Решение
Можно сделать с помощью совместимых с браузером пакетов сообщества.polyfill, в настоящее время используется в основном в авторском проектеprocess,event,processМожно использоватьprocess-es6делай совместимые.
import process from 'process-es6/browser.js'
//浏览器里赋值给 window
global.process = process
eventв состоянии пройтиeventsЧтобы быть совместимым, просто установите его, никаких дополнительных настроек не требуется.
xxx does not provide an export named 'xxx'
проблема вызывает
Большинство сторонних пакетовcjs
Экспортируется, то есть существует только один экспортный порт, напримерaxios
,jquery
,lodash
и т. д., они экспортируются вот так.
module.exports = require('./xxx');
Очевидно, что это не может бытьVite
выявлено, потому чтоVite
только поддержкаESM
Метод экспорта этой части стороннего пакета должен быть совместимым.
Решение
К счастью, официальное решение было предоставлено, обратитесь к этому времениissue.viteConfig
предоставлено вoptimizeDeps
параметры, специально для обработки этихcjs
экспортированный пакет, чтобы он сталESM
экспорт, вот так.
//viteConfig.js
...
optimizeDeps: {
include: ['axios','jquery','lodash']
},
После добавления ошибка устранена.
Failed to resolve entry for package 'xxx'
проблема вызывает
Некоторые сторонние пакетыpackage.json
Неверное местоположение экспорта, в результате чегоVite
При поиске произошла ошибка.
Решение
пройти черезviteConfig
изresolve
Параметры, заставить путь заменить правильный адрес.
//viteConfig.js
...
resolve: {
alias: [
{
find: 'intl-locales-supported',
replacement: path.resolve('node_modules/intl-locales-supported/src/index.ts')
}
]
}
Проблема с каталогом статических ресурсов
проблема вызывает
Vite
Статический каталог по умолчаниюpublic
, если вам нужно определить другие каталоги, это не сработает.
Решение
пройти черезviteConfig
изpublicDir
параметр, измените статический каталог на нужный вам каталог.
//viteConfig.js
...
publicDir: 'static',
alias '@' to path.resolve(__dirname, './src') is not working
проблема вызывает
из-заVite
уже использован@Чтобы выполнить импорт модуля, если вы используете@Псевдонимы могут быть проблематичными при использовании с абсолютными путями.
Решение
добавив еще один/избегать@По поводу конфликта см.issue
// vite.config.js
module.exports = {
alias: {
'/@/': path.resolve(__dirname, './src')
}
}
совместимость
Vite
По умолчанию используется собственная возможность модуля импорта браузера, что означает, что ему нужна поддержка современных браузеров. Ниже приведены минимальные поддерживаемые версии браузера.
Chrome >=61
Firefox >=60
Safari >=11
Edge >=16
То есть эти версии ниже не поддерживаютсяmodule
атрибут, но, к счастью, наш проект не должен быть совместим с древними браузерами, такими какIE
Различные версии не нуждаются в поддержке, что является одной из причин, по которой мы решаемся на рефакторинг.
Конечно, официалы также предоставляют решения для младших версий браузеров,@vitejs/plugin-legacy, этот плагин позволяетVite
Упакованный проект запускается в старом браузере, в основном с использованием@babel/preset-env
конвертировать, но после его использования скорость упаковки будет значительно медленнее, что зависит от компромисса.
Предложение по замене
Я рекомендую не заменять, если один из следующих пунктов верен
- Если историческое бремя проекта велико и в нем много разного кода, стоимость замены будет высокой, и в конечном итоге он может выйти из строя.
- Если требования к совместимости браузера выше, например, необходимость совместимостиIEстарая версия.
- В настоящее время у проекта нет такого большого давления на упаковку, и эффективность местного развития в порядке.
- Используются специальные плагины,
Vite
Сопоставимых альтернатив не нашлось.
Если у вас нет ни одной из вышеперечисленных проблем, то я думаюVite
Это все еще стоит попробовать, опыт разработки действительно отличный, отклик в миллисекундах, и вы можете почувствовать настоящее горячее обновление. Упаковка тоже от оригинала3 минуты, вплоть до настоящего времени50s.
напиши в конце
Vite
так какwebpack
Я думаю, что будущее многообещающее. Хотя экология сейчас не идеальна, пока сообщество достаточно активно, однажды оно сможет создать свой собственный кусочек неба. Будем с нетерпением ждать этого дня~