(Оригинал текста здесь, если вам поможет, пошевелите ручонками, чтобы дать звездочку)
Примечание: В этой статье немного заголовка, и многие изображения очень многословны. Учащиеся, которые не хотят видеть изображения, могут напрямую прочитать выделенное полужирным шрифтом содержание и итоговое резюме.
Я впервые пишу статью в Наггетс, если что-то не так или есть лучшее решение, прошу не давать мне морду, а сразу ставить.
Я недавно работаю над проектом.Стек технологий - это семейство Vue Bucket + Element-UI + echarts. После упаковки я обнаружил, что есть 1,44M, и первое впечатление от экрана очень плохое. Можно ли это терпеть? Решительно приступайте к оптимизации. Вот как я упаковал1.44MBПроект становится упакованным только после0.42MB, улучшение производительности70%из.
процесс оптимизации
-
Подготовить:
vue-cli
Предоставляет очень удобную команду для просмотра объема кода после упаковки, просто добавьте команду после обычной команды упаковки.--report
Вот и все, после завершения упаковки автоматически откроется страница для отображения размера каждого зависимого пакета.npm run build --report
-
До оптимизации:
Давайте посмотрим на размер до оптимизации
Это файл js, загруженный на первом экране в локальном локальном хосте перед упаковкой, там только одинapp.js
(3.2MB
) (обратите внимание на локальный, неупакованный, несжатый) Это скриншот после упаковки, объем1.44MB
, время упаковки72s
-
Первая оптимизация:Отложенная загрузка маршрута
Когда дело доходит до оптимизации, первое, что нужно учитывать, это отложенная загрузка, сразу в vue и vue-router.официальная документациянашел решение в
Объедините асинхронные компоненты Vue и функцию разделения кода Webpack, чтобы легко реализовать ленивую загрузку компонентов маршрутизации.
конкретные методыСлова следующие:
Сначала установите плагинSyntax Dynamic Importвключить поддержку проекта
动态import
cnpm install -S babel-plugin-syntax-dynamic-import
затем изменить
.babelrc
документ// .babelrc 中的plugins数组中多加一个"syntax-dynamic-import" { "plugins": ["syntax-dynamic-import"] }
Последний отзыв
router.js
, измените все маршруты на динамическую загрузку//router.js //原来的写法:import Home from '@/components/PC/Home' //改成下面这种形式(其他路由同理) const Home = () => import('@/components/PC/Home')
Итак, первая оптимизация завершена. Давайте упакуем и посмотрим, что получится.
Две картинки выше — это ресурсы js, загруженные на первый экран перед локальной упаковкой (приблизительно рассчитанные как
3.1MB
) и упакованные скриншоты (1.44MB
), время упаковки55s
. Обратите внимание на ту часть, которую я обвел красной рамкой, по сравнению с до оптимизации упакованные результаты несколько больше.0
1
Дождитесь js файла в начале номера, это собственно наш файл роутинга отделен, и на первом экране загружается только нужный экран0.js
а также3.js
файл, который не будет загружен, пока мы не переключимся на другие маршруты2.js
или4.js
, а не все, что содержится вapp.js
Загрузить все сразу.По сравнению с до оптимизации размер после упаковки не изменился, но время упаковки уменьшено, а также меньше ресурсов js, загружаемых на первый экран.
0.1MB
(Это не яма отец!!).Размер пакета не изменился, а первый скрин всего на 0.1мб меньше? Эффект такой плохой, почему ты шутишь?
Не спешите бить меня, просто выслушайте мое объяснение. Размер пакета не меняется, потому что как бы лениво ни грузился роутинг, файлов роутинга по сути все равно столько, а размер остается прежним, поэтому размер не меняется. И первый скрин меньше
0.1MB
, потому что изначально этот проект был очень маленьким, всего 4 страницы, а домашняя страница этого проекта представляетecharts
Он был относительно большим.Таким образом, оптимизация этого шага маршрутизации ленивой загрузки полностью в порядке, эффект не очень хороший, потому что это причина моего проекта, чем меньше
0.1MB
— оставшийся незагруженный размер файла маршрутизации.Если в вашем проекте много страниц, то эффект маршрутизации отложенной загрузки не должен быть плохим.
Давайте еще раз посмотрим на эту картинку
Найдите желтую коробку слева.echarts
и синее поле справаelement-ui
Объем составляет большую часть, давайте сначала посмотрим на негоelement-ui
приходилось556KB
, На данный моментelement-ui
Сделайте вторую оптимизацию -
Вторая оптимизация:компоненты element-ui загружаются по запросу
против
element-ui
Оптимизация, тут и говорить нечего, конкретный метод, смотрите прямоДокументациявнутриВнедрить по требованиюБар. После оптимизации в соответствии с документом снова упакуйте его для просмотра результатов:После этой оптимизации пакет используется
а также45s
, общий размер определяется1.44MB
стал1.16MB
element-ui
Размер модуля также определяется556kb
стал267kb
, эффект в порядке. Но насколько это улучшение удовлетворяет меня? решеноelement-ui
, посмотрим на другой модульecharts
: Сравниватьelement-ui
Даже больше! ! полон606kb
, и немедленно нацельтесь на самого большого босса----echarts
оптимизировать. -
Третья оптимизация:Загружать ресурсы извне с помощью CDN
Эта оптимизация предназначена в основном для
echarts
, который также упоминается в его документациинагрузка по требованию, но в этот раз нам не нужно грузить по требованию, я хочу поставитьecharts
Полностью забей! На этот раз мы будем использоватьwebpack
изexternals,обратитесь сюдаПредотвратите упаковку некоторых импортированных пакетов в пакеты, вместо этого получите эти внешние зависимости во время выполнения. Пакеты с внешними зависимостями можно использовать в различных контекстах модулей, таких как CommonJS, AMD, глобальные модули и модули ES2015.
конкретные методы:
первый в
index.html
введен вecharts
внешний CDN (если вам нужны компоненты карты, вам также нужно представить их вместе)//index.html <script src="https://cdn.bootcss.com/echarts/4.1.0/echarts.min.js"></script>
затем в
webpack.base.config.js
, внесите следующие изменения//webpack.base.config.js module.exports中增加externals对象 module.exports = { externals: { "echarts": "echarts" //默认是配置引用的库(这里是echarts)暴露出的全局变量 }, }
Посмотреть результаты оптимизации:
Это скриншот локального первого экрана загрузки ресурсов перед упаковкой.Можно подсчитать, что на этот раз общая загрузка1.31MB
(не считаяecharts.min.js
, потому что это ресурс CDN), относительно первого оптимизированного3.1MB
Уже гораздо меньше.Скриншот после упаковки выглядит следующим образом
Видно, что упакованный объем составляет всего434.7KB
, и на этот раз посылка стоила только34s
, самое главное этоecharts
Реально убили! !Не удивляйтесь! ! Не удивительно! !
Столы для каждой оптимизации
Студенты, которым лень смотреть на картинку, могут непосредственно посмотреть на таблицу ниже.
# объем после упаковки объем после сжатия Ресурсы первого экрана js Время упаковки До оптимизации 1.44M 425K 3.2M 72s Первая оптимизация (ленивая загрузка маршрута) 1.44M 434K 3.11M 55s Вторая оптимизация (элемент-ui загружается по требованию) 1.16M 381K 1.3M 45s Третья оптимизация (внедрение внешнего CDN) 434K 121K 1.3M 34s Видно, что наша оптимизация по-прежнему очень эффективна, а различные объемы и время упаковки почти сокращаются.70%о.
Суммировать
Вы должны посмотреть эту часть
- Если вы столкнулись с проблемами производительности упаковки веб-пакета, сначала выполните
npm run build --report
Анализ волны, а потом сделать соответствующие оптимизации по результатам анализа, кто займет больший объем, тот и сделает - Маршрут много сложных страниц,Отложенная загрузка маршрутаобязательно сделает
- Сейчас многие библиотеки предоставляютнагрузка по требованиюфункция, при необходимости может быть загружена по запросу согласно официальной документации
- предоставлено веб-пакетом
externals
может сотрудничатьCDN внешнего ресурсаЛегко и значительно уменьшить объем упаковки, подходит дляecharts
,jQuery
,lodash
этоДоступ к глобальной библиотеке переменных - Не забудьте включитьGzipкомпрессия
- Эта статья только для
webpack
Оптимизация уровня, не только оптимизация производительности, но и другие аспекты оптимизации, такие какОптимизация рендеринга страницы (уменьшение перекомпоновки),оптимизация загрузки сетиЖдать. - Содержание этой статьи относится только ксреда браузера
- Если вы столкнулись с проблемами производительности упаковки веб-пакета, сначала выполните