摘要:在美團(tuán)支付的前端技術(shù)體系里,通過預(yù)渲染提升網(wǎng)頁首幀優(yōu)化,從而優(yōu)化了白屏問題,提升用戶體驗(yàn),并形成了最佳實(shí)踐。我們團(tuán)隊(duì)主要負(fù)責(zé)美團(tuán)支付相關(guān)的業(yè)務(wù),如果網(wǎng)站太慢會影響用戶的支付體驗(yàn),會造成客訴或資損。
前言
自JavaScript誕生以來,前端技術(shù)發(fā)展非常迅速。移動端白屏優(yōu)化是前端界面體驗(yàn)的一個重要優(yōu)化方向,Web 前端誕生了 SSR 、CSR、預(yù)渲染等技術(shù)。在美團(tuán)支付的前端技術(shù)體系里,通過預(yù)渲染提升網(wǎng)頁首幀優(yōu)化,從而優(yōu)化了白屏問題,提升用戶體驗(yàn),并形成了最佳實(shí)踐。
在前端渲染領(lǐng)域,主要有以下幾種方式可供選擇:
CSR | 預(yù)渲染 | SSR | 同構(gòu) | |
---|---|---|---|---|
優(yōu)點(diǎn) | 不依賴數(shù)據(jù)FP 時間最快客戶端用戶體驗(yàn)好內(nèi)存數(shù)據(jù)共享 | 不依賴數(shù)據(jù)FCP 時間比 CSR 快客戶端用戶體驗(yàn)好內(nèi)存數(shù)據(jù)共享 | SEO 友好首屏性能高,F(xiàn)MP 比 CSR 和預(yù)渲染快 | SEO 友好首屏性能高,F(xiàn)MP 比 CSR 和預(yù)渲染快客戶端用戶體驗(yàn)好內(nèi)存數(shù)據(jù)共享客戶端與服務(wù)端代碼公用,開發(fā)效率高 |
缺點(diǎn) | SEO 不友好FCP 、FMP 慢 | SEO 不友好FMP 慢 | 客戶端數(shù)據(jù)共享成本高模板維護(hù)成本高 | Node 容易形成性能瓶頸 |
通過對比,同構(gòu)方案集合 CSR 與 SSR 的優(yōu)點(diǎn),可以適用于大部分業(yè)務(wù)場景。但由于在同構(gòu)的系統(tǒng)架構(gòu)中,連接前后端的 Node 中間層處于核心鏈路,系統(tǒng)可用性的瓶頸就依賴于 Node ,一旦作為短板的 Node 掛了,整個服務(wù)都不可用。
結(jié)合到我們團(tuán)隊(duì)負(fù)責(zé)的支付業(yè)務(wù)場景里,由于支付業(yè)務(wù)追求極致的系統(tǒng)穩(wěn)定性,服務(wù)不可用直接影響到客訴和資損,因此我們采用瀏覽器端渲染的架構(gòu)。在保證系統(tǒng)穩(wěn)定性的前提下,還需要保障用戶體驗(yàn),所以采用了預(yù)渲染的方式。
那么究竟什么是預(yù)渲染呢?什么是 FCP/FMP 呢?我們先從最常見的 CSR 開始說起。
以 Vue 舉例,常見的 CSR 形式如下:
一切看似很美好。然而,作為以用戶體驗(yàn)為首要目標(biāo)的我們發(fā)現(xiàn)了一個體驗(yàn)問題:首屏白屏問題。
為什么會首屏白屏瀏覽器渲染包含 HTML 解析、DOM 樹構(gòu)建、CSSOM 構(gòu)建、JavaScript 解析、布局、繪制等等,大致如下圖所示:
要搞清楚為什么會有白屏,就需要利用這個理論基礎(chǔ)來對實(shí)際項(xiàng)目進(jìn)行具體分析。通過 DevTools 進(jìn)行分析:
等待 HTML 文檔返回,此時處于白屏狀態(tài)。
對 HTML 文檔解析完成后進(jìn)行首屏渲染,因?yàn)轫?xiàng)目中對 id="app加了灰色的背景色,因此呈現(xiàn)出灰屏。
進(jìn)行文件加載、JS 解析等過程,導(dǎo)致界面長時間出于灰屏中。
當(dāng) Vue 實(shí)例觸發(fā)了 mounted 后,界面顯示出大體框架。
調(diào)用 API 獲取到時機(jī)業(yè)務(wù)數(shù)據(jù)后才能展示出最終的頁面內(nèi)容。
由此得出結(jié)論,因?yàn)橐却募虞d、CSSOM 構(gòu)建、JS 解析等過程,而這些過程比較耗時,導(dǎo)致用戶會長時間出于不可交互的首屏灰白屏狀態(tài),從而給用戶一種網(wǎng)頁很“慢”的感覺。那么一個網(wǎng)頁太“慢”,會造成什么影響呢?
“慢”的影響Global Web Performance Matters for ecommerce的報告中指出:
57%的用戶更在乎網(wǎng)頁在3秒內(nèi)是否完成加載。
52%的在線用戶認(rèn)為網(wǎng)頁打開速度影響到他們對網(wǎng)站的忠實(shí)度。
每慢1秒造成頁面 PV 降低11%,用戶滿意度也隨之降低降低16%。
近半數(shù)移動用戶因?yàn)樵?0秒內(nèi)仍未打開頁面從而放棄。
我們團(tuán)隊(duì)主要負(fù)責(zé)美團(tuán)支付相關(guān)的業(yè)務(wù),如果網(wǎng)站太慢會影響用戶的支付體驗(yàn),會造成客訴或資損。既然網(wǎng)站太“慢”會造成如此重要的影響,那要如何優(yōu)化呢?
優(yōu)化思路在User-centric Performance Metrics一文中,共提到了4個頁面渲染的關(guān)鍵指標(biāo):
基于這個理論基礎(chǔ),再回過頭來看看之前項(xiàng)目的實(shí)際表現(xiàn):
可見在 FP 的灰白屏界面停留了很長時間,用戶不清楚網(wǎng)站是否有在正常加載,用戶體驗(yàn)很差。
試想:如果我們可以將 FCP 或 FMP 完整的 HTML 文檔提前到 FP 時機(jī)預(yù)渲染,用戶看到頁面框架,能感受到頁面正在加載而不是冷冰冰的灰白屏,那么用戶更愿意等待頁面加載完成,從而降低了流失率。并且這種改觀在弱網(wǎng)環(huán)境下更明顯。
通過對比 FP、FCP、FMP 這三個時期 DOM 的差異,發(fā)現(xiàn)區(qū)別在于:
FP:僅有一個 div 根節(jié)點(diǎn)。
FCP:包含頁面的基本框架,但沒有數(shù)據(jù)內(nèi)容。
FMP:包含頁面所有元素及數(shù)據(jù)。
仍然以 Vue 為例, 在其生命周期中,mounted 對應(yīng)的是 FCP,updated 對應(yīng)的是 FMP。那么具體應(yīng)該使用哪個生命周期的 HTML 結(jié)構(gòu)呢?
mounted (FCP) | updated (FMP) | |
---|---|---|
缺點(diǎn) | 只是視覺體驗(yàn)將 FCP 提前,實(shí)際的 TTI 時間變化不大 | 構(gòu)建時需要獲取數(shù)據(jù),編譯速度慢構(gòu)建時與運(yùn)行時的數(shù)據(jù)存在差異性有復(fù)雜交互的頁面,仍需等待,實(shí)際的 TTI 時間變化不大 |
優(yōu)點(diǎn) | 不受數(shù)據(jù)影響,編譯速度快 | 首屏體驗(yàn)好對于純展示類型的頁面,F(xiàn)P 與 TTI 時間近乎一致 |
通過以上的對比,最終選擇在 mounted 時觸發(fā)構(gòu)建時預(yù)渲染。由于我們采用的是 CSR 的架構(gòu),沒有 Node 作為中間層,因此要實(shí)現(xiàn) DOM 內(nèi)容的預(yù)渲染,就需要在項(xiàng)目構(gòu)建編譯時完成對原始模板的更新替換。
至此,我們明確了構(gòu)建時預(yù)渲染的大體方案。
構(gòu)建時預(yù)渲染方案構(gòu)建時預(yù)渲染流程:
配置讀取由于 SPA 可以由多個路由構(gòu)成,需要根據(jù)業(yè)務(wù)場景決定哪些路由需要用到預(yù)渲染。因此這里的配置文件主要是用于告知編譯器需要進(jìn)行預(yù)渲染的路由。
在我們的系統(tǒng)架構(gòu)里,腳手架是基于 Webpack 自研的,在此基礎(chǔ)上可以自定義自動化構(gòu)建任務(wù)和配置。
觸發(fā)構(gòu)建項(xiàng)目中主要是使用 TypeScript,利用 TS 的裝飾器,我們封裝了統(tǒng)一的預(yù)渲染構(gòu)建的鉤子方法,從而只用一行代碼即可完成構(gòu)建時預(yù)渲染的觸發(fā)。
裝飾器:
使用:
構(gòu)建編譯從流程圖上,需要在發(fā)布機(jī)上啟動模擬的瀏覽器環(huán)境,并通過預(yù)渲染的事件鉤子獲取當(dāng)前的頁面內(nèi)容,生成最終的 HTML 文件。
由于我們在預(yù)渲染上的嘗試比較早,當(dāng)時還沒有 Headless Chrome 、 Puppeteer、Prerender SPA Plugin等,因此在選型上使用的是 phantomjs-prebuilt(Prerender SPA Plugin 早期版本也是基于 phantomjs-prebuilt 實(shí)現(xiàn)的)。
通過 phantom 提供的 API 可獲得當(dāng)前 HTML,示例如下:
為了提高構(gòu)建效率,并行對配置的多個頁面或路由進(jìn)行預(yù)渲染構(gòu)建,保證在 5S 內(nèi)即可完成構(gòu)建,流程圖如下:
方案優(yōu)化理想很豐滿,現(xiàn)實(shí)很骨感。在實(shí)際投產(chǎn)中,構(gòu)建時預(yù)渲染方案遇到了一個問題。
我們梳理一下簡化后的項(xiàng)目上線過程:
開發(fā) -> 編譯 -> 上線
假設(shè)本次修改了靜態(tài)文件中的一個 JS 文件,這個文件會通過 CDN 方式在 HTML 里引用,那么最終在 HTML 文檔中的引用方式是 。然而由于項(xiàng)目還沒有上線,所以其實(shí)通過完整 URL 的方式是獲取不到這個文件的;而預(yù)渲染的構(gòu)建又是在上線動作之前,所以問題就產(chǎn)生了:
構(gòu)建時預(yù)渲染無法正常獲取文件,導(dǎo)致編譯報錯
怎么辦?
請求劫持
因?yàn)樵谧鲱A(yù)渲染時,我們使用啟動了一個模擬的瀏覽器環(huán)境,根據(jù) phantom 提供的 API,可以對發(fā)出的請求加以劫持,將獲取 CDN 文件的請求劫持到本地,從而在根本上解決了這個問題。示例代碼如下:
構(gòu)建時預(yù)渲染研發(fā)流程及效果最終,構(gòu)建時預(yù)渲染研發(fā)流程如下:
開發(fā)階段:
通過 TypeScript 的裝飾器單行引入預(yù)渲染構(gòu)建觸發(fā)的方法。
發(fā)布前修改編譯構(gòu)建的配置文件。
發(fā)布階段:
先進(jìn)行常規(guī)的項(xiàng)目構(gòu)建。
若有預(yù)渲染相關(guān)配置,則觸發(fā)預(yù)渲染構(gòu)建。
通過預(yù)渲染得到最終的文件,并完成發(fā)布上線動作。
完整的用戶請求路徑如下:
通過構(gòu)建時預(yù)渲染在項(xiàng)目中的使用,F(xiàn)CP 的時間相比之前減少了 75%。
作者簡介寒陽,美團(tuán)資深研發(fā)工程師,多年前端研發(fā)經(jīng)歷,負(fù)責(zé)美團(tuán)支付錢包團(tuán)隊(duì)和美團(tuán)支付前端基礎(chǔ)技術(shù)。
招聘信息我們美團(tuán)金融服務(wù)平臺大前端研發(fā)組在高速成長中,我們歡迎更多優(yōu)秀的 Web 前端研發(fā)工程師加入,感興趣的朋友可以將簡歷發(fā)送到郵箱:shanghanyang@meituan.com。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108630.html
摘要:模仿的功能掘金本模仿了的功能。國內(nèi)曾經(jīng)出現(xiàn)的團(tuán)購類網(wǎng)站有多家,到四年多以后的現(xiàn)在,美團(tuán)已經(jīng)是成為國內(nèi)最大的本地生活服務(wù)平臺,不管怎餓了么移動的架構(gòu)演進(jìn)掘金引言時代演進(jìn),技術(shù)也隨之發(fā)展。 模仿 Smartisan OS 的 BigBang 功能 ??? - Android - 掘金 本 Demo 模仿了 Smartisan OS 的 BigBang 功能。App 打開會從剪切板讀取文字并...
摘要:雖然有著各種各樣的不同,但是相同的是,他們前端優(yōu)化不完全指南前端掘金篇幅可能有點(diǎn)長,我想先聊一聊閱讀的方式,我希望你閱讀的時候,能夠把我當(dāng)作你的競爭對手,你的夢想是超越我。 如何提升頁面渲染效率 - 前端 - 掘金Web頁面的性能 我們每天都會瀏覽很多的Web頁面,使用很多基于Web的應(yīng)用。這些站點(diǎn)看起來既不一樣,用途也都各有不同,有在線視頻,Social Media,新聞,郵件客戶端...
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
摘要:北京時間月日月日,由和中國國際人才交流基金會聯(lián)合主辦的第七屆全球軟件案例研究峰會簡稱在北京國家會議中心圓滿落幕。本屆峰會,來自阿里美團(tuán)百度平安銀行等企業(yè)的講師分別從企業(yè)轉(zhuǎn)型及研發(fā)效能方面分享敏捷和的實(shí)踐細(xì)節(jié)和操作經(jīng)驗(yàn)。 北京時間11月30日-12月3日,由msup和中國國際人才交流基金會聯(lián)合主辦的第七屆全球軟件案例研究峰會(簡稱:TOP100summit)在北京國家會議中心圓滿落幕。T...
閱讀 5264·2021-10-15 09:42
閱讀 1621·2021-09-22 16:05
閱讀 3283·2021-09-22 15:57
閱讀 3419·2019-12-27 12:06
閱讀 979·2019-08-29 15:16
閱讀 2890·2019-08-26 12:24
閱讀 393·2019-08-26 12:02
閱讀 1898·2019-08-23 16:00