亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

不到 0.3s 完成渲染!360 信息流正文“閃開”優(yōu)化實踐

binaryTree / 3207人閱讀

摘要:而渲染帶來的性能問題主要是由于數(shù)據(jù)接口請求返回以及前端資源獲取所帶來的網(wǎng)絡(luò)問題。本地化實現(xiàn)由于我們的這面是純渲染的,所以我們一個最終的詳情頁主要是由新聞數(shù)據(jù)和靜態(tài)頁面兩者構(gòu)成的。

開篇之前先介紹一下場景。信息流是一個基于用戶興趣使用算法將用戶感興趣的新聞內(nèi)容推薦給用戶的一種業(yè)務(wù)。這種業(yè)務(wù)帶有非常特色的場景就是用戶有一個“永遠”都刷不完的推薦流列表,點擊列表中的新聞之后可以跳轉(zhuǎn)到其詳情頁中查看新聞的正文內(nèi)容。列表一般都是由客戶端原生去實現(xiàn)的,而詳情頁這塊由于新聞內(nèi)容結(jié)構(gòu)的復(fù)雜性,一般還是會使用 h5 來實現(xiàn)。這樣就對我們 h5 的性能提出了要求,我們必須在用戶切換的時候?qū)⑶袚Q的白屏?xí)r間盡量減少,這樣才能提高用戶的閱讀體驗。

本文就將為大家講述一下我們是如何實現(xiàn)性能優(yōu)化達到“閃開”的效果的。我們可以先看看效果
https://v.qq.com/x/page/j0900...,下圖左邊是正常版本,而右邊的是優(yōu)化后的版本。對比之下可以發(fā)現(xiàn)即使我已經(jīng)悄咪咪的先點擊左邊的手機,同一篇新聞右邊的打開速度明顯比左邊的要快很多。接下來就讓我們看看這個是如何做到的吧!

目前現(xiàn)狀

眾所周知,網(wǎng)頁中內(nèi)容渲染往往根據(jù)渲染方式可以分為后渲染和前端渲染兩種方式,最近幾年由前端渲染又演化出了同構(gòu)渲染,也就是大家經(jīng)常說的 SSR。這幾種渲染方式的主要優(yōu)缺點大概整理了主要有如下幾個方面。

后端渲染:

優(yōu)勢:服務(wù)端直出首屏性能好,SEO好

劣勢:交互邏輯復(fù)雜需要兩端維護結(jié)構(gòu)

前端渲染:

優(yōu)勢:前端交互易維護,數(shù)據(jù)渲染分離

劣勢:首屏性能問題以及 SEO 問題

同構(gòu)渲染:

優(yōu)勢:首屏性能好,SEO 好,一份代碼多端運行

劣勢:代碼維護成本,服務(wù)器性能和維護成本增加

當(dāng)然本篇文章不是來講各種渲染方式的優(yōu)缺點的,主要是說因為種種原因我們的項目最后使用了前端 JS 渲染的方式。而 JS 渲染帶來的性能問題主要是由于數(shù)據(jù)接口請求返回以及前端 JS 資源獲取所帶來的網(wǎng)絡(luò)問題。為了解決這兩個問題,一方面我們采用了服務(wù)端將數(shù)據(jù)注入到頁面全局變量中的方式避免了數(shù)據(jù)請求,另一方面我們使用了 localStorage 緩存的方式將前端資源做了 LS 緩存避免了二次打開之后的前端資源請求,從而提高了前端渲染的首屏性能。

思考優(yōu)化方案

雖然我們避免了前端渲染的一些問題對首屏的性能做了優(yōu)化,但還遠遠不夠。那目前還有哪些點可以進行優(yōu)化呢?簡單的整理了下可以有如下兩個方面:

首次進入以及線上代碼有更新之后還是需要下載前端資源

服務(wù)端頁面的 ttfb 相應(yīng)還有優(yōu)化的空間

客戶端 WebView 打開的速度和性能還有優(yōu)化的空間

從上面兩個優(yōu)化點我們可以看到所有的優(yōu)化還是網(wǎng)絡(luò)的優(yōu)化,主要還是在移動端網(wǎng)絡(luò)對性能的影響是遠遠大于其他方面的。那么是否有什么方案能夠讓我們免去這些網(wǎng)絡(luò)請求呢,最終我們給的答案就是詳情頁本地化。通過本地化方案,我們將平均 820ms 的首屏渲染時間優(yōu)化到了 260ms,整整提高了三倍多!

詳情頁本地化就是客戶端不走網(wǎng)絡(luò)請求打開新聞的方案,解決上文中列舉的所有網(wǎng)絡(luò)請求相關(guān)的優(yōu)化點。它除了能為我們帶來首屏性能的進一步提升之外,由于它不走網(wǎng)絡(luò)請求的特性,也為我們解決了復(fù)雜網(wǎng)絡(luò)環(huán)境下頁面劫持導(dǎo)致的詳情頁白頁打不開的問題。同時還為我們帶來了無網(wǎng)絡(luò)環(huán)境下的離線閱讀新聞的能力。

本地化實現(xiàn)

由于我們的這面是純 JS 渲染的,所以我們一個最終的詳情頁主要是由新聞數(shù)據(jù)靜態(tài)頁面兩者構(gòu)成的。
鑒于對服務(wù)端的依賴非常的少,和大部分的 SPA 頁面一樣,本質(zhì)上只要在客戶端將我們的前端頁面提前下載下來就能正常打開了。

詳情頁 = 靜態(tài)頁面 + 新聞數(shù)據(jù)
數(shù)據(jù)預(yù)下發(fā)

而如何在用戶還沒有打開新聞之前客戶端就能把我們的頁面資源下載下來呢?這里就不得不提一下我們的場景,因為在我們的信息流場景中,用戶永遠是通過流點擊進入到詳情頁中。而在客戶端的流中是需要加載服務(wù)端數(shù)據(jù)的,所以在這個時候其實我們就可以告知客戶端讓其提前下載好模板。當(dāng)然大家不要忘記,除了頁面之外我們還要有新聞數(shù)據(jù),為了實現(xiàn)純離線化同時也避免新聞數(shù)據(jù)接口的請求,在列表中還會將每條新聞的詳細數(shù)據(jù)下發(fā)下去,保證必備要素的本地化。

如圖所示,在列表請求的接口中,服務(wù)端會將需要緩存的靜態(tài)頁面地址以及每條新聞對應(yīng)的新聞數(shù)據(jù)全部下發(fā)給客戶端,客戶端接收到請求之后會進行模板的下載。

客戶端行為

需要的東西下發(fā)下去之后剩下的就是客戶端進行渲染了。正常來說除了模板頁面之外,服務(wù)端還需要下載其他相關(guān)的靜態(tài)資源,然后啟動一個 HTTP 服務(wù)將頁面和資源文件進行關(guān)聯(lián),關(guān)聯(lián)之后將數(shù)據(jù)注入到頁面之后打開頁面。但這對客戶端的要求就非常多了,為了將客戶端的工作量降低,我們將所有需要使用的靜態(tài)資源通過編譯內(nèi)聯(lián)到 HTML 文件內(nèi),客戶端通過字符串拼接的形式將數(shù)據(jù)注入到頁面的全局變量中。

如圖所示所有靜態(tài)資源都被標(biāo)記了 inline 屬性,我們的編譯工具在讀取到這個屬性后會將當(dāng)前資源給內(nèi)聯(lián)到 HTML 中。同時大家注意到該模板不是以 開頭的,而是有一些截斷。這是為了給客戶端提供注入數(shù)據(jù)空間,客戶端通過模板字符串拼接的形式將新聞數(shù)據(jù)注入到全局變量中最終完成整個新聞頁面的獲取。前端代碼中則直接使用 __INJECT_DATA_FROM_CLIENT_DONT_MODIFY__ 全局變量獲取注入的數(shù)據(jù)。

頁面的更新

上面就是一套完整的本地化下發(fā)并打開的流程了,總的來講就分為四步:

前端將頁面處理成真·單頁應(yīng)用

服務(wù)端在列表時將數(shù)據(jù)和本地化模板下載地址通過接口下發(fā)給客戶端

客戶端獲取到模板下載地址后進行下載

當(dāng)用戶打開新聞的時候客戶端將數(shù)據(jù)和模板進行拼接打開即可

但是只要有資源的分發(fā)就會涉及到資源的同步更新問題,我們的本地化模板也是一樣。在我們的線上更新的時候如何讓客戶端知曉并觸發(fā)更新行為,也是我們需要去考慮的問題。實際上大家在前兩張截圖中可以看到,為了解決這個問題,我們是在服務(wù)端下發(fā)的接口中還增加了一個 version 字段,用來標(biāo)記當(dāng)前 HTML 的版本。而當(dāng)前端進行代碼發(fā)布的時候,我們的發(fā)布系統(tǒng)會有一個類似 npm 的 postpublish 的鉤子,利用這個鉤子我們告訴服務(wù)端發(fā)布成功更新版本號。最后,當(dāng)客戶端接收到新的版本號的時候則會重新下載新的模板,完成一次本地模板的更新。

跨域問題

在前端頁面中,Cookie 和 LocalStorage 等大量的特性是和域名相關(guān)的,而不巧的是我們的頁面中都有使用,所以跨域也是我們需要考慮到的問題。我們知道,本質(zhì)上此種方案下客戶端相當(dāng)于使用 WebView 打開了一個本地頁面,而在 Android 系統(tǒng)中 WebView 打開本地頁面的話有三種方法:

loadUrl:本質(zhì)上使用 file:///temp.html 的形式打開一個本地文件 URL

loadData:和 loadUrl 類型,好的地方在于不需要寫成文件,可以直接加載頁面字符串,不過此時加載完之后頁面的 URL 是 about:blank

loadDataWithBaseURL:和 loadData 類似,好的地方在于提供了參數(shù)能夠設(shè)置當(dāng)前 URL 地址

從描述中可以看到,很明顯最后一種 loadDataWithBaseURL 才是我們需要的。客戶端通過這個方法加載,設(shè)置當(dāng)前頁面的 URL 為真實線上 URL,對于前端來說基本上就和線上環(huán)境無異了,本地化和線上 Cookie 和 LocalStorage 的共享都沒有問題。不過這里需要注意,第一個參數(shù) baseUrl 僅能管住當(dāng)前頁面,如果頁面做了 history.pushState() 等前進后退操作的話當(dāng)前頁面地址又會變成 about:blank,此時需要再設(shè)置最后一個參數(shù) historyUrl 才行。

后記

本文給大家講述了實現(xiàn)本地化離線閱讀的方案。除了以上列舉的問題,我們還碰到了一些細微的問題。例如我們發(fā)現(xiàn)在網(wǎng)絡(luò)不好的情況下客戶端可能會下載模板失敗緩存了不完整的代碼,所以我們增加了模板的 md5 值一并下發(fā)給客戶端用來校驗?zāi)0迨欠裣螺d完全。又如上文說了模板的更新,實際上內(nèi)容也會有更新,特別是一些新聞的實時性會有比較高的要求,為了解決這個問題,我們會在頁面打開后再次去檢查一下文章的狀態(tài),如果發(fā)生變量會切換至線上版本用來規(guī)避這個問題。除了這些之外我們還做了完備的云控后退方案,能在方案出問題的時候完美回退到普通版本。

其實大家可以看到,本地化只是我們在特定場景下決絕性能問題的一種特定思路。它并不是使用于所有的場景,所以我在文章開頭也特別強調(diào)了一下我們的應(yīng)用場景方便大家去理解。但是我們只要理解這種方案的精髓,我相信在其它的一些特定場合總能發(fā)揮它的威力。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/106126.html

相關(guān)文章

  • GMTC 2019 參會回顧

    摘要:回顧上一次參加還是年。年的還是真正的,年的會議早已經(jīng)把英文全稱去掉,改稱全球大前端技術(shù)大會。同時與產(chǎn)品協(xié)作從產(chǎn)品設(shè)計方面突出關(guān)注點,做產(chǎn)品設(shè)計方面的優(yōu)化,如站新版改造減少頁面元素,將播放器窗口直接顯示在第一屏。 回顧 上一次參加 GMTC 還是 2017 年。那時的我還是剛剛參加工作并在試用期辭職的菜鳥。 2017 年的 GMTC 還是真正的 Global Mobile Tech Co...

    Zack 評論0 收藏0
  • 關(guān)于PHP加解密的懶漢入門篇(API安全加強篇一)

    摘要:由于密鑰被暴露了,所以必須換新的密鑰,元首這會兒只能走途徑告訴古德里安新的密鑰,這會兒逗逼的事情來了,如何對密鑰進行加密。但是,有一點是值得說明,那就是無論是對稱加密還是非對稱加密,都頂不住用機器是強行暴力猜解私鑰。 懶漢 入門 這兩點就足以說明這篇文章不想要著有什么高端大氣的技術(shù)內(nèi)容,我跟你講,全是水。不可能有什么質(zhì)數(shù)素數(shù)、橢圓曲線加密、迪菲-赫爾曼什么的,不可能有的。 首先我不...

    waterc 評論0 收藏0
  • 數(shù)據(jù)可視化實踐

    摘要:但如果數(shù)據(jù)可視化做的較弱,反而會帶來負面效果錯誤的表達往往會損害數(shù)據(jù)的傳播,完全曲解和誤導(dǎo)用戶,所以更需要我們多維的展現(xiàn)數(shù)據(jù),就不僅僅是單一層面,目前有多種第三方庫來實現(xiàn)數(shù)據(jù)的可視化等。數(shù)據(jù)可視化的具體實現(xiàn)這里基于兩種實現(xiàn)方式,一種一種。 數(shù)據(jù)可視化的目的其實就是直觀地展現(xiàn)數(shù)據(jù),例如讓花費數(shù)小時甚至更久才能歸納的數(shù)據(jù)量,轉(zhuǎn)化成一眼就能讀懂的指標(biāo);通過加減乘除、各類公式權(quán)衡計算得到的兩組...

    PrototypeZ 評論0 收藏0
  • 【讀書筆記】《高性能JavaScript》

    摘要:性能訪問字面量和局部變量的速度是最快的,訪問數(shù)組和對象成員相對較慢變量標(biāo)識符解析過程搜索執(zhí)行環(huán)境的作用域鏈,查找同名標(biāo)識符。建議將全局變量存儲到局部變量,加快讀寫速度。優(yōu)化建議將常用的跨作用域變量存儲到局部變量,然后直接訪問局部變量。 缺陷 這本書是2010年出版的,這本書談性能是有時效性的,現(xiàn)在馬上就2018年了,這幾年前端發(fā)展的速度是飛快的,書里面還有一些內(nèi)容考慮IE6、7、8的東...

    chengjianhua 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<