vuejs項目性能優(yōu)化總結

在使用elementUI構建公司管理系統(tǒng)時,發(fā)現(xiàn)首屏加載時間長,加載的網絡資源比較多梭冠,對系統(tǒng)的體驗性會差一點,而且用webpack打包的vuejs的vendor包會比較大自赔。所以通過搜集網上所有對于vuejs項目的性能優(yōu)化妈嘹,做了有關3方面的優(yōu)化建議,主要包括:上線代碼包打包绍妨、源碼編寫優(yōu)化润脸、用戶體驗優(yōu)化。(下面的優(yōu)化建議只在vue-cli腳手架下做過測試他去,詳情請參考)

1.代碼包優(yōu)化

  • 屏蔽sourceMap
    • 待下項目開發(fā)完成毙驯。進行打包源碼上線環(huán)節(jié),需要對項目開發(fā)環(huán)節(jié)的開發(fā)提示信息以及錯誤信息進行屏蔽灾测,一方面可以減少上線代碼包的大斜邸;另一方面提高系統(tǒng)的安全性媳搪。在vuejs項目的config目錄下有三個文件dev.env.js(開發(fā)環(huán)境配置文件)铭段、prod.env.js(上線配置文件)、index.js(通用配置文件)秦爆。vue-cli腳手架在上線配置文件會自動設置允許sourceMap打包序愚,所以在上線前可以屏蔽sourceMap。如下所示等限,index.js的配置如下,通用配置文件分別對開發(fā)環(huán)境和上線環(huán)境做了打包配置分類爸吮,在build對象中的配置信息中,productionSourceMap修改成false:
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.

const path = require('path')

module.exports = {
  dev: {

    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {},

    // Various Dev Server settings
    host: 'localhost', // can be overwritten by process.env.HOST
    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
    autoOpenBrowser: false,
    errorOverlay: true,
    notifyOnErrors: true,
    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-

    /**
     * Source Maps
     */

    // https://webpack.js.org/configuration/devtool/#development
    devtool: 'cheap-module-eval-source-map',

    // If you have problems debugging vue-files in devtools,
    // set this to false - it *may* help
    // https://vue-loader.vuejs.org/en/options.html#cachebusting
    cacheBusting: true,

    cssSourceMap: true
  },

  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/ndindex.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: './',

    /**
     * Source Maps
     */

    productionSourceMap: false,
    // https://webpack.js.org/configuration/devtool/#production
    devtool: '#source-map',

    // Gzip off by default as many popular static hosts such as
    // Surge or Netlify already gzip all static assets for you.
    // Before setting to `true`, make sure to:
    // npm install --save-dev compression-webpack-plugin
    productionGzip: true,
    productionGzipExtensions: ['js', 'css','svg'],

    // Run the build command with an extra argument to
    // View the bundle analyzer report after build finishes:
    // `npm run build --report`
    // Set to `true` or `false` to always turn it on or off
    bundleAnalyzerReport: process.env.npm_config_report
  }
}

  • 對項目代碼中的JS/CSS/SVG(*.ico)文件進行gzip壓縮
    • 在vue-cli腳手架的配置信息中望门,有對代碼進行壓縮的配置項形娇,例如index.js的通用配置,productionGzip設置為true筹误,但是首先需要對compress-webpack-plugin支持桐早,所以需要通過 npm install --save-dev compression-webpack-plugin(如果npm install出錯了,就使用cnpm install安裝厨剪】迸希可能網絡比較差npm install會出現(xiàn)頻率比較大),gzip會對js丽惶、css文件進行壓縮處理炫七;對于圖片進行壓縮問題,對于png钾唬,jpg万哪,jpeg沒有壓縮效果侠驯,對于svg,ico文件以及bmp文件壓縮效果達到50%奕巍,在productionGzipExtensions: ['js', 'css','svg']設置需要進行壓縮的什么格式的文件吟策。對項目文件進行壓縮之后,需要瀏覽器客戶端支持gzip以及后端支持gzip的止。下面可以查看成功支持gzip狀態(tài):
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
module.exports = {
  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/ndindex.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: './',

    /**
     * Source Maps
     */

    productionSourceMap: false,
    // https://webpack.js.org/configuration/devtool/#production
    devtool: '#source-map',

    // Gzip off by default as many popular static hosts such as
    // Surge or Netlify already gzip all static assets for you.
    // Before setting to `true`, make sure to:
    // npm install --save-dev compression-webpack-plugin
    productionGzip: true,
    productionGzipExtensions: ['js', 'css','svg'],

    // Run the build command with an extra argument to
    // View the bundle analyzer report after build finishes:
    // `npm run build --report`
    // Set to `true` or `false` to always turn it on or off
    bundleAnalyzerReport: process.env.npm_config_report
  }
}

  • image
  • 對路由組件進行懶加載

    • 在路由配置文件里檩坚,這里是router.js里面引用組件。如果使用同步的方式加載組件诅福,在首屏加載時會對網絡資源加載加載比較多匾委,資源比較大,加載速度比較慢氓润。所以設置路由懶加載赂乐,按需加載會加速首屏渲染。在沒有對路由進行懶加載時咖气,在Chrome里devtool查閱可以看到首屏網絡資源加載情況(6requests 3.8MB transfferred Finish:4.67s DOMContentLoaded 2.61s Load 2.70s)挨措。在對路由進行懶加載之后(7requests 800kb transffered Finish2.67s DOMContentLoaded 1.72s Load 800ms),可以看見加載速度明顯加快。但是進行懶加載之后崩溪,實現(xiàn)按需加載浅役,那么項目打包不會把所有js打包進app.[hash].js里面,優(yōu)點是可以減少app.[hash].js體積伶唯,缺點就是會把其它js分開打包觉既,造成多個js文件,會有多次https請求抵怎。如果項目比較大奋救,需要注意懶加載的效果岭参。
    // 實現(xiàn)懶加載方式
      import Vue from "vue";
      import Router from "vue-router";
      Vue.use(Router);
      export default new Router({
      mode: "history",
      base: "/facex/district/",
      routes: [
        { path: "/", redirect: "index" },
        {
        path: "/",
        name: "home",
        component: resolve=>require(["@/views/home"],resolve),
        children: [
          {
            // 員工查詢
            path: "/employees",
            component: resolve=>require(["@/components/employees"],resolve)
          },
        {
          // 首頁
          path: "/index",
          component: resolve=>require(["@/views/index"],resolve)
        },
        {
          // 訪客查詢
          path: "/visitorlist",
          component: resolve=>require(["@/components/visitorlist"],resolve)
        },
        {
          path: "/department",
          component: resolve=>require(["@/views/department"],resolve)
        },
        //識別查詢
        {
          path: "/discriminate",
          component: resolve=>require(["@/components/discriminate"],resolve)
        },
        {
          path: "/addDevice",
          component: resolve=>require(["@/views/addDevice"],resolve)
        },
        {
          path: "/districtNotice",
          component: resolve=>require(["@/components/districtNotice"],resolve)
        }
      ]
    },
    {
      path: "/noticeList",
      name: "noticeList",
      component: resolve=>require(["@/views/noticeList"],resolve)
      },
      {
        path: "/login",
        name: "login",
        component: resolve=>require(["@/views/login"],resolve)
      },
      {
        path: "/register",
        name: "register",
        component: resolve=>require(["@/views/register"],resolve)
      },
      {
        path: "/setaccount",
        name: "setaccount",
        component:resolve=>require(["@/views/setaccount"],resolve)
      },
      {
        path: "/addGroup",
        name: "addGroup",
        component:resolve=>require(["@/views/addGroup"],resolve)
      },
      {
        path: "/guide",
        name: "guide",
        component:resolve=>require(["@/components/guide"],resolve)
      },
      {
        path: "/addNotice",
        name: "addNotice",
        component: resolve=>require(["@/views/addNotice"],resolve)
        }
      ]
    });i
    
    

2.源碼優(yōu)化

  • v-if 和 v-show選擇調用
    • v-show和v-if的區(qū)別是:v-if是懶加載反惕,當狀態(tài)為true時才會加載,并且為false時不會占用布局空間演侯;v-show是無論狀態(tài)是true或者是false姿染,都會進行渲染,并對布局占據(jù)空間對于在項目中秒际,需要頻繁調用悬赏,不需要權限的顯示隱藏,可以選擇使用v-show娄徊,可以減少系統(tǒng)的切換開銷闽颇。
  • 為item設置唯一key值,
    • 在列表數(shù)據(jù)進行遍歷渲染時寄锐,需要為每一項item設置唯一key值兵多,方便vuejs內部機制精準找到該條列表數(shù)據(jù)尖啡。當state更新時,新的狀態(tài)值和舊的狀態(tài)值對比剩膘,較快地定位到diff衅斩。
  • 細分vuejs組件
    • 在項目開發(fā)過程之中,第一版本把所有的組件的布局寫在一個組件中怠褐,當數(shù)據(jù)變更時畏梆,由于組件代碼比較龐大,vuejs的數(shù)據(jù)驅動視圖更新比較慢奈懒,造成渲染比較慢奠涌。造成比較差的體驗效果。所以把組件細分筐赔,比如一個組件铣猩,可以把整個組件細分成輪播組件、列表組件茴丰、分頁組件等达皿。
  • 減少watch的數(shù)據(jù)
    • 當組件某個數(shù)據(jù)變更后需要對應的state進行變更,就需要對另外的組件進行state進行變更贿肩÷鸵可以使用watch監(jiān)聽相應的數(shù)據(jù)變更并綁定事件。當watch的數(shù)據(jù)比較小汰规,性能消耗不明顯汤功。當數(shù)據(jù)變大,系統(tǒng)會出現(xiàn)卡頓溜哮,所以減少watch的數(shù)據(jù)滔金。其它不同的組件的state雙向綁定,可以采用事件中央總線或者vuex進行數(shù)據(jù)的變更操作茂嗓。
  • 內容類系統(tǒng)的圖片資源按需加載
    • 對于內容類系統(tǒng)的圖片按需加載餐茵,如果出現(xiàn)圖片加載比較多,可以先使用v-lazy之類的懶加載庫或者綁定鼠標的scroll事件述吸,滾動到可視區(qū)域先再對數(shù)據(jù)進行加載顯示忿族,減少系統(tǒng)加載的數(shù)據(jù)。
  • SSR(服務端渲染)
    • 如果項目比較大蝌矛,首屏無論怎么做優(yōu)化道批,都出現(xiàn)閃屏或者一陣黑屏的情況∪肴觯可以考慮使用SSR(服務端渲染)隆豹,vuejs官方文檔提供next.js很好的服務端解決方案,但是局限性就是目前僅支持Koa茅逮、express等Nodejs的后臺框架璃赡,需要webpack支持簿煌。目前自己了解的就是后端支持方面,vuejs的后端渲染支持php鉴吹,其它的不太清楚姨伟。

3.用戶體驗優(yōu)化

  • better-click防止iphone點擊延遲
    • 在開發(fā)移動端vuejs項目時,手指觸摸時會出現(xiàn)300ms的延遲效果豆励,可以采用better-click對ipone系列的兼容體驗優(yōu)化夺荒。
  • 菊花loading
    • 菊花loading,在加載資源過程之中良蒸,可以提供loading技扼。此菊花loading不是那菊花。所以可以自由選擇自己喜歡的菊花嫩痰。
  • 骨架屏加載
    • 在首屏加載資源較多剿吻,可能會出現(xiàn)白屏和閃屏的情況。體驗不好串纺。盜圖一波丽旅,小米商城使用骨架屏進行首屏在資源數(shù)據(jù)還沒有加載完成時顯示,給很好的體驗效果纺棺。

      image

引用參考:
Vue頁面骨架屏的實現(xiàn)方法
淺談 Vue 項目優(yōu)化
Vue 初始化性能優(yōu)化
Vue 性能優(yōu)化經驗總結
路由懶加載
VUE2組件懶加載淺析
基于VUE的SPA單頁應用開發(fā)-加載性能篇

作者:Evtion
鏈接:http://www.reibang.com/p/41075f1f5297

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末榄笙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祷蝌,更是在濱河造成了極大的恐慌茅撞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巨朦,死亡現(xiàn)場離奇詭異米丘,居然都是意外死亡,警方通過查閱死者的電腦和手機糊啡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門拄查,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悔橄,你說我怎么就攤上這事靶累∠俸粒” “怎么了癣疟?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長潮酒。 經常有香客問我睛挚,道長,這世上最難降的妖魔是什么急黎? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任扎狱,我火速辦了婚禮侧到,結果婚禮上,老公的妹妹穿的比我還像新娘淤击。我一直安慰自己匠抗,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布污抬。 她就那樣靜靜地躺著汞贸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪印机。 梳的紋絲不亂的頭發(fā)上矢腻,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音射赛,去河邊找鬼多柑。 笑死,一個胖子當著我的面吹牛楣责,可吹牛的內容都是我干的竣灌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秆麸,長吁一口氣:“原來是場噩夢啊……” “哼帐偎!你這毒婦竟也來了?” 一聲冷哼從身側響起蛔屹,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤削樊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兔毒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漫贞,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年育叁,在試婚紗的時候發(fā)現(xiàn)自己被綠了迅脐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡豪嗽,死狀恐怖谴蔑,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情龟梦,我是刑警寧澤隐锭,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站计贰,受9級特大地震影響钦睡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜躁倒,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一荞怒、第九天 我趴在偏房一處隱蔽的房頂上張望洒琢。 院中可真熱鬧,春花似錦褐桌、人聲如沸衰抑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽停士。三九已至,卻和暖如春完丽,著一層夾襖步出監(jiān)牢的瞬間恋技,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工逻族, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜻底,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓聘鳞,卻偏偏與公主長得像薄辅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抠璃,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • 在使用elementUI構建公司管理系統(tǒng)時站楚,發(fā)現(xiàn)首屏加載時間長,加載的網絡資源比較多搏嗡,對系統(tǒng)的體驗性會差一點窿春,而且...
    Evtion閱讀 47,453評論 7 54
  • 基于Vue的一些資料 內容 UI組件 開發(fā)框架 實用庫 服務端 輔助工具 應用實例 Demo示例 element★...
    嘗了又嘗閱讀 1,151評論 0 1
  • UI組件 element - 餓了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的組...
    魯大師666閱讀 43,392評論 5 97
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    35eeabfa0772閱讀 3,268評論 7 12
  • 丨本周買賣操作 買入基金:紅利ETF(510880)、券商ETF(512000)采盒、紅利基金(501029) 賣出基...
    sharespeak閱讀 137評論 0 1