主頁 > 企業開發 > 前端首屏渲染時間的極致優化

前端首屏渲染時間的極致優化

2022-10-19 09:30:33 企業開發

20220722174820

我們知道,用戶體驗是 Web 產品最為重要的部分,盡可能減少首屏加載時間,更為流暢地展示用戶所需求的內容,會是用戶是否留存的關鍵因素,

而隨著現代 Web 業務可供用戶的互動行為越來越多,前端專案的復雜度越來越高,每個頁面的渲染時間也必然越來越長,這就導致了用戶的體驗不佳,用戶的操作變慢,

為此,前端工程師們在首屏請求的各個階段中持續鉆研,不斷探究如何將首次頁面渲染的時間減少到更小,力求提供更為優秀的產品體驗,

CSR(Client Side Render)

20220720162452

瀏覽器渲染是最簡單,最符合 Web 應用設計思路的渲染方式,

所謂瀏覽器渲染,就是將應用所需的頁面展示、前端邏輯、介面請求全都在用戶的瀏覽器中執行,它很好的實作了前后端的解耦,讓前端開發更為獨立,也讓后臺實作更為簡單,

同時,為了緩解用戶的等待焦慮,我們可以用 loading 態,或者骨架屏,進一步提升異步請求介面時的用戶體驗,

不過,隨著業務復雜程度提高,瀏覽器渲染的開銷也會變大,我們無法控制用戶側使用的機器性能,很多時候,用戶使用的機器性能甚至不足以滿足應用的需求,造成卡頓,甚至崩潰,這一點在移動端上尤甚,

而瀏覽器渲染由于前端的動態性過高,也會帶來 SEO 不佳的問題,

SSR(Server Side Render)

20220720162513

服務端渲染的出現時間實際上是要比瀏覽器渲染要更早的,在 Web 應用發展的早期,所有的 ASP、JSP 等模板引擎構建的前端頁面實際上就是服務端渲染的結果,而此時的服務端渲染無法進行前后端職責的解耦,因此逐步被瀏覽器渲染淘汰,

但在處理首屏體驗的問題上,服務端渲染有著獨到的優勢,它能提前再服務端中完成頁面模板的資料填充,從而一次性回傳完整的首屏內容,從而面對 SEO 的爬取時能獲取到更多有效的關鍵資訊,

此外,由于其能快速直出首頁的真實資料,體驗往往比 loading 態更佳,在 TTI 的表現上更為出色,

但是,服務端渲染也有其自身的局限性,因為從本質上來說,SSR 服務無法完全與前端頁面解耦開來,因此市面上較完備的 SSR 解決方案都只解決首屏的服務端渲染,并采用同構的方式,增加一層 node 中間層的方式來解決前端與 SSR 服務的更新同步問題,并與后端開發專案解耦,

但這無疑增加了專案的復雜度,并且隨著業務的復雜程度變高,服務端渲染往往需要調起多個介面去請求資料并填充頁面,這樣可能會導致在 TTFB 上有一定劣勢,

當然,最重要的是,服務端渲染對于服務器的負載要求是很高的,

20220722153734

上圖是參考的位元組的某專案的 SSR 服務的單機 QPS 承載表現,我們可以看出,對于一個高訪問量的網頁應用來說,提供一個較為復雜的 SSR 服務的成本是相當高的,需要花費大量的金錢來堆機器,

因此,從降本增效的角度考慮,我們需要評估 SSR 帶來的 ROI 是否符合預期,

NSR(Native Side Render)

在移動互聯網的浪潮下,移動端機能飛速提升,那么 Web 應用是否能搭上這一班車,將 Native 的性能利用起來,提升頁面渲染性能呢?答案是肯定的,這就需要介紹到 NSR 了,

20220720162547

Native 渲染的本質其實還是 SSR,只不過提供服務的 Server 轉變為了客戶端,由于需要用到客戶端機能,因此此種實作通常應用在移動端 APP,或者 PWA 下,

當鏈接被點擊時,先借助瀏覽器啟用一個 JS 運行時,并加載 APP 中存盤的 Html 模板,發送 xhr 請求預加載頁面資料,從而在客戶端本地拼接并渲染生成一個有資料的 Html 首屏,形成首次 NSR,同時可以將該首屏 Html 快取在客戶端,供下次頁面打開時,實作 stale-while-revalidate 的快取效果,

由于 NSR 將服務器的渲染作業放在了客戶端的一個個獨立設備中,既實作了頁面的預加載,同時又不會增加額外的服務器壓力,達到秒看的效果,

這種能力在擁有客戶端或者支持 PWA 的應用中應用廣泛,例如手 Q,騰訊檔案 APP 中都擁有通過 APP 中的離線包來實作首屏渲染加速的能力,

ESR(Edge Side Render)

那么,對于純 Web 應用,而又由于兼容性等原因暫時無法支持 PWA 的頁面,有沒有一個合適的首屏渲染加速方案呢?

隨著云與邊緣計算的快速發展,前端頁面也需要考慮分布式的請求處理優化,

20220720162606

我們知道,CDN 節點相比真實服務節點更貼近用戶,能更快將內容回傳,因此我們可以將靜態的 Html 內容模板快取在 CDN 上,當接到請求時,先快速將靜態模板頁面回傳給用戶,同時在 CDN 服務器上對頁面動態部分發起向后端發起請求,并將獲取到的動態內容在以流式下發的方式繼續回傳給用戶,

這里實際上利用到了 HTTP 的 SSE(Server Send Events)協議,通過服務器向客戶端發送單向事件流,實作同一個 Html 檔案的分塊傳輸預渲染,

最佳實踐是?

這也是我們最近在騰訊檔案中探索實踐并落地的,通過服務中間節點的流式下發能力,實作多級首屏渲染加速,

對于一個復雜前端頁面來說,首屏需要加載和運算的資源型別可能有很多,有需要客戶端決議并執行的 JS 動效,也有需要服務端獲取資料直出的資料分片展示頁面,

通常來說,客戶端只能等待服務端獲取分片資料,并生成經過 SSR 渲染后的 HTML,才能開始進行 script 決議與 js 資源拉取的行為,最終渲染出完整的頁面資料以及動效,

而既然他們所需要的計算方式不同,那么為什么不能并行來做呢?

我們可以在版本發布前,將未經過服務端直出的模板 HTML 進行決議,將需要發起資源請求的所有的外鏈腳本 url 提取出來,生成一個 HTML Header 結構,并將該 Header 內容偽裝為正常 HTML 快取在 CDN 節點中,

結合之前我們介紹的 HTTP SSE 協議,當用戶請求時,我們可以以最快的速度向用戶回傳 CDN 中的 HTML header,從而讓用戶的瀏覽器提前拉取并決議外鏈資源,于此同時,CDN 節點將用戶的請求轉發給真實的服務端,從而讓服務端進行真實資料的獲取拼接并回傳給客戶端,

由于客戶端此時已經提前拉取了外鏈資源,因此收到服務端分片的 SSR 后,客戶端可以直接將真實資料渲染到頁面中,而不需要再次等待外鏈資源的決議,

由于并行的關系,這樣的 SSR 與 NSR 混合方式能大大降低復雜頁面首屏渲染的時間,提升用戶體驗,

以百度首頁的請求為例,通過 Chorme Network 提供的瀑布圖,通過我們可以直觀的看到一條請求的執行程序,

20220913172530

我們可以看出,除了 DNS 尋址與 SSL 建連是我們無法控制的以外,占用請求時間的大頭是 Waiting for server response,請求服務器 (CDN) 的時間,以及 Content Download,外鏈資源的拉取時間,

而使用本文的混合方案后,理論上可以使總請求時間降低到 Max(A, B), (A 為 Waiting for server response,B 為 Content Download) 的水平,(當然,實際操作程序中,由于 CDN 節點進行了一次請求轉發,因此擁有 SSR 能力的頁面請求回傳時間會更長一些),

結語

前端的頁面首屏時間優化是永恒的話題,本文介紹了前端界對首屏時間優化的行程,并提供了一種 SSR 與 NSR 混合的新思路,通過并行處理耗時任務的方式,進一步提升首屏加載時間,希望能夠給大家提供一點參考價值,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517652.html

標籤:其他

上一篇:Vue專案打包成docker鏡像部署

下一篇:《Vue3.x+TypeScript實踐指南》已出版

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more