當前位置:首頁 » 網頁前端 » vue前端代碼優化
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

vue前端代碼優化

發布時間: 2023-08-08 04:14:59

前端性能優化之Gzip

由於我們團隊的前端項目越來越龐大,加之Vue的SPA首屏載入特性,導致系統第一次載入速度越來越緩慢,可能達到幾十秒的程度,所以為了優化用戶性能體驗,我們選擇了開啟Gzip進行文件壓縮,確實達到了顯著的效果。

Gzip原本用戶UNIX系統的文件壓縮,後來逐漸成為Internet最主流的數據壓縮格式。
當用戶訪問我們的web站點時,伺服器就將我們的網頁文件進行壓縮,將壓縮後的文件傳輸到客戶端,對於純文本文件我們可以至少壓縮到原大小的40%,這樣大大提高了傳輸效率,頁面便可更快的載入出來。

由於目前我們項目是使用ngxin來部署前端的,nginx自首穗帶 HttpGzip模塊 所以我們直接對 nginx.conf 文件的http配置項進行配置即可。但相對的由於nginx自身處理請求然後輪芹局壓縮返回,會消耗對應的伺服器內存。

測試效果

我們應盡可能減少對服務端內存的使用,畢竟服務端的資源是十分寶貴的,這里我們仍然使用nginx進行前端部署,我們在客戶端替nginx處理壓縮文件這一步操作,nginx便可直接使用我們壓縮好的文件,下面是一個基於vue-cli配置的前端項目。

這里最好安裝低版本,防止報錯。

這里可以根據大家不同的配置,總之就是將webpack插件進行注冊。

成功運行後,便可以在打包文件中看到.gz結尾的文件了,將打包後的文件上傳到指定的nginx文件夾下。

這里需要nginx對應臘讓的插件 http_gzip_static_mole ,之前我是通過yum安裝的nginx,這里似乎不可以,需要手動安裝。這里目錄可以根據大家個人情況而定。
安裝nginx

修改nginx.conf

啟動nginx服務

這里我們雖然服務端js文件夾里只有.gz格式的文件(其他的文件已刪除),但客戶端卻成功讀取了。

無論是服務端與客戶端進行gzip的壓縮,我們都大大縮小了文件體積,給用戶帶來了更好的體驗。
服務端處理gzip優點是只需配置一下即可,無需復雜操作,但缺點是會消耗伺服器內存。
客戶端處理gzip優點是無需伺服器進行文件壓縮,減少伺服器內存消耗,但配置起來相比服務端gzip會稍加繁瑣。

Nginx中文文檔
什麼是GZIP,有什麼優勢,如何開啟GZIP?
vue-cli4 開發項目中開啟gzip壓縮,優化打包體積,提升載入速度
Nginx gzip static靜態壓縮
配置nginx直接使用webpack生成的gz壓縮文件,而不用nginx自己壓縮

② 前端性能優化總結(一)-js、css優化

移動互聯網時代,用戶對於網頁的打開速度要求越來越高。首屏作為直面用戶的第一屏,其重要性不言而喻。優化用戶體驗更是我們前端開發非常需要 focus 的東西之一。

從用戶的角度而言,當打開一個網頁,往往關心的是從輸入完網頁地址後到最後展現完整頁面這個過程需要的時間,這個時間越短,用戶體驗越好。所以作為網頁的開發者,就從輸入url到頁面渲染呈現這個過程中去提升網頁的性能。

所以輸入URL後發生了什麼呢?在瀏覽器中輸入url會經歷域名解析、建立TCP連接、發送http請求、資源解析等步驟。

http緩存優化是網頁性能優化的重要一環,這一部分我會在後續筆記中做一個詳細總結,所以本文暫不多做詳細整理。本文主要從網頁渲染過程、網頁交互以及Vue應用優化三個角度對性能優化做一個小結。

首先談談拿到服務端資源後瀏覽器渲染的流程:

關鍵渲染路徑是瀏覽器將 HTML、CSS、JavaScript 轉換為在屏幕上呈現的像素內容所經歷的一系列步驟。也就是我們剛剛提到的的的瀏覽器渲染流程。

為盡快完成首次渲染,我們需要最大限度減小以下三種可變因素:

首先,DOM 和 CSSOM 通常是並行構建的,所以 CSS 載入不會阻塞 DOM 的解析。

然而,由於 Render Tree 是依賴於 DOM Tree 和 CSSOM Tree 的,
所以他必須等待到 CSSOM Tree 構建完成,也就是 CSS 資源載入完成(或者 CSS 資源載入失敗)後,才能開始渲染。因此,CSS 載入會阻塞 Dom 的渲染。

由此可見,對於 CSSOM 縮小、壓縮以及緩存同樣重要,我們可以從這方面考慮去優化。

當瀏覽器遇到 script 標記時,會阻止解析器繼續操作,直到 CSSOM 構建完畢,JavaScript 才會運行並繼續完成 DOM 構建過程。

當頁面中元素樣式的改變並不影響它在文檔流中的位置時(例如:color、background-color、visibility 等),瀏覽器會將新樣式賦予給元素並重新繪制它,這個過程稱為重繪。

迴流(Reflow)
當 Render Tree 中部分或全部元素的尺寸、結構、或某些屬性發生改變時,瀏覽器重新渲染部分或全部文檔的過程稱為迴流。

有時即使僅僅迴流一個單一的元素,它的父元素以及任何跟隨它的元素也會產生迴流。現代瀏覽器會對頻繁的迴流或重繪操作進行優化:瀏覽器會維護一個隊列,把所有引起迴流和重繪的操作放入隊列中,如果隊列中的任務數量或者時間間隔達到一個閾值的,瀏覽器就會將隊列清空,進行一次批處理,這樣可以把多次迴流和重繪變成一次。
當你訪問以下屬性或方法時,瀏覽器會立刻清空隊列:

因為隊列中可能會有影響到這些屬性或方法返回值的操作,即使你希望獲取的信息與隊列中操作引發的改變無關,瀏覽器也會強行清空隊列,確保你拿到的值是最精確的。

避免頻繁操作樣式,最好一次性重寫 style 屬性,或者將樣式列表定義為 class 並一次性更改 class 屬性。

避免頻繁操作 DOM,創建一個 documentFragment,在它上面應用所有 DOM 操作,最後再把它添加到文檔中。
也可以先為元素設置 display: none,操作結束後再把它顯示出來。因為在 display 屬性為 none 的元素上進行的 DOM 操作不會引發迴流和重繪。
避免頻繁讀取會引發迴流/重繪的屬性,如果確實需要多次使用,就用一個變數緩存起來。
對具有復雜動畫的元素使用絕對定位,使它脫離文檔流,否則會引起父元素及後續元素頻繁迴流。

圖片懶載入在一些圖片密集型的網站中運用比較多,通過圖片懶載入可以讓一些不可視的圖片不去載入,避免一次性載入過多的圖片導致請求阻塞(瀏覽器一般對同一域名下的並發請求的連接數有限制),這樣就可以提高網站的載入速度,提高用戶體驗。

將頁面中的img標簽src指向一張小圖片或者src為空,然後定義data-src(這個屬性可以自定義命名,我才用data-src)屬性指向真實的圖片。src指向一張默認的圖片,否則當src為空時也會向伺服器發送一次請求。可以指向loading的地址。注意,圖片要指定寬高。

當載入頁面時,先把可視區域內的img標簽的data-src屬性值負給src,然後監聽滾動事件,把用戶即將看到的圖片載入。這樣便實現了懶載入。

事件委託其實就是利用JS事件冒泡機制把原本需要綁定在子元素的響應事件(click、keydown……)委託給父元素,讓父元素擔當事件監聽的職務。事件代理的原理是DOM元素的事件冒泡。
優點:

例如有一個列表需要綁定點擊事件,每一個列表項的點擊都需要返回不同的結果。
傳統寫法:

傳統方法會利用for循環遍歷列表為每一個列表元素綁定點擊事件,當列表中元素數量非常龐大時,需要綁定大量的點擊事件,這種方式就會產生性能問題。這種情況下利用事件委託就能很好的解決這個問題。

改用事件委託:

輸入搜索時,可以用防抖debounce等優化方式,減少http請求;
這里以滾動條事件舉例:防抖函數 onscroll 結束時觸發一次,延遲執行

節流函數:只允許一個函數在N秒內執行一次。滾動條調用介面時,可以用節流throttle等優化方式,減少http請求;
下面還是一個簡單的滾動條事件節流函數:節流函數 onscroll 時,每隔一段時間觸發一次,像水滴一樣

參考鏈接: https://zhuanlan.hu.com/p/113864878?from_voters_page=true