精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Web 端如何低成本打造 Native 體驗?

開發 開發工具
Web 應用在實際體驗上和 Native 應用仍然存在非常明顯的差距,那么如何低成本地把一個現有的網站改造成類 Native 的體驗呢?本文分享一種讓網站低成本漸進式實現 Native 化體驗的方式——同屏渲染。

 Web 應用在實際體驗上和 Native 應用仍然存在非常明顯的差距,那么如何低成本地把一個現有的網站改造成類 Native 的體驗呢?本文分享一種讓網站低成本漸進式實現 Native 化體驗的方式——同屏渲染。

Web 端體驗

在有了 PWA(Progressive web apps) 之后,Web Application 也具備了添加到桌面和離線訪問等能力,但是實際體驗上卻總是和 Native 應用存在非常明顯的差距。

我們可以看一下 Alibaba 的 M 站和 iOS 應用的錄屏(左邊為 WEB,右邊為 iOS APP):

??

??

 

我們可以看到,對于 Web Applicaiton 來說,在頁面中來回跳轉時訪問的總是割裂的,從上一個頁面到下一個頁面需要等 loading ,返回時很多內存狀態又都不在了,導致無法正確定位回之前的列表位置(這一點其實和不同的瀏覽器以及列表本身的實現方式有關,也有一些方案可以規避這個問題,在這里只是其中一個 case)。

這樣對于用戶的體驗傷害非常明顯,他能明確感覺到自己在用的并非一個 Application 而是一個 Website,而且在進行復雜的操作時整個鏈路也非常容易被中斷。

而其實這種體驗差異的根源,在于 B/S(Browser/Server)和 C/S(Client/Server)的差異。ServiceWorker 雖然提供了一些方案(例如 App Shell)讓我們較低成本的增強原有的體驗,但仍然難以解決頁面之間的割裂問題,很多相同的代碼在不同頁面間重復執行,每一次訪問內存狀態就會丟失。

渲染性能

當我們在說體驗的時候會顯得有點主觀,性能相比之下就容易衡量的多,而頁面割裂帶來的最為直觀的體驗差距其實就來自于渲染性能的差異。

在 Web 端一個典型的 CSR(Client Side Rendering)要經過的流程大致如下:

??

??

 

這其中有很多不符合我們預期的地方:

  • HTML/JS 都等到點擊后才開始加載(這點可以通過預加載的手段解決,其中 HTML 的預加載可以通過 ServiceWorker 進行)。
  • framework 等 JS 在不同頁面間總是重復執行的。
  • 加載 API 的時機非常晚,而加載 API 一般是耗時很長而且可以并行的部分,理論上加載時機越早越好。

所以理想中的渲染流程應該是下圖這樣:

??

??

 

其實對于 Native 應用也是如此,用戶點擊時基本就會開始加載 API 并且執行下個頁面的邏輯。其實一個優化的比較好(做了 preload 等)的 SPA 也是類似的效果,我們提前加載好下個頁面的 vendor ,點擊時直接只執行下個頁面的邏輯即可。

然而實際上對于一個較大的現存站點來說(例如 m.alibaba.com ),把整個網站作為一個 SPA 來維護是不太現實的,一方面不能適應當前多人協作的現狀,另外一方面穩定性上也不能接受修改一個頁面整個網站都要發布的方案。

那么,如何低成本的把一個現有的網站改造成類 Native 的體驗呢?

同屏渲染

在有了上面的思考后,我們就在想,有沒有一個方案在不做改造的前提下,在用戶點擊后,立即開始數據的并行加載,同時把下個頁面動態的加載進來,選擇性的保留上個頁面的一些內容(例如正在加載中的數據, jsonp , framework 層的對象等)而隔絕其他部分的干擾。

于是針對我們的場景產出了一個同屏渲染的方案:LightHub,所謂同屏渲染,即渲染過程中頁面不需要被卸載,所有的渲染行為都在一個上下文中發生。

??

??

 

這里我們需要幾個東西:

  • 能直接附著到現有頁面上的沙箱,用于把頁面還原到初始狀態(同時允許保留部分共享的部分)
  • 過渡動畫
  • API 并行加載
  • 按照瀏覽器行為渲染 HTML
  • 按照瀏覽器行為觸發事件

??

??

 

沙箱

我們需要一個低成本把頁面還原會初始狀態、并且允許保留部分對象的沙箱機制,而且最好這個機制是可以直接低成本部署到現有頁面上的。其實這里的訴求和微前端碰到的問題類似,我們受 qiankun 的沙箱機制啟發,只需要在頁面的 中插入一小段內聯 JS 記錄:

  • window 上的全局變量
  • window/document 的 eventListener
  • 定時器:setInterval/setTimeout/requestAnimationFrame/requestIdleCallback
  • MutationObserver

在我們需要時我們只需要清空頁面的 DOM,還原變化的全局變量(這里和 qiankun 一樣采用的淺拷貝),eventListener,定時器和 MutationObserver,就能把頁面還原到初始狀態。

同時,記錄的狀態也能封存到一個對象中,當用戶從下個頁面 back 到上個頁面時,我們可以直接把狀態還原到頁面上。

這里就需要在清空頁面狀態時選擇性的保留一些需要保留的對象:例如公共的 Framework,JSONP 請求的標簽等。

過渡動畫

這一點其實就沒有多復雜了,在頁面不需要被卸載和重新加載后,我們可以在用戶點擊后立即展示一個動畫。目前采用的只是一個簡單的從右側 slide-in 的動畫。

需要注意的是,由于在繪制動畫的過程中我們往往正在執行下個頁面的邏輯,我們需要注意使用 GPU 來繪制動畫,從而確保動畫不會被 JS 執行阻塞。這一點對于低端機尤為關鍵。

API 并行加載

其實在有了上面的沙箱機制后,API 的并行加載就不是難事了,需要注意的是我們需要保護 API 并行加載本身的過程中產生的狀態(例如 setTimeout ),我們需要實現一個 runInSharedContext 確保這其中的定時器不會在頁面切換時被卸載。

runInSharedContext(() => { 
// 這里的 setTimeout 不能是被記錄 & 清除的 setTimeout
setTimeout(() => window.sharedfetchDataPromise = fetch(res));
});

而在下個頁面消費的只需要 window.sharedfetchDataPromise || fetch(url) 就能直接復用并行加載的 API 請求。

在我們的場景下為了讓這個問題更加開發者無感,封裝了一個叫做 redfox 的工具庫,在同一個頁面環境執行多次相同配置的請求會自動復用,不需要開發者手動判斷。

按照瀏覽器行為渲染 HTML

這可能是其中最復雜的部分了,在我們抓到下個頁面的 HTML 后,不能只是簡單的document.innerHTML = nextHTML ,這樣會導致和普通的瀏覽器行為完全不一致,樣式加載會導致閃屏,腳本的執行順序不符合預期等等。

??

??

 

所以我們需要自己實現一個 renderHTML ,將抓到的 HTML 解析后模擬瀏覽器的行為進行渲染。

  • 播放動畫
  • 先通過樣式隱藏 body
  • 異步將 CSS append 到頁面,等到 head 中的 CSS 加載完成并且動畫播放完成后取消 body 的隱藏
  • 把 JS 按照類型和順序 append 到頁面
  • inline & 正常的阻塞后續 DOM 和 js 的 append
  • defer 丟到 defer 隊列中
  • async 異步執行,不阻塞后續
  • 按次序執行 defer 隊列

這個部分的行為比較復雜,需要在較多的場景進行測試,以及有相應的單元測試保障邏輯的正確性。

??

??

 

按瀏覽器行為觸發事件

其實和上面渲染 HTML 相似,在渲染的過程中需要按照瀏覽器的行為觸發相應的事件。

例如上個頁面卸載時依次觸發 beforeunload => pagehide => unload ,在下個頁面加載時先把 readyState 重置,然后按照次序觸發 domInteractive defer 的執行和 DOMContentLoaded。

同樣的,單元測試在這個環節是必須的。

分析

Timeline 分析

從 Chrome 最后的 Timeline 看執行邏輯基本是符合我們預期的,點擊后的瞬間 API 開始加載并且基本上就開始全力執行下個頁面的渲染邏輯。

Framework 層的代碼基本也不需要再重復執行。

??

??

 

內存壓力

對于這種不卸載頁面的方案來說最容易引起擔憂的可能就是內存泄露問題,其實按照上面的沙箱機制,只要我們確保 DOM、全局變量、定時器、時間監聽等能夠被正確清除,與之相關的閉包等就不會賴在內存中不走。

從我們本地多次頻繁點擊切換頁面的反應看,內存隨著頁面的切換返回也會一次次回到初始狀態,從理論上不存在直接導致內存泄露的缺陷。

??

??

 

然而,由于我們允許在頁面間保留一部分的公共區域(上面稱之為 Service Layer),另外沙箱本身是一個約定沙箱而非安全沙箱(例如往 Element.prototype.xxx 屬性寫東西就無法被攔截),對于一些不規范的寫法仍然存在內存泄露的風險。

這一點可能需要和 Native 端類似的內存壓力監控等方式來長期觀察。

分階段打點

由于整個 HTML 渲染過程都是我們自己實現的,所以整個渲染的各個階段可以自己打點記錄一些時間,下面就是一個例子:API 從 JS 請求到拿到耗時 124ms ,而實際上整個取數據(提前并行取的)花了 350ms 。每一個 script 開始執行和執行耗時也可以通過這種方式打上來。

??

??

 

這也可以為我們的頁面優化提供一些指導,例如 JS 的執行時間是不是過晚,某段 JS 的執行時間是不是過長。

效果

最終的對比效果如下,左為同屏渲染,右為正常跳轉,從線上的數據看性能提升大約從 2.8s => 1.8s 。

??

??

 

除了異步渲染的頁面外,我們針對一些原先是 SSR 的頁面也做了非常低成本的接入(不需要改造頁面,但是享受到的受益相對也更有限)。

??

??

 

但僅僅是上面這種跳轉體驗和返回體驗的改善,就讓我們的 Just For U 模塊的曝光屏數有穩定 3% 的增長。

總結

總結一下:

  • 類似 SPA 體驗的客戶端渲染可以讓 Web 的體驗更接近 Native。
  • 同屏渲染是一種讓網站低成本漸進式實現 Native 化體驗的方式。
  • 更加沉浸的體驗確實會讓用戶有意愿進行更多地瀏覽。

局限

上面的方案仍然存在一些局限性,例如前面提到的需要開發者防范內存泄露的問題,同時因為 History API 的限制,頁面必須是同域的,否則跳轉的 URL 無法滿足預期。

未來

關注 Chrome 動態的同學也會了解到 Chrome 最近也退出了一個新的提案:Portal API,就是旨在解決我們上面提到的 Web 體驗割裂的問題。

能夠提供一個類似 iframe 的沙箱,以較低的成本實現頁面間的跳轉過渡等。在未來 Protal 普及后(至少 Chrome 發布, Safari 跟進后),我們就可以在新版本的瀏覽器中拋棄現在使用 JS 實現的沙箱機制,使用更加安全(且炫酷)的 Portal API 來實現同屏渲染。

在 Protal API 的支持下,我們也可以克服無法跨域的問題,按照目前的草案,Portal 是支持跨域跳轉的。

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2013-09-25 17:31:08

Storwize V5虛擬化存儲

2020-06-18 09:40:13

智慧城市數據存儲基礎架構

2013-11-28 09:21:19

2023-02-21 10:32:56

ChatGPT人工智能

2024-09-11 17:33:56

2009-03-19 10:00:06

2023-12-07 12:38:09

架構低成本開發

2011-08-06 23:03:01

京瓷復合一體機

2010-06-22 16:04:53

2024-08-21 13:22:17

邊緣計算云平臺

2011-04-11 14:56:04

2025-02-26 08:02:40

2011-11-28 13:53:03

2021-12-21 23:21:16

DDOS防御安全

2024-10-25 10:00:00

云服務計算

2012-10-18 19:25:21

佳能

2009-05-25 10:18:20

2009-07-06 14:03:01

高性能Web應用緩存

2012-02-13 09:03:04

Web

2022-06-30 11:03:27

DDoS攻擊WAF
點贊
收藏

51CTO技術棧公眾號

国模精品一区二区三区| zzijzzij亚洲日本成熟少妇| 精品一卡二卡三卡| 永久免费av在线| 国产mv日韩mv欧美| 91av在线播放| 国产麻豆视频在线观看| 人人精品视频| 这里只有精品视频在线观看| 欧美日韩精品在线一区二区| 日本中文字幕在线看| 99久久99久久综合| 成人在线中文字幕| 日韩在线视频不卡| 欧美精品aa| 在线午夜精品自拍| 亚洲天堂2024| 亚洲天堂网站| 日本韩国欧美在线| 日本人体一区二区| a级片国产精品自在拍在线播放| 久久在线观看免费| 国产精品久久久久久久久久直播 | 亚洲欧洲日本一区二区三区| 日韩一区二区在线视频| 在线免费观看麻豆| 国产欧美自拍一区| 日韩欧美成人一区| 日本精品一区在线| 日本欧美在线| 在线免费亚洲电影| 少妇人妻在线视频| 黑人精品视频| 樱桃视频在线观看一区| 一本一道久久久a久久久精品91| 欧美色图另类| 91一区二区三区在线观看| 波多野结衣久草一区| 国产精品一二三四五区| 美国欧美日韩国产在线播放| 国产精品第2页| 久久久黄色大片| 国产精品视频| 97在线视频一区| 国产精品99无码一区二区| 夜间精品视频| 成人97在线观看视频| 五月婷婷六月香| 欧美日韩激情在线一区二区三区| 亚洲欧美日韩国产精品| 免费成人深夜夜行p站| 国产一级成人av| 91精品婷婷国产综合久久竹菊| 911福利视频| 久久爱.com| 欧美精品欧美精品系列| 91视频这里只有精品| 欧美性生活一级| 欧美高清视频www夜色资源网| 国产色视频在线播放| 亚洲精品tv| 日韩一区二区三区在线| 国产裸体视频网站| 日本精品一区二区三区在线观看视频| 日韩精品一区二区三区视频在线观看 | 黄色激情在线播放| 欧美午夜影院在线视频| 国产三级三级三级看三级| 成人精品高清在线视频| 欧美日韩mp4| 中文字幕人妻无码系列第三区| 亚洲五码在线| 亚洲精品99久久久久| 国产特级黄色录像| 91影院成人| 欧美黄色成人网| 日韩欧美成人一区二区三区| 久久综合影音| 国产精品一区二区三区毛片淫片| 国产aⅴ爽av久久久久成人| 国产传媒久久文化传媒| 久久久久久国产精品mv| www黄在线观看| 亚洲精品videosex极品| 人妻av中文系列| 国产成人77亚洲精品www| 日韩一区二区三免费高清| 理论片大全免费理伦片| 精品美女在线视频| 欧美成人激情在线| 91玉足脚交嫩脚丫在线播放| 久久精品国产精品亚洲精品| 成人在线免费网站| 久久精品国产亚洲a∨麻豆| 18欧美亚洲精品| 男人用嘴添女人下身免费视频| 国产精品久久乐| 日韩av在线免费播放| 天堂а√在线中文在线鲁大师| 一区二区亚洲| 国产精品天天狠天天看| 欧美综合视频在线| 中文字幕亚洲视频| 中文字幕无码精品亚洲35| 日韩一区二区三免费高清在线观看| 欧美本精品男人aⅴ天堂| 一级肉体全黄裸片| 亚洲国产日本| 成人免费看片视频| 可以直接在线观看的av| 亚洲夂夂婷婷色拍ww47| 三上悠亚av一区二区三区| 全球av集中精品导航福利| 久久九九免费视频| 69av视频在线观看| 波多野结衣精品在线| 小说区视频区图片区| 在线黄色的网站| 精品美女一区二区| 国产黄在线免费观看| 轻轻草成人在线| 久久综合九色综合久99| 欧洲在线视频| 欧美一区二区三区电影| 少妇愉情理伦三级| 久久亚洲欧洲| 免费一区二区三区| 日韩激情电影| 亚洲国产99精品国自产| 国产av 一区二区三区| 美国三级日本三级久久99| 日韩aⅴ视频一区二区三区| 九九精品调教| 日韩欧美中文字幕公布| 糖心vlog免费在线观看| 美女在线视频一区| 亚洲一区二区三区免费观看| 视频在线日韩| 在线播放国产一区中文字幕剧情欧美| 国产三级精品三级在线观看| 91色在线porny| 国产免费黄视频| 麻豆一区二区麻豆免费观看| 午夜精品福利视频| 污污视频在线免费看| 午夜国产精品影院在线观看| 久久久久亚洲无码| 国产精品一页| 日韩久久久久久久久久久久久| 最新日韩三级| 中文国产亚洲喷潮| 92久久精品一区二区| 亚洲欧洲成人自拍| 中国老熟女重囗味hdxx| 亚洲激情网址| 精品国产一区二区三区麻豆免费观看完整版| 丁香花在线电影| 亚洲国产精品高清久久久| 中文字幕激情小说| 欧美激情中文字幕| 日韩av加勒比| 激情综合自拍| 欧美日韩国产高清视频| 电影天堂国产精品| 中文国产亚洲喷潮| 午夜精品久久久久久久爽| 亚洲国产精品视频| www.久久av| 狠狠网亚洲精品| 国产美女作爱全过程免费视频| 欧美18免费视频| 国产精品第2页| 伊人影院蕉久影院在线播放| 亚洲精品一区二区三区香蕉| 一级片免费在线播放| 亚洲日本乱码在线观看| 你懂的在线观看网站| 日韩精品免费视频人成| 亚洲小说欧美另类激情| 日韩福利视频一区| 成人xvideos免费视频| 午夜av在线播放| 国产视频一区在线| 国产裸体永久免费无遮挡| 亚洲成人精品在线观看| 农村老熟妇乱子伦视频| 国产98色在线|日韩| 久草资源站在线观看| 国产精品毛片久久| 欧美久久在线| 亚洲第一二区| 国产精品激情av电影在线观看| 中文字幕在线播放网址| 亚洲少妇激情视频| 亚洲av无码一区二区三区dv| 色婷婷综合久色| 欧美精品一区二区成人| 久久久久久久久伊人| 91精产国品一二三| 奇米精品一区二区三区四区| 国产美女永久无遮挡| 成人精品亚洲| 激情视频在线观看一区二区三区| 欧美日韩伦理一区二区| 欧美亚洲第一页| av在线麻豆| 国产一区二区三区在线观看视频 | 国产亚洲综合久久| 五十路在线观看| 日韩欧美综合在线| 国产精品爽爽久久久久久| 日韩欧美中文免费| 伊人国产在线观看| 亚洲男帅同性gay1069| 精品人妻中文无码av在线| av在线不卡观看免费观看| 99九九精品视频| 日本欧美一区二区三区| 国产主播在线看| 亚洲国产三级| 欧美这里只有精品| 这里只有精品在线| 在线观看欧美亚洲| 成人情趣视频网站| 欧洲亚洲一区二区三区四区五区| 噜噜噜天天躁狠狠躁夜夜精品| 亚洲自拍偷拍色片视频| 涩涩涩久久久成人精品| 国产精品日韩av| 电影久久久久久| 国产成人精品国内自产拍免费看| 中文字幕成在线观看| 91高潮在线观看| 蜜桃在线视频| 欧美一级片久久久久久久| 成人观看网址| 欧美激情极品视频| 久草在线新免费首页资源站| 久久6精品影院| 欧美v亚洲v| 国模精品系列视频| 俺来俺也去www色在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 18+激情视频在线| 久久99国产综合精品女同| 中文字幕在线播放网址| 欧美激情国产日韩精品一区18| 后进极品白嫩翘臀在线播放| 午夜精品久久久久久99热| 华人av在线| 国产精品高清在线| 男人天堂久久| 91成人伦理在线电影| 91精品国产自产在线丝袜啪| 国产伦精品一区二区三区在线 | 大西瓜av在线| 99精品国产99久久久久久福利| 国产精品333| 久久午夜视频| 天天干天天色天天干| 国产一区二区三区免费播放| 中文字幕在线观看91| 91一区二区在线| 日本黄色小视频在线观看| 国产精品初高中害羞小美女文 | 欧美性猛交xxxx免费看漫画| 国产免费一区二区三区四区五区| 欧美综合欧美视频| 国产免费高清av| 亚洲大胆人体在线| 二区在线视频| 美女撒尿一区二区三区| 九色porny视频在线观看| 国产精品久久久久久久久久小说 | 国产一区二区视频在线| 国产麻豆剧传媒精品国产| 2020国产精品自拍| 青青操在线视频观看| 亚洲成人www| 中文字幕一区二区在线视频| 欧美电影精品一区二区| 日本在线视频1区| 久久视频这里只有精品| 综合日韩av| 成人做爽爽免费视频| 日韩av三区| 黄色污污在线观看| 欧美亚洲一区| 青娱乐国产精品视频| xfplay精品久久| 久久r这里只有精品| 色呦呦国产精品| 亚洲精品成人区在线观看| 一本色道久久综合狠狠躁篇的优点| av免费网站在线观看| 国产va免费精品高清在线观看| 精品99re| 台湾成人av| 国产精品一国产精品k频道56| 精品人妻一区二区三| 国产视频911| 国产午夜福利精品| 欧美电影一区二区| 经典三级在线| 91精品国产沙发| 日韩在线观看中文字幕| 亚洲国产精品www| 99在线精品视频在线观看| 中文字幕第六页| 国产精品久久久久久久久晋中 | 日本午夜精品视频在线观看| 日本50路肥熟bbw| 亚洲人吸女人奶水| 中国精品一区二区| 亚洲美女精品成人在线视频| 草美女在线观看| 69堂成人精品视频免费| 久久久9色精品国产一区二区三区| 欧美丰满熟妇xxxxx| 99国产一区二区三精品乱码| 久久久久亚洲av成人片| 欧美一区二区三区四区在线观看| 自拍视频在线播放| 国产成人亚洲综合91精品| 色综合久久中文| 天堂…中文在线最新版在线| 成人午夜电影小说| 国产激情久久久| 日韩欧美中文字幕一区二区三区| 亚洲国产一区二区在线| 久久久噜噜噜| 久久精品国产亚洲av麻豆| 精品久久久久久电影| 人成网站在线观看| 久久久最新网址| 国产精品nxnn| 国产精品专区在线| 波多野结衣中文字幕一区| 国产成人无码精品| 日韩www在线| 国产精品迅雷| 日韩精品大片| 美国三级日本三级久久99| 污污视频网站在线免费观看| 欧美日韩中文字幕精品| 99视频在线观看地址| 国产噜噜噜噜噜久久久久久久久| 欧洲杯足球赛直播| 免费一区二区三区在线观看| 亚洲欧洲性图库| 性生活黄色大片| 久久久久久久91| 日韩欧美黄色| 黄色高清无遮挡| 久久久精品tv| 中文字幕乱码人妻无码久久| 精品国产一区二区三区四区在线观看| 成人激情久久| 国产精品va在线观看无码| 99久久精品99国产精品| 亚洲黄网在线观看| 色偷偷噜噜噜亚洲男人| av在线精品| 五十路熟女丰满大屁股| 国产色产综合色产在线视频| 中文字幕人妻一区二区三区视频 | 日韩欧美中文字幕制服| а√在线中文在线新版| 欧美一区二区三区精美影视| 久久精品国产77777蜜臀| 九九免费精品视频| 亚洲女成人图区| 精品国产鲁一鲁****| 成人性免费视频| 欧美国产日本韩| 国产成人久久精品77777综合 | 中日韩免费视频中文字幕| 国产三级伦理片| 欧美性做爰毛片| 国产精品福利在线观看播放| 亚洲精品久久一区二区三区777| 日韩欧美国产网站| av网站网址在线观看| 欧美成人免费在线| 国产乱人伦偷精品视频免下载 | 欧美a级片免费看| 精品国产123| 成人自拍视频网| 国产一区二区三区小说| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲免费一级片| 国产精品视频1区| 99热这里只有精品8| 美女视频久久久| 国产一区二区三区在线看| 成人动态视频| 午夜一区二区视频| 色婷婷av一区| 狂野欧美性猛交xxxxx视频| 日日夜夜精品网站|