Vue首屏載入速度優化如何提升80%?本文詳解

来源:https://www.cnblogs.com/chengxuyuanaa/archive/2020/06/11/13092078.html
-Advertisement-
Play Games

在Vue項目中,引入到工程中的所有js、css文件,編譯時都會被打包進vendor.js,瀏覽器在載入該文件之後才能開始顯示首屏。若是引入的庫眾多,那麼vendor.js文件體積將會相當的大,影響首屏的體驗。可以看個例子: 差點忘記介紹了:我是一名08年出道的高級前端老鳥,大家如果想跟我交流學習經驗 ...


       在Vue項目中,引入到工程中的所有js、css文件,編譯時都會被打包進vendor.js,瀏覽器在載入該文件之後才能開始顯示首屏。若是引入的庫眾多,那麼vendor.js文件體積將會相當的大,影響首屏的體驗。可以看個例子:

     差點忘記介紹了我是一名08年出道的高級前端老鳥,大家如果想跟我交流學習經驗,可以進我的扣扣裙 519293536 有問題我都會儘力幫大家。主要是中高級問題,小白勿進哦
這是優化前的頁面載入狀態:執行npm run build打包項目,出來的vendeor.js文件,基本都是1M以上的的巨大文件,沒有用戶能忍受5s以上的loading而不關閉頁面的,如圖所示:

 

 

       當項目在掛載到伺服器上,平均都是10S以上載入出來,好家伙這載入時間,仿佛過了半個世紀,很煩人,心態boom, 開發者甚至都有種想砸電腦的衝動(·#*@#¥……&*)!

 

 

我們先來分析下前端載入速度慢原因

1. 首先安裝webpack的可視化資源分析工具,命令行執行:
npm i webpack-bundle-analyzer -D複製代碼

2. 然後在webpack的dev開發模式配置中,引入插件,代碼如下:

const BundleAnalyzerPlugin = require('webpack-bundle-plugin').BundleAnalyzerPlugin

plugins: [
    new BundleAnalyzerPlugin()
]複製代碼

3. 最後命令行執行npm run build --report , 瀏覽器會自動打開分析結果,如下所示:

 

 

 可以看到vue全家桶相關依賴占用了很大的空間,對webpack的構建速度和網站載入速度都會有比較大的影響。單頁應用會隨著項目越大,導致首屏載入速度很慢,針對目前所暴露出來的問題,有以下幾種優化方案可以參考:

有針對性的優化方案

一、對於第三方js庫的優化,分離打包

       生產環境是內網的話,就把資源放內網,通過靜態文件引入,會比node_modules和外網CDN的打包載入快很多。如果有外網的話,可以通過CDN方式引入,因為不用占用訪問外網的帶寬,不僅可以為您節省流量,還能通過CDN加速,獲得更快的訪問速度。但是要註意下,如果你引用的CDN 資源存在於第三方伺服器,在安全性上並不完全可控。

        目前採用引入依賴包生產環境的js文件方式載入,直接通過window可以訪問暴露出的全局變數,不必通過import引入,Vue.use去註冊

        在webpack的dev開發配置文件中, 加入如下參數,可以分離打包第三方資源包,key為依賴包名稱,value是源碼拋出來的全局變數。如下圖所示,可以看到打包後vue相關資源包已經排除在外了。對於一些其他的工具庫,儘量採用按需引入的方式。

externals: {
    vue: 'Vue',
    vuex: 'Vuex',
    'vue-router': 'VueRouter',
    axios: 'axios',
    'element-ui': 'ELEMENT'
}

 

 

二、vue-router使用懶載入

       在訪問到當前頁面才會載入相關的資源,非同步方式分模塊載入文件,預設的文件名是隨機的id。如果在output中配置了chunkFilename,可以在component中添加WebpackChunkName,是為了方便調試,在頁面載入時候,會顯示載入的對應文件名+hash值,如下圖:

 

 

 

{
    path: '/Login',
    name: 'Login',
    component: () = >import( /* webpackChunkName: "Login" */  '@/view/Login')
}複製代碼

 

 

 

三、圖片資源的壓縮,icon資源使用雪碧圖

 

     嚴格說來這一步不算在編碼技術範圍內,但是卻對頁面的載入速度影響很大。對於所有的圖片文件,都可以在一個叫tinypng的網站上去壓縮一下。網址:tinypng.com/,對頁面上使用到的icon,可以使用線上字體圖標,或者雪碧圖,將眾多小圖標合併到同一張圖上,用以減輕http請求壓力。然後通過操作CSS的background屬性,控制背景的位置以及大小,來展示需要的部分。

 

四、開啟gizp壓縮

       gizp壓縮是一種http請求優化方式,通過減少文件體積來提高載入速度。html、js、css文件甚至json數據都可以用它壓縮,可以減小60%以上的體積。前端配置gzip壓縮,並且服務端使用nginx開啟gzip,用來減小網路傳輸的流量大小。

命令行執行:npm i compression-webpack-plugin -D

在webpack的dev開發配置文件中加入如下代碼:

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

plugins: [
   new CompressionWebpackPlugin()
]複製代碼

      啟用gzip壓縮打包之後,會變成下麵這樣,自動生成gz包。目前大部分主流瀏覽器客戶端都是支持gzip的,就算小部分非主流瀏覽器不支持也不用擔心,不支持gzip格式文件的會預設訪問源文件的,所以不要配置清除源文件。

配置好之後,打開瀏覽器訪問線上,F12查看控制台,如果該文件資源的響應頭裡顯示有Content-Encoding: gzip,表示瀏覽器支持並且啟用了Gzip壓縮的資源

 

 

 

 

五、webpack相關配置優化

(1)使用uglifyjs-webpack-plugin插件代替webpack自帶UglifyJsPlugin插件來壓縮JS文件;生產環境關閉源碼映射,一方面能減少代碼包的大小,另一方面也有利於系統代碼安全;清除列印日誌和debugger信息;配置SplitChunks 抽取公有代碼,提升你的應用的性能

(2)使用mini-xss-extract-plugin提取CSS 到單獨的文件, 並使用optimize-css-assets-webpack-plugin來壓縮CSS文件 。

註:具體相關webpack配置請點擊juejin.im/post/5d2070…查看第一篇webpack文章,註釋很詳細喲。

六、前端頁面代碼層面的優化

(1)合理使用v-if和v-show

(2)合理使用watch和computed

(3)使用v-for必須添加key, 最好為唯一id, 避免使用index, 且在同一個標簽上,v-for不要和v-if同時使用

(4)定時器的銷毀。可以在beforeDestroy()生命周期內執行銷毀事件;也可以使用$once這個事件偵聽器,在定義定時器事件的位置來清除定時器。詳細見vue官網

      最終優化後的效果如下圖:vendor.js文件從1M以上優化到256K左右,體積減少接近80%,排除伺服器影響的因素,界面渲染速度基本都在1s左右,達到秒開效果,比之前快 了太多,體驗一下就上來了嘻嘻。

       結語:前端性能優化至關重要,以後有遇到更好的其他方案會繼續補充進來。你也可以跟我探討,我是一名高級前端老鳥,大家如果想跟我交流學習經驗,可以進我的扣扣裙 519293536 有問題我都會儘力幫大家。主要是中高級問題,小白勿進哦

本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在最近的學習中,在GitHub上找了一些佈局練習,我發現了我自己對佈局超級不熟悉(很難受)。 在以前的學習中,感覺使用CSS就記住各個屬性的功能就OK了,但是呢?真的很打臉。不說了,太傷心了,進入正題吧! 最近我使用float和margin佈局,加深了我對這兩個一起使用的理解。(新生可以看一下,大神 ...
  • 列表項,有時需要判斷列表首尾,來篩選設置樣式 如上圖,三個項有間隔,怎麼保證設置了列表項之間的距離後,整體還水平居中顯示呢? .item:not(:first-child) { margin-left: 20px;} 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <me ...
  • 大家都說yarn比npm好,今天全局安裝yarn嘗試下 cnpm install -g yarn 安裝完成後,查看yarn版本 yarn --version 項目搭建 安裝vuepress yarn global add vuepress 初始化項目 創建項目目錄blog mkdir blog cd ...
  • 關於前端的話題知乎不能再多了,但作為一個自學者,希望以我的經歷給你們一點啟示或者幫助。 關於前端的學習資料和視頻可謂多之又多,學習方法也是大相徑庭,有推薦跟著慕課網的,也有W3C的,傳智播客,這裡就簡單提一下吧。我想大部分都是零基礎的居多吧,所以一些必備的基礎知識都沒有的話,後面的學習是很困難的。這 ...
  • 本次做後臺管理系統,採用的是 AntD 框架。涉及到圖片的上傳,用的是AntD的 upload 組件。 我在上一篇文章《前端AntD框架的upload組件上傳圖片時遇到的一些坑》中講到:AntD 的 upload 組件有很多坑,引起了很多人的關註。折騰過的人,自然明白其中的苦楚。 今天這篇文章,我們 ...
  • JavaScript是一種屬於網路的腳本語言,已經被廣泛用於Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。 CSS(Cascading Style Sheet)層疊樣式表單 表現(presen ...
  • ie8下透明度處理 css3新增屬性rgba和opacity:(0~1); 在ie8下無法使用 Alpha(opacity=[0~100]);//[0~100] 0是透明 100是不透明。 IE下的透明度屬性,子元素會繼承這個透明度。下麵有阻斷子元素繼承方法。 解決方法: 背景透明,文字不透明。 < ...
  • Vue計算屬性 1、提到計算屬性,我們馬上就會想到它的一個特性:緩存,Vue 文檔也如是說: 計算屬性是基於它們的響應式依賴進行緩存的/ 2。很榮幸給大家分享,我是一名08年出道的前端高級老鳥,大家如果想跟我交流學習經驗,可以進我的扣扣裙 519293536 有問題我都會儘力幫大家,喜歡中高級問題, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...