詳解vue-cli 3.0 build包太大導(dǎo)致首屏過長的解決方案
前言:最近用vue-cli 3.0 構(gòu)建一個小型的工單管理系統(tǒng),完工后build發(fā)現(xiàn)一個chunk-vendors包就達到985kb,加上其他一些資源文件,首頁的下載總共大小快要2M。測試給的第一個反饋就是首屏慢慢慢慢慢!
根據(jù)首屏加載資源文件過大,進行一下優(yōu)化:
1. 路由懶加載
結(jié)合Vue的異步組件再結(jié)合webpack的代碼分割,我們可以輕松的實現(xiàn)路由懶加載。
vue-cli 3.0 模式就使用了Babel,我們需要添加 syntax-dynamic-import 插件,才能使 Babel 可以正確地解析語法。
// 安裝插件 syntax-dynamic-import
cnpm install --save-dev @babel/plugin-syntax-dynamic-import
// 修改babel.config.js
module.exports = {
"presets": [
"@vue/app"
],
"plugins": [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
},
"syntax-dynamic-import"
]
]
}
// 修改路由組件的加載(router/index.js)
{
path: '/',
name: 'home',
component: resolve => require(['pages/Home'], resolve)
}
使用了路由懶加載,已經(jīng)把原來的chunk-vendors降到了789kb,但加載789kb還是太大。那繼續(xù)優(yōu)化
2. 服務(wù)器開啟Gzip
Gzip是GNU zip的縮寫,顧名思義是一種壓縮技術(shù)。它將瀏覽器請求的文件先在服務(wù)器端進行壓縮,然后傳遞給瀏覽器,瀏覽器解壓之后再進行頁面的解析工作。在服務(wù)端開啟Gzip支持后,我們前端需要提供資源壓縮包。
通過CompressionWebpackPlugin插件build提供壓縮
// 安裝插件
cnpm i --save-dev compression-webpack-plugin
// 在vue-config.js 中加入
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const productionGzipExtensions = ['js', 'css'];
const isProduction = process.env.NODE_ENV === 'production';
.....
module.exports = {
....
configureWebpack: config => {
if (isProduction) {
config.plugins.push(new CompressionWebpackPlugin({
algorithm: 'gzip',
test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
threshold: 10240,
minRatio: 0.8
}))
}
}
}
現(xiàn)在我們看一下build后的壓縮包的大小,大概減少了三分之二

3. 啟用CDN加速
用Gzip已把文件的大小減少了三分之二了,加載速度從之前2.7秒多到現(xiàn)在的1.8秒多,但這個還是得不到滿足。那我們就把那些不太可能改動的代碼或者庫分離出來,繼續(xù)減小單個chunk-vendors,然后通過CDN加載進行加速加載資源。
// 修改vue.config.js 分離不常用代碼庫
module.exports = {
configureWebpack: config => {
if (isProduction) {
config.externals = {
'vue': 'Vue',
'vue-router': 'VueRouter',
'moment': 'moment'
}
}
}
}
// 在public文件夾的index.html 加載
<!-- CND -->
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.runtime.min.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
現(xiàn)在再build后看下大小和訪問速度:

CDN優(yōu)化后.jpg
可以看到chunk-verdors 又減少了114kb,通過CDN加載整個文檔速度已經(jīng)接近1秒。
4. 修改uglifyOptions去除console來減少文件大小
// 安裝uglifyjs-webpack-plugin
cnpm install uglifyjs-webpack-plugin --save-dev
// 修改vue.config.js
configureWebpack: config => {
if (isProduction) {
.....
config.plugins.push(
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false,
drop_debugger: true,
drop_console: true,
},
},
sourceMap: false,
parallel: true,
})
)
}
}
如果代碼中打了很log,這個優(yōu)化還是有點效果的。
總結(jié)
首屏優(yōu)化工作告一段落,通過以上四項的優(yōu)化,已經(jīng)很大的提升了首屏的加載速度。如果想再進一步優(yōu)化還是空間的,例如從代碼層面去減少代碼量(代碼復(fù)用率)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
webpack轉(zhuǎn)vite的詳細操作流程與問題總結(jié)
Vite是新一代的前端開發(fā)與構(gòu)建工具,相比于傳統(tǒng)的webpack,Vite 有著極速的本地項目啟動速度(通常不超過5s)以及極速的熱更新速度(幾乎無感知),下面這篇文章主要給大家介紹了關(guān)于webpack轉(zhuǎn)vite的詳細操作流程與問題總結(jié)的相關(guān)資料,需要的朋友可以參考下2023-03-03
非Vuex實現(xiàn)的登錄狀態(tài)判斷封裝實例代碼
這篇文章主要給大家介紹了關(guān)于非Vuex實現(xiàn)的登錄狀態(tài)判斷封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-02-02
詳解Vue3 Composition API中的提取和重用邏輯
這篇文章主要介紹了Vue3 Composition API中的提取和重用邏輯,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Vue報錯:Uncaught TypeError: Cannot assign to read only propert
這篇文章主要給大家介紹了關(guān)于Vue報錯:Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>' 的解決方法,文中介紹的非常詳細,需要的朋友們下面來一起看看吧。2017-06-06
Vue3+TypeScript實現(xiàn)遞歸菜單組件的完整實例
Vue.js中的遞歸組件是一個可以調(diào)用自己的組件,遞歸組件一般用于博客上顯示評論,形菜單或者嵌套菜單,文章主要給大家介紹了關(guān)于Vue3+TypeScript實現(xiàn)遞歸菜單組件的相關(guān)資料,需要的朋友可以參考下2021-08-08
56個實用的JavaScript 工具函數(shù)助你提升開發(fā)效率
今天來看看JavaScript中的一些實用的工具函數(shù),希望能幫助你提高開發(fā)效率!需要的朋友可以參考下面文章的具體內(nèi)容2021-10-10

