Оптимизация упакованного тома Vue-cli3
Предисловие:
После того, как проект компании завершен, после завершения пакета остается 1,18 МБ. На самом деле, это нормально, но все еще есть области для оптимизации. Для нас, чтобы дух совершенства (есть еще немного *) для оптимизировать можно сначала в проекте установка
webpack-bundle-analyzerВы можете увидеть размер каждого файла
npm install webpack-bundle-analyzer -save-dev
Настроить в vue.config.js
module.exports = {
chainWebpack: config => {
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
}
}
Выполните npm run build или npm run serve, и появится этот причудливый интерфейс для анализа размера файла.
анализировать
Перед оптимизацией vendor~app.xxxx.js имеет 1,18 МБ, мы можем проверить размер каждого пакета и оптимизировать его соответствующим образом.
оптимизация
-
Загрузка CDN
Для vue, vue-router, vuex, axios и т. д. можно загрузить с CDN в производственной среде.
const externals = {
'vue': 'Vue',
'vue-router': 'VueRouter',
'vuex': 'Vuex',
'axios': 'axios'
}
const cdn = {
css: [],
js: [
'https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js',
'https://cdn.jsdelivr.net/npm/vue-router@3.0.1/dist/vue-router.min.js',
'https://cdn.jsdelivr.net/npm/vuex@3.0.1/dist/vuex.min.js',
'https://cdn.jsdelivr.net/npm/axios@0.18.0/dist/axios.min.js',
]
}
module.exports = {
chainWebpack: config => {
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
config.plugin('html').tap(args => {
if (process.env.NODE_ENV === 'production') {
args[0].cdn = cdn
}
return args
})
},
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
return {
externals: externals,
};
}
},
}Затем измените файл pubilc/index.html.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.png">
<!-- 使用CDN的CSS文件 -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="preload" as="style">
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="stylesheet">
<% } %>
<!-- 使用CDN的JS文件 -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="external nofollow" rel="preload" as="script">
<% } %>
<title>上海比户</title>
</head>
<body>
<noscript>
<strong></strong>
</noscript>
<div id="app"></div>
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
</body>
</html>Глядя на картинку уже больше 700к, прямо уменьшено более чем на 400к
-
Отложенная загрузка маршрута
Когда пакет упакован, пакет JavaScript станет особенно большим, что повлияет на загрузку страницы.Если мы добавим этот модуль при доступе к маршруту, то изменение будет очень эффективным, измените метод статического введения на метод динамического введения.
import ComponentA from '../page/components/ComponentA';
routeList = [
{
path: '/comA',
component: ComponentA
},
]
//改为
routeList = [
{
path: '/comA',
component: () => import('../page/components/ComponentA')
},
]Поскольку в моем проекте с самого начала используется ленивая загрузка маршрутизации, я не вижу изменения размера упакованного файла, но, вероятно, размер уменьшится на 300 КБ.
В vue cli3 нам также нужно удалить вручнуюprefetch,Preload, так как он упоминается в официальной документации vue cli, о нем можно узнать, я примерно резюмировал.
То есть при загрузке первого экрана все файлы роутинга будут загружаться одновременно, что приведет к более запрашиваемому контенту при загрузке первого экрана, и загрузка первого экрана будет медленнее. следует
module.exports = {
chainWebpack: config => {
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
config.plugin('html').tap(args => {
if (process.env.NODE_ENV === 'production') {
args[0].cdn = cdn
}
return args
})
// 移除 prefetch 插件
config.plugins.delete('prefetch')
// 移除 preload 插件
config.plugins.delete('preload');
},
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
return {
externals: externals,
};
}
},
} -
element-ui загружается по запросу
Глядя на пакет element-ui/lib, он составляет две трети от общего размера пакета, 554 КБ, а общий размер пакета составляет более 700 КБ, поэтому, если вы загружаете element-ui по требованию, вы можете уменьшить размер и загрузить этот пакет по запросу, не говори, будет~😝
Но его нужно добавить в файл babel.config.js (компонент babel-plugin нужно установить в vue cli3)
module.exports = {
presets: ['@vue/app'],
//加上这~
plugins: [
[
'component',
{
libraryName: 'element-ui',
styleLibraryName: 'theme-chalk'
}
]
]
}; -
gzip
Установите сжатие-webpack-плагин
nmp i compression-webpack-plugin -DПредставлено в vue.config.js
const CompressionPlugin = require('compression-webpack-plugin');
module.exports = {
chainWebpack: config => {
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
config.plugin('html').tap(args => {
if (process.env.NODE_ENV === 'production') {
args[0].cdn = cdn
}
return args
})
// 移除 prefetch 插件
config.plugins.delete('prefetch')
// 移除 preload 插件
config.plugins.delete('preload');
},
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
return {
externals: externals,
plugins: [
//gzip压缩
new CompressionPlugin({
test: /\.js∣¨E92E.html|\.html∣¨E92E.html|.\css/, //匹配文件名
threshold: 10240, //对超过10k的数据压缩
deleteOriginalAssets: false //不删除源文件
})
],
performance: {
hints: false
}
};
}
},
}Как вы можете видеть на рисунке выше, самый большой файл после сжатия gzip составляет всего 140 КБ.
Но его еще нужно настроить на стороне сервера
-
импорт файла scss
Мы обычно извлекаем файл scss, какие-то общие стили, темы и т.д., а потом будет громоздко внедрять в каждый нужный компонент, можно использовать scss-loader для препроцессинга
Например, у нас есть файл resetTable.scss, который можно добавить в vue.config.js.
module.exports = {
chainWebpack: config => {
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
config.plugin('html').tap(args => {
if (process.env.NODE_ENV === 'production') {
args[0].cdn = cdn
}
return args
})
// 移除 prefetch 插件
config.plugins.delete('prefetch')
// 移除 preload 插件
config.plugins.delete('preload');
},
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
return {
externals: externals,
plugins: [
//gzip压缩
new CompressionPlugin({
test: /\.js∣¨E92E.html|\.html∣¨E92E.html|.\css/, //匹配文件名
threshold: 10240, //对超过10k的数据压缩
deleteOriginalAssets: false //不删除源文件
})
],
performance: {
hints: false
}
};
}
},
// scss设置
css: {
loaderOptions: {
sass: {
//我是放在 assets/commcss 目录下
data: '@import "@assets/commcss/resetTable.scss";'
}
},
},
}На картинке выше показана полная конфигурация vue.config.js~
Суммировать:
Выше приведены моменты, которые я оптимизирую в проекте в настоящее время, но должны быть и другие места оптимизации, которые можно обсудить друг с другом.