предисловие
использовался раньшеvuecli
Я сделал блог, который представляет собой одностраничный проект с примерно десятью маршрутами.
непосредственныйnpm run build
упаковать его, есть1M
огромныйjs
документ
Попробуй смонтировать сначала на сервер чувак, это время загрузки кажется полвека
Страница первой страницы полностью загружена9s
Просто загрузка этого большого файла заняла8s
Это должно быть оптимизировано, ни один пользователь не выдержит этого.9s
белый экран без закрытия страницы
В процессе я также изменил проект сvuecli 2.x
мигрировал вvuecli 3
, поэтому далее будут представлены некоторые сходства и различия в оптимизации
анализировать
vuecli 2.x
Поставляется с инструментами анализа
просто бегиnpm run build --report
еслиvuecli 3
Если это так, сначала установите плагин
cnpm install webpack-bundle-analyzer –save-dev
затем вvue.config.js
средняя параwebpack
настроить
chainWebpack: (config) => {
/* 添加分析工具*/
if (process.env.NODE_ENV === 'production') {
if (process.env.npm_config_report) {
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
.end();
config.plugins.delete('prefetch')
}
} }
бежать сноваnpm run build --report
В браузере откроется карта упаковки проекта, что удобно для интуитивного сравнения каждогоbundle
размер файла
Вы можете видеть, что все зависимости и маршруты в проекте упакованы в один и тот же файл.
Кроме того, в браузере также можно пройтиconverge
чтобы увидеть использование кода
Отложенная загрузка маршрута
При упаковке и сборке приложений пакеты JavaScript могут стать очень большими и повлиять на загрузку страницы. Было бы более эффективно, если бы мы могли разделить компоненты, соответствующие разным маршрутам, на разные блоки кода, а затем загружать соответствующие компоненты при доступе к маршруту.
Загружать в начале файлы компонентов, соответствующие всем маршрутам, явно нецелесообразно, это все равно, что загружатьapp
, поэтому нам нужно использовать ленивую загрузку маршрутизации
существуетrouter.js
В файле исходный метод статической ссылки
import ShowBlogs from '@/components/ShowBlogs'
routes:[ path: 'Blogs', name: 'ShowBlogs', component: ShowBlogs ]
изменить на
routes:[ path: 'Blogs',name: 'ShowBlogs',component: () => import('./components/ShowBlogs.vue')
Динамически импортируется в виде функций, поэтому соответствующие файлы маршрутизации могут быть упакованы отдельно, а компоненты маршрутизации будут загружаться только при анализе данного маршрута.
Файл, который нужно загрузить на первом экране, превратился в оранжевую часть, и был отвлечен младшими братьями.300k
если вvuecli 3
, нам еще нужно сделать еще один шаг
потому чтоvuecli 3
Включено по умолчаниюprefetch
(предварительная загрузка модулей), чтобы заранее получать контент, к которому пользователи могут получить доступ в будущем.
На первом экране эти более десятка файлов маршрутизации будут загружены за один раз.
Итак, мы собираемся отключить эту функцию вvue.config.js
установить в
Обратитесь к официальному сайту для практики:
После настройки на первом экране будут загружаться только компоненты текущего маршрута страницы.
element-ui загружается по запросу
Пакеты зависимостей загружаются выше сгиба, гдеelement-ui
занял весь568k
Исходный метод импорта импортировал весь пакет:
import ElementUI from 'element-ui'
Vue.use(ElementUI)
Но на самом деле единственными компонентами, которые я использую, являются кнопки, нумерация страниц, формы, ввод и предупреждения. поэтому мы хотимЦитирование по запросу:
import { Button, Input, Pagination, Table, TableColumn, MessageBox } from 'element-ui';
Vue.use(Button)
Vue.use(Input)
Vue.use(Pagination)
Vue.prototype.$alert = MessageBox.alert
УведомлениеMessageBox
Разница между методами регистрации, и хотя мы использовалиalert
, Но вводить не надоAlert
компоненты
существует.babelrc
файл добавлен(vue-cli 3
установить первымbabel-plugin-component
):
плагины: [
[
"компонент",
{
"имя_библиотеки": "элемент-пользовательский интерфейс",
"styleLibraryName": "тема-мел"
}
]
]
element-ui
Гораздо меньше, но видно, что бросается в глазаtable.js
Подумав,table
Компонент используется только страницей управления фоном, и его не нужно регистрировать глобально, поэтому мы его удаляем.main.js
серединаTable
а такжеTablColumn
и зарегистрировать его локально в фоновом компоненте
import { Table, TableColumn } from "element-ui";
components: {
"el-table": Table,
"el-table-column": TableColumn },
table
разбит на файлы маршрутизации
Компоненты упакованы многократно
Как вы можете видеть выше, есть ссылки на два файла маршрутизации.codemirror.js
вызывать повторные загрузки
мы можемwebpack
изconfig
файл, изменитьCommonsChunkPlugin
Конфигурация
minChunks: 3
Изменение 3 на 2 приведет к извлечению пакетов, которые использовались дважды или более, и помещению их в общедоступный файл зависимостей.Однако, поскольку домашняя страница также содержит несколько повторно используемых компонентов, домашняя страница также загрузит этот общедоступный файл зависимостей.
Домашняя страница загружена желтыми и серыми разделами После долгого демонтажа он вернулся к исходной точке
Конечно, мы можем продолжать бросатьCommonsChunkPlugin
конфиг исправить это
но в новой версииwebpack
середина,CommonsChunkPlugin
больше свободы, больше возможностейSplitChunksPlugin
заменять
Вот почему я переношу проект наvuecli 3
(использоватьwebpack4
)
Он оптимизирован по умолчанию, и на главной странице будет загружаться только серая часть (235K
)
gzip
После распаковки используемgzip
сделай компрессию
Установитьcompression-webpack-plugin
cnmp i compression-webpack-plugin -D
существуетvue.congig.js
Введены и изменены вwebpack
настроить
const CompressionPlugin = require('compression-webpack-plugin')
configureWebpack: (config) => {
if (process.env.NODE_ENV === 'production') {
// 为生产环境修改配置...
config.mode = 'production'
return {
plugins: [new CompressionPlugin({
test: /\.js$|\.html$|\.css/, //匹配文件名
threshold: 10240, //对超过10k的数据进行压缩
deleteOriginalAssets: false //是否删除原文件
})]
}
}
можно увидеть200k
Вышеупомянутые файлы сжаты в100k
в пределах
Нам также необходимо соответствующим образом настроить сервер
Если браузер, отправляющий запрос, поддерживаетgzip
, отправьте егоgzip
форматировать файл
мой сервер используетexpress
каркас построен
Просто установите егоcompression
готов использовать
const compression = require('compression')
app.use(compression())
Обратите внимание, что последнее предложение должно быть помещено перед всеми другими регистрациями промежуточного программного обеспечения.
окончательный эффект
Первый экран загружает 198к ресурсов, а время загрузки 1с.На 90% быстрее оригиналаПостскриптум: стоит ли разбивать css
vuecli 3
а такжеvuecli2.x
Еще одно отличиеvuecli 3
будет включен по умолчаниюcss
отдельный плагинExtractTextPlugin
каждого модуляcss
Файлы будут разделены, целых 13css
файл, а наша домашняя страница запросила 4, что заняло много времени запроса ресурсов
мы можемvue.config.js
закрыть его в
css: {
// 是否使用css分离插件 ExtractTextPlugin
extract: false,
// 开启 CSS source maps?
sourceMap: false,
// css预设器配置项
loaderOptions: {},
// 启用 CSS modules for all css / pre-processor files.
modules: false
},
В запакованном файле нет прямогоcss
папка
Вместо этого интегрированныйjs
файл, отвечающий за внедрение всех стилей в начале
Загрузка выше сгибаКоличество файлов уменьшилось, но размер увеличился, нет большой разницы в конечной измеренной скорости
Поэтому разделять CSS или нет, вопрос мнения, разберем конкретные проекты подробно.
Суммировать
Оптимизация производительности очень приятный процесс, но и глубокая яма, слишком много всего, начинается эта статья, и я надеюсь, что она будет полезна для всех.
Это мой личный веб-сайт, на котором я записываю фрагменты обучения интерфейсу, добро пожаловать в гости.
www.ssevenk.com
Справочная статья
- Разделение кода для оптимизации упаковки Vuenuggets.capable/post/684490…
- Оптимизация производительности Vue: как реализовать ленивую загрузку и разделение кода?Woohoo.info Q. Talent/article/9IH…
- Объем оптимизации упаковки WebpackWoohoo.Jeff Jade.com/2017/08/06/…
- Помните оптимизацию проекта vue+element+echartsnuggets.capable/post/684490…