欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue項目打包壓縮的實現(xiàn)(讓頁面更快響應(yīng))

 更新時間:2020年03月10日 10:23:12   作者:木馬啊  
這篇文章主要介紹了Vue項目打包壓縮的實現(xiàn)(讓頁面更快響應(yīng)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

  影響網(wǎng)頁響應(yīng)速度的因素有很多,例如:http請求次數(shù)太多、服務(wù)器本身處理請求太久、請求內(nèi)容太大、JS腳本執(zhí)行耗時過長、瀏覽器回流重繪等。網(wǎng)站頁面的響應(yīng)速度與用戶體驗息息相關(guān),直接影響到用戶是否愿意繼續(xù)訪問你的網(wǎng)站。對于Vue項目而言,最普遍的問題可能在于打包后的文件太大,導(dǎo)致加載時間過長。

  我的一個小項目,僅有三四個頁面,但因為服務(wù)器帶寬太小了,加載時間過長的問題尤為明顯,于是采用路由懶加載和gzip壓縮的方式優(yōu)化了一下,訪問速度得到了顯著提升。

一、路由懶加載:分割代碼塊

  Vue支持異步組件,即可以在使用組件的地方使用一個Promise,Promise最終會通過resolve回傳一個組件對象。而webpack的動態(tài)import的方式可以讓代碼分塊進行打包,并且返回一個Promise(正是異步組件所需要的)。在路由配置表里使用import可以將各個頁面組件分割成不同的代碼塊,然后當路由被訪問的時候才加載對應(yīng)的組件,這樣就避免將所有內(nèi)容打包在一個chunk里,從而“按需加載”,大大提高響應(yīng)速度。

  沒有使用動態(tài)加載的路由配置方式:

// router.js
import VueRouter from 'vue-router'
import Vue from 'vue'
Vue.use(VueRouter)

import Home from '@/pages/Home'
import Tree from '@/pages/Tree'
import SearchHighlight from '@/pages/SearchHighlight'
import Watermark from '@/pages/Watermark'

export default new VueRouter({
 routes: [
  {
   path: '/',
   component: Home,
   children: [
    {
     path: 'tree',
     name: 'Tree',
     component: Tree
    },
    {
     path: 'search-highlight',
     name: 'SearchHighlight',
     component: SearchHighlight
    },
    {
     path: 'watermark',
     name: 'Watermark',
     component: Watermark
    }
   ]
  }
 ]
})

  執(zhí)行yarn build(或npm run build)打包,查看dist文件夾下的js和css:

  可以看到打包后js和css下各有兩個文件,其中chunk-vendors文件包含了所有頁面js或者css文件,大小分別為769K、270K?,F(xiàn)在修改路由配置使用動態(tài)加載組件的方式打包,來看一下打包的文件是怎樣的。

  使用 () => import('xxx')的形式引入組件:

// router.js
import VueRouter from 'vue-router'
import Vue from 'vue'
Vue.use(VueRouter)

export default new VueRouter({
 routes: [
  {
   path: '/',
   component: () => import('@/pages/Home'),
   children: [
    {
     path: 'tree',
     name: 'Tree',
     component: () => import('@/pages/Tree')
    },
    {
     path: 'search-highlight',
     name: 'SearchHighlight',
     component: () => import('@/pages/SearchHighlight')
    },
    {
     path: 'watermark',
     name: 'Watermark',
     component: () => import('@/pages/Watermark')
    }
   ]
  }
 ]
})

執(zhí)行yarn build(或npm run build)打包,查看dist文件夾下的js和css:

  js和css文件夾下各多出來了4個chunk-*文件,剛好對應(yīng)我們動態(tài)引入的4個組件,這樣在我們訪問到某個頁面,才會加載頁面對應(yīng)的chunk-*.js和chunk-*.css。觀察文件大小,核心的JS文件chunk-venders大小從769K降低到了725K,因為我的4個頁面代碼都非常簡單,看起來優(yōu)化效果不大,然而在一個頁面很多的大型項目中,優(yōu)化效果會非常明顯,CSS部分也是如此。

二、壓縮請求資源

1. 原理介紹

  日常我們在使用網(wǎng)盤的時候,上傳一個很大的文件夾肯定很慢,這時候我們會把它壓縮成一個壓縮包,需要下載的時候下載下來解壓就可以了,這樣大大節(jié)省了上傳和下載的時間。同樣的原理可以用于網(wǎng)絡(luò)請求,當我們向服務(wù)器請求一個資源時,比如js或者css文件,服務(wù)器將文件壓縮,然后返回到瀏覽器,瀏覽器操作解壓之后即可使用。

  首先瀏覽器在發(fā)送請求的時候,會通過請求頭Accept-Encoding告知服務(wù)器,本瀏覽器支持哪些編碼格式的資源。打開瀏覽器的network,查看當前網(wǎng)頁的某個請求的請求頭:

  Accept-Encoding的值表示瀏覽器支持gzip生成的編碼格式或者deflate壓縮算法生成的編碼格式,這就告訴服務(wù)器,如果可以把該請求的資源用這兩個方法壓縮一下給我也是可以的。Accept-Encoding可能還會有compress壓縮、identity不壓縮的默認格式。

  如果服務(wù)器對資源進行壓縮編碼了,它就會通過響應(yīng)頭Content-Encoding告知當前請求用了什么編碼格式,當然如果服務(wù)器沒干這事,則不會返回這個響應(yīng)頭,比如某個請求用gzip壓縮了返回的內(nèi)容:

2. 服務(wù)器配置

  一般我們部署到服務(wù)器會使用nginx來做代理服務(wù)器,所有的請求都通過nginx轉(zhuǎn)發(fā),這里演示一下nginx配置gzip壓縮文件后再返回。配置前先看看示例項目發(fā)布到線上的請求情況:

  可以看到之前生成的chunk-vendors文件,大小725K,請求時間7.10秒,其中下載時間7.05秒,太慢了。配置一下nginx,打開gzip:

server {
    gzip on;
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
}

  這個配置作用是,當nginx服務(wù)器返回gzip_types中列出的內(nèi)容類型時,先使用gzip進行壓縮(當然,前提是請求方支持gzip),執(zhí)行sudo nginx -s reload讓該配置生效,此時刷新剛才的頁面看一下效果:

  同樣的一個請求,請求內(nèi)容的大小變成了216K,而下載時間直接降低到了1s多,效果顯著!nginx還有g(shù)zip的其它配置項,比如可以用gzip_comp_level可以控制壓縮率(當然壓縮率更高可能意味著更大的服務(wù)器消耗),有興趣的同學(xué)可以查看nginx文檔。

3. webpack打包時直接使用gzip壓縮

  上一步驟中,返回內(nèi)容是在請求服務(wù)器的時候使用gzip進行壓縮的。這樣存在的問題時,對于同一個資源的不同請求,反復(fù)壓縮,這無疑會增加服務(wù)器的CPU和內(nèi)存消耗。使用webpack的話,可以直接用compression-webpack-plugin插件對我們的代碼進行壓縮。先安裝compression-webpack-plugin到dev依賴:

// yarn安裝
yarn add compression-webpack-plugin -D
// 或npm
npm install compression-webpack-plugin --save-dev

  簡單配置,更多配置可了解官方文檔:compression-webpack-plugin:

const CompressionPlugin = require('compression-webpack-plugin')

module.exports = {
 // ...
 configureWebpack: {
  plugins: [
   new CompressionPlugin({
    test: /\.(js|css)?$/i, // 哪些文件要壓縮
    filename: '[path].gz[query]', // 壓縮后的文件名
    algorithm: 'gzip', // 使用gzip壓縮
    minRatio: 1, // 壓縮率小于1才會壓縮
    deleteOriginalAssets: true // 刪除未壓縮的文件,謹慎設(shè)置,如果希望提供非gzip的資源,可不設(shè)置或者設(shè)置為false
   })
  ]
 }
}

  打包一下看看dist下的js和css文件夾,現(xiàn)在文件都被壓縮成了.gz:

  經(jīng)過壓縮之后chunk-vendors僅有176K,比起原始的725K,壓縮了近80%。像圖片、字體之類的也可以用這個方法進行壓縮,只要修改test配置項的正則表達式匹配這類文件即可。不過現(xiàn)在,還需要在nginx服務(wù)器配置一下靜態(tài)壓縮:

server {
  gzip on;
  gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
  
  gzip_static on;
}

  gzip_static設(shè)置為on之后,這樣在訪問資源的時候,如果存在“資源路徑.gz”的文件,則會直接返回該文件,其優(yōu)先級高于動態(tài)的gzip。現(xiàn)在訪問一下頁面:

  如果把鼠標懸指到chunk-vendors的size上,可以看到提示“176KB transfered over network, resource size: 724K”。如果你的項目出現(xiàn)請求資源文件太大,可以試試gzip之類的壓縮手段,相信有立竿見影的效果。

  到此這篇關(guān)于Vue項目打包壓縮的實現(xiàn)(讓頁面更快響應(yīng))的文章就介紹到這了,更多相關(guān)Vue項目打包壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中禁止編輯的常見方法(以禁止編輯輸入框為例)

    Vue中禁止編輯的常見方法(以禁止編輯輸入框為例)

    在我們開發(fā)項目的時候,有時候我們不希望用戶對我們的頁面進行操作,尤其是輸入框之類的,這篇文章主要給大家介紹了Vue中禁止編輯的常見方法,文中介紹的方法主要以禁止編輯輸入框為例,需要的朋友可以參考下
    2024-02-02
  • vue學(xué)習筆記之給組件綁定原生事件操作示例

    vue學(xué)習筆記之給組件綁定原生事件操作示例

    這篇文章主要介紹了vue學(xué)習筆記之給組件綁定原生事件操作,結(jié)合實例形式詳細分析了vue.js組件綁定原生事件相關(guān)原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • vue中封裝echarts公共組件過程

    vue中封裝echarts公共組件過程

    這篇文章主要介紹了vue中封裝echarts公共組件過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue2.0路由切換后頁面滾動位置不變BUG的解決方法

    vue2.0路由切換后頁面滾動位置不變BUG的解決方法

    下面小編就為大家分享一篇vue2.0路由切換后頁面滾動位置不變BUG的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue中如何給el-table-column添加指定列的點擊事件

    vue中如何給el-table-column添加指定列的點擊事件

    elementui中提供了點擊行處理事件,下面這篇文章主要給大家介紹了關(guān)于vue中如何給el-table-column添加指定列的點擊事件,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Vue創(chuàng)建頭部組件示例代碼詳解

    Vue創(chuàng)建頭部組件示例代碼詳解

    本文通過實例代碼給大家介紹了Vue創(chuàng)建頭部組件的相關(guān)知識,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-10-10
  • Vue發(fā)送Formdata數(shù)據(jù)及NodeJS接收方式

    Vue發(fā)送Formdata數(shù)據(jù)及NodeJS接收方式

    這篇文章主要介紹了Vue發(fā)送Formdata數(shù)據(jù)及NodeJS接收方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • vue中動態(tài)select的使用方法示例

    vue中動態(tài)select的使用方法示例

    這篇文章主要介紹了vue中動態(tài)select的使用方法,結(jié)合實例形式分析了vue.js使用動態(tài)select創(chuàng)建下拉菜單相關(guān)實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下
    2019-10-10
  • vue 驗證碼界面實現(xiàn)點擊后標灰并設(shè)置div按鈕不可點擊狀態(tài)

    vue 驗證碼界面實現(xiàn)點擊后標灰并設(shè)置div按鈕不可點擊狀態(tài)

    今天小編就為大家分享一篇vue 驗證碼界面實現(xiàn)點擊后標灰并設(shè)置div按鈕不可點擊狀態(tài),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • 基于vue+axios+lrz.js微信端圖片壓縮上傳方法

    基于vue+axios+lrz.js微信端圖片壓縮上傳方法

    這篇文章主要介紹了基于vue+axios+lrz.js微信端圖片壓縮上傳方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-06-06

最新評論