成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

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

binaryTree / 3199人閱讀

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

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

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

目前現(xiàn)狀

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

后端渲染:

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

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

前端渲染:

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

劣勢(shì):首屏性能問(wèn)題以及 SEO 問(wèn)題

同構(gòu)渲染:

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

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

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

思考優(yōu)化方案

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

首次進(jìn)入以及線(xiàn)上代碼有更新之后還是需要下載前端資源

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

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

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

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

本地化實(shí)現(xiàn)

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

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

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

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

客戶(hù)端行為

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

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

頁(yè)面的更新

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

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

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

客戶(hù)端獲取到模板下載地址后進(jìn)行下載

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

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

跨域問(wèn)題

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

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

loadData:和 loadUrl 類(lèi)型,好的地方在于不需要寫(xiě)成文件,可以直接加載頁(yè)面字符串,不過(guò)此時(shí)加載完之后頁(yè)面的 URL 是 about:blank

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

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

后記

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106126.html

相關(guān)文章

  • GMTC 2019 參會(huì)回顧

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

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

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

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

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

    PrototypeZ 評(píng)論0 收藏0
  • 【讀書(shū)筆記】《高性能JavaScript》

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

    chengjianhua 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<