久久亚洲精品成人_国产精品欧美综合亚洲_亚洲va天堂va欧美ⅴa在线_91色视频在线观看_久久影院亚洲_一级黄色片播放_日韩av在线一区_精品一区二区在线看_老头吃奶性行交视频_日韩免费高清视频_天天操天天爽天天干_日本欧美在线视频

首頁 > 開發 > HTML5 > 正文

HTML5頁面無縫閃開的問題及解決方案

2024-09-05 07:23:33
字體:
來源:轉載
供稿:網友

在傳統的 web 優化中,我們可以采取壓縮、拆包、動態加載等方法減少首屏資源大小,也能通過離線包、頁面直出等方案加速 html 返回,之前一篇h5 秒開大全有部分簡析。在大部分場景中,這些方案都足夠用,也能得到出色的效果。但仍有兩種無法盡善盡美的地方:其一是短暫的白屏現象不可避免,其二是對于超大型 web 應用難以做到秒開。結合客戶端特性,我們有沒有辦法,進一步做到極致,打開 web 頁面和打開客戶端頁面無差異的體驗呢?

傳統方案的困境

無論是 html 離線,還是直出,以及讓 webview 啟動和網絡請求并行 ,頁面的切換和打開都無法避免 html 加載這一過程。對于大型應用而言,龐大的 js 初始化解析和執行會耗費巨大的時間。

 

新的思考方向?

速度優化的本質是以空間換時間。我們是否可以從這個思路,將打開 webview 及解析 html 這以過程省略掉呢?答案是可以的。

容器化方案

容器化 即是我們最終探索與實踐的出來的一套方案。正常 web 頁面關閉后,webview 組件即會銷毀掉,下一次再打開需要重新啟動。通常讓 webview 保持常駐的做法可以節省 webview 啟動時間, 但簡單的常駐 webview 并不能做到頁面秒開,頁面打開仍然需要重新解析 html。

對于我們的應用特征而言,頁面切換實際上是僅僅內容數據的變化,比如切換一篇文檔,其 html 容器及樣式都是同一套,而差異僅僅只是在數據上,重新載入 html 及初始化 js 這部分耗時完全可以避免掉。讓 webview 組件及其容器內的 html 頁面常駐,在文檔切換的過程,僅僅對數據進行替換,這即是容器化方案。容器化方案省去了 webview 重復啟動和渲染 html 的問題,打開文檔,耗時只在做數據替換,真正做到了秒開。

容器切換

web 側如何感知到不同的頁面在進行互切換,數據如何做到替換呢?

首先在 app 打開的時候,文檔列表會進行數據預拉取,同時觸發客戶端預啟動容器,除此外,其他任意場景也能按需觸發容器啟動(后面會聊到)。容器內會提前進行 html 渲染和 js 執行,此時的數據是空的。用戶點擊文檔,客戶端會對打開 url 這一行為進行監聽,同時解析 url,取出唯一標識符, 判斷本地是否已經存在并且符合要求的數據,如果條件命中,直接使用已經打開的容器切出,通知到容器內的 web,web 收到通知,通過 url 取出標識符,從本地進行數據獲取,然后對數據進行替換渲染,從而完成頁面切換。

容器化數據替換

直接容器替換的思路省去了代碼加載和解析時間,但對于前端代碼而言,需要支持直接替換數據。大部分前端項目代碼設計都是 自執行調用 方式,支持容器化的前提是:需要對代碼改造成可支持 數據組裝和銷毀 。

// 大部分應用加載頁面初始化的場景class App {    public init() {     initA();     initB();        // 初始化各種模塊        ...    }} const app = new App();app.init();

自執行調用后,大量的內部依賴模塊也依次進行初始化,然后數據常駐在內存中,通常對于加載一個正常網頁而言,用戶每次都是新開頁面,加載 html, 重新進行解析和初始化,并不會帶來什么問題。但是按照容器化思路,頁面不會重新載入,只進行數據替代,對于大型應用而言意味著成千上萬的模塊需要支持內存釋放和數據切換,一旦沒有處理好,會面臨嚴重的內存泄露和代碼健壯性問題。如何組織和管理這些代碼,支持可插拔式,讓整個頁面初始化流程都能鏈式組裝,可以進行配置,是進行容器化代碼改造的難點。

  • 依賴倒置

依賴倒置原則的是指內部模塊不應該依賴外部模塊,底層模塊不應該依賴上層模塊。

哪些才是底層模塊,哪些才是上層模塊呢?通常而言,越穩定不變邏輯,應該是越底層,越接近用戶交互,容易變化的部分是上層。具體層級劃分需要分析應用的結構和依賴關系,良好劃分層級的應用是容器化改造的前提。

  • 職責鏈模式

職責鏈模式是指每個對象都有接受請求的可能,這些對象連接成一條鏈,請求沿著這條鏈的傳遞,直到有對象處理,這樣做的好處是減少接受者和發送者直接的耦合。比如在一個頁面加載生命周期中,我們可以讓內部模塊到外部模塊都實現相應的生命周期職責,應用啟動和銷毀的過程,請求沿著指定鏈條從外到內傳遞,也可以按需指定跳躍某個模塊,這樣大大降低了模塊之間的耦合,從而更好的管理代碼。

export default interface IRestart{    emitter: EventEmitter;    startDestroy(): void;    destroy(): void;    restart(): void;    restartEnd(): void;    // ...}
class Page {    next: PageFlow|null;    cache: {        start: (() => Promise<any>)[];        end: (() => Promise<any>)[];    };    waitStart(callback: () => Promise<any>) {        this.cache.start.push(callback);    };    waitEnd(callback: () => Promise<any>) {        this.cache.end.push(callback);    };    setNext(flow: PageFlow) {        this.next = flow;        return flow;    }     // ...   }
  • 依賴注入

所謂依賴注入是當指 A 對象依賴另一個 B 對象時,不直接在 A 對象內初始化 B,而是通過外部環境進行初始化,作為參數傳入 A 對象中。這樣做的好處是當 B 模塊的初始化等條件發生變化時,不必在 A 對象中進行重復的修改。管理成百上千個這樣模塊相互依賴的代碼中,統一的依賴注入管理器會讓依賴關系管理變得更方便。

// 模塊加載器class ServiceLoader {    source: CONFIG;    loaded: boolean;    // 是否已加載    initialized: boolean;   // 是否已初始    module: any;    constructor(source: CONFIG) {        this.loaded = false;        this.initialized = false;        // ...    }    async load(params?: any): Promise<any> {     // ..load module        return this.module;    }    //...}
// 模塊管理器class ServiceCollection {    stack: ServiceLoader[];    private services = new Map<CONFIG, ServiceLoader>();    constructor() {        this.stack = [];    }    createLoader(config: CONFIG): ServiceLoader {        const loader: ServiceLoader =  new ServiceLoader(config);        this.services.set(config, loader);        return loader;    }    // ...}
initA () {    const ALoader= this.serviceCollection.createLoader(CONFIG.A);    const discussMobile = ALoader.init(this.app);}

數據預拉服務

容器是否會命中依賴兩個條件,其一對應離線包代碼是否下載好;其二對應版本的數據是否已經預拉緩存完畢。

用戶進入文檔管理首頁,首先會去拉取列表索引數據,然后通過列表數據 id 進行文檔內容數據做預拉,儲存在本地數據庫,本地數據庫的存儲可以參考前端離線化探索。

webview service

在整個數據預拉的過程,我們是通過一套獨立的客戶端后臺 webview 服務執行具體任務,獨立服務的好處是讓各種容器化基礎服務和文檔管理列表本身進行解耦,同時將拉取、解析、儲存數據這一對性能有消耗的過程放后臺服務,減少了列表用戶交互界面層的性能壓力。

另一方面,作為多端公用的一個服務,構建流程上單獨部署,更新代碼的時候能夠不依賴其他頁面,變得更靈活。

數據快照

對于純 dom 結構的文檔型品類,我們會在打開文檔,解析數據后,把生成的 html 緩存在本地數據庫一張快照表里。下一次切換容器時,在取本地數據去解析的同時,會判斷對應 id 在快照表是否存在緩存,如果有,直接取出來,覆蓋在 html 上,用戶可以提前看到上一次渲染的數據,等本地數據真正解析完,再展示可交互界面。解析數據準備渲染也是需要一個上百毫秒的過程,這一策略可以讓用戶提前看到內容。

預創建

有了極致的打開速度,如何優化新建速度呢。正常的新建流程是這樣的,用戶點擊新建按鈕,前端請求創建 cgi, 等待后臺創建成功返回新文檔 url,前端再新開 webview,加載展示頁面。我們可以看,由于需要等待創建接口返回的原因,到新建的過程比正常打開一個文檔還要更久。

怎么樣才能讓新建也做到秒開呢?思路和數據預拉取一樣,在用戶進入文檔首頁的同時,我們會提前預請求一批創建 id,然后緩存到本地,同時根據創建 id 生成一篇空白文檔數據,儲存在本地,標示狀態為未使用。用戶點擊新建按鈕,本質上是從本地取一個未使用的文檔 url,直接用容器切換打開,然后再和后臺進行同步。

秒開效果

容器化方案前:

容器化方案后:

 

監控與開關系統

容器方案使用了數據預取場景,命中率的監控非常重要。由于切換頁面的過程,如果命中容器,我們會接受來自客戶端的通知,在這個時機,我們可以進行上報。

另外一個非常重要的是容器能力的開關系統,在發布之初保持現網穩定性是非常重要的措施,但任何程序都不能保證沒有 bug,我們通過內部七彩石配置系統控制這套容器方案的各種特性在不同品類下是否啟用,同時這套配置也支持灰度和回滾方案,能夠應急各種突發問題。

灰度期容器間命中率

 

待優化的問題

容器化方案用各種預創建 webview 的方式換取了打開速度,app 內存占用上會比未使用容器化方案要大非常多,webview 的釋放時機、預加載數據的策略優化,及從客戶端到 web 端,如何更好的做內存管理是接下來需要進一步優化的點。

總結

到此這篇關于HTML5頁面無縫閃開方案的文章就介紹到這了,更多相關HTML5頁面無縫閃開內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
欧美寡妇偷汉性猛交| 欧美一级大片视频| xxxx黄色片| 久久国产福利国产秒拍| **欧美日韩vr在线| 国产精品第6页| 亚洲国产精品久久91精品| 久久久久xxxx| 中日韩av电影| 一区二区日本| 国产中文字幕精品| 亚洲国产精品久久久久久女王| 极品美女销魂一区二区三区 | 日韩一区二区电影网| 九九热免费在线| 亚洲欧美日韩国产精品| 一区二区三区福利视频| 欧美精品丝袜久久久中文字幕| 无码人妻久久一区二区三区蜜桃| 欧美精品在欧美一区二区少妇| 欧美极品欧美精品欧美图片| 国产精品传媒入口麻豆| 国产欧美日韩综合一区在线观看 | 亚洲色图视频免费播放| 91在线精品播放| 亚洲性在线观看| 国产精品美女主播在线观看纯欲| 中文在线观看av| 国产精品久久999| 欧美性受xxxx狂喷水| 91久久大香伊蕉在人线| 国产盗摄女厕一区二区三区| 欧美日韩精品久久久免费观看| 亚洲精品一区二区三区四区| 人禽交欧美网站免费| 亚洲欧洲国产日韩| 中国男女全黄大片| 有码中文亚洲精品| 国产99视频在线| 97视频热人人精品| 国产成人aaa| 亚洲理论电影在线观看| 亚洲另类在线制服丝袜| 99中文字幕在线| 亚洲国产欧美自拍| 在线观看免费高清视频| 国产高清在线一区二区| 亚洲欧美综合色| 成年人免费在线播放| 精品视频一区三区九区| 成年人av电影| 性欧美亚洲xxxx乳在线观看| av一区二区久久| 亚洲一级片免费观看| 精品在线观看国产| 亚洲天堂中文在线| 91高跟黑色丝袜呻吟在线观看| 国产精品1024| 国产性生交xxxxx免费| 91精品国产综合久久小美女| 一区二区三区麻豆| 一区二区三区观看| 欧美一级xxx| 中文字幕乱码人妻无码久久| 3d动漫精品啪啪一区二区竹菊| 日韩av黄色片| 欧美有码在线视频| proumb性欧美在线观看| 免费看日本黄色片| 精品在线视频一区二区三区| 午夜精品久久久| 成人午夜淫片100集| 亚洲精品第一区二区三区| 亚洲女子a中天字幕| 欧美人妻一区二区三区| 97成人超碰免| 国产精品综合av一区二区国产馆| 亚洲色图欧美另类| 2019亚洲男人天堂| 亚洲桃色在线一区| 国偷自拍第113页| 婷婷五月色综合| 亚洲欧美另类在线| 日本成人午夜影院| 国产精品视频大全| 91高清视频免费看| 午夜av免费在线观看| 欧美xxxx日本和非洲| 国产精品第一第二| 91国产丝袜在线播放| 亚洲男人天堂久久| 无码人妻精品一区二区三区99v| 欧美日韩精品三区| 免费视频久久久| 黑鬼大战白妞高潮喷白浆| 欧美日本黄视频| 国产欧美一区二区精品性| 五月天免费网站| 欧美激情国产日韩| 亚洲欧洲在线看| 蜜桃av中文字幕| 秘密基地免费观看完整版中文| 俄罗斯精品一区二区三区| 欧美日韩精品是欧美日韩精品| 男女性色大片免费观看一区二区| 久久久久久香蕉| 91成人在线播放| 亚洲国产aⅴ成人精品无吗| 久久综合九色| 免费观看一区二区三区毛片| 无码aⅴ精品一区二区三区浪潮| 亚洲成人黄色在线观看| 国产suv精品一区二区三区| 美国黑人一级大黄| 色涩成人影视在线播放| 欧洲一区二区视频| 91精品国产品国语在线不卡| 本田岬高潮一区二区三区| 欧美超碰在线观看| 亚洲高清av一区二区三区| 亚洲曰本av电影| 亚洲二区在线观看| 韩日欧美一区二区三区| 在线观看日韩中文字幕| 小明看看成人免费视频| 九九久久99| 色伦专区97中文字幕| 亚洲精品伦理在线| 国产一区在线看| 麻豆亚洲av熟女国产一区二| 精品人妻在线视频| 国产美女主播在线| 国产综合 伊人色| 97在线观看免费| 亚洲精品日韩在线| 欧美日韩亚洲精品内裤| 成人av在线电影| 成人久久久精品国产乱码一区二区| 欧美丰满艳妇bbwbbw| 熟妇高潮一区二区| 五月婷婷之婷婷| 一级黄色录像免费看| 成人黄色av网站| 一本色道久久88综合亚洲精品ⅰ | 欧美亚洲日本在线观看| 欧美日本韩国国产| 美日韩精品视频免费看| 不卡电影一区二区三区| 国产精品老熟女视频一区二区| jizz国产免费| 日本一区二区不卡在线| 国产aaaaaaaaa| 久久久久久久人妻无码中文字幕爆| 97在线国产视频| 91精品久久久久久| 久久视频这里只有精品| 亚洲高清久久久久久| 欧美精品久久99久久在免费线 | 亚洲一级片免费看| ,亚洲人成毛片在线播放| 五月婷婷婷婷婷| 精品国产一区在线| 国产亚洲色婷婷久久| 日韩一级免费看| 日韩一级片网站| 欧美一区午夜视频在线观看| 91精品国产福利| 亚洲综合激情网| 亚洲特黄一级片| 国产精品污网站| 久久亚洲精品小早川怜子| 久久亚洲二区三区| 国产福利一区在线观看| 六月丁香婷婷色狠狠久久| 7777久久亚洲中文字幕| 国产精品久久久久久人| 99精品人妻国产毛片| 99热这里只有精品3| 在线观看xxx| 日韩精品在线一区二区三区| 天天操天天干视频| 好吊视频在线观看| 亚洲第一网站在线观看| 天天综合网在线| 国产乱码精品一区二区三区忘忧草| 成人免费视频网站在线观看| 久草手机在线观看| 亚洲黄色a级片| 蜜桃传媒麻豆第一区在线观看| 国产精品人成在线观看免费| 精品一区免费av| 亚洲免费看黄网站| 精品日韩欧美在线| 最新日韩中文字幕| 亚州成人av在线| 91入口在线观看| 超碰在线97免费| 三级视频在线观看| 久久国产精品区| 国产精品福利一区二区| 91久久精品一区二区三区| 欧美精品一区二区三区很污很色的 | 在线亚洲美日韩| 野战少妇38p| 五月婷婷开心网| 美日韩精品视频| 日本一区二区视频在线观看| 婷婷激情综合网| 欧美日韩aaaa| 欧美少妇一级片| 在线观看日本中文字幕| 中文字幕人妻一区二区在线视频| 丁香天五香天堂综合| 亚洲影院免费观看| 久久久之久亚州精品露出| 米仓穗香在线观看| 欧美激情 一区| 欧美 中文字幕| 亚洲精品视频一区二区| 亚洲国产天堂久久综合| 好吊色欧美一区二区三区视频 | 日韩亚洲欧美中文高清在线| 国产在线视频不卡| 91丝袜在线观看| 麻豆精品一二三| 在线视频国内一区二区| 欧美交受高潮1| gogogo免费高清日本写真| a视频免费观看| 蜜桃视频一区二区三区在线观看| 在线视频国内一区二区| 97视频免费在线观看| 免费看国产一级片| 婷婷色中文字幕| 国产精品美女www爽爽爽| 裸体女人亚洲精品一区| 给我免费播放片在线观看| 麻豆精品一区二区三区视频| 极品少妇xxxx精品少妇| 在线视频欧美区| 日韩.欧美.亚洲| 国产午夜精品无码一区二区| 国产91综合一区在线观看| 555夜色666亚洲国产免| 99久久精品免费看国产四区| 免费看的黄色大片| 午夜精品久久久久久久99| 欧美日韩中文字幕一区二区| 亚洲一区二区三区四区视频| 色18美女社区| 国产ts变态重口人妖hd| 欧美成人bangbros| 青娱乐国产91| 日本特黄一级片| 久久精品视频一区二区| 中文字幕亚洲欧美一区二区三区 | 日韩免费视频一区二区| 免费日韩在线观看| 国产丰满果冻videossex| 亚洲va国产va欧美va观看| 成人免费视频网址| av在线免费观看不卡| 99久久久无码国产精品| 久久免费视频在线观看| 国产成年人视频网站| 国产成人av一区二区三区在线观看| 精品欧美黑人一区二区三区| 国自产拍偷拍精品啪啪一区二区| 亚洲熟妇av乱码在线观看| 精品欧美一区二区三区| 国产69精品久久久久9999apgf| 九九久久免费视频| 黄色精品一区二区| 久久国产精品 国产精品| 极品盗摄国产盗摄合集| 91麻豆精品久久久久蜜臀| 黄色高清视频网站| 亚洲欧美另类一区| 亚洲男人天堂网| 国产一级不卡毛片| 国产一区二区三区黄视频| 一区二区三区视频观看| 欧美又黄又嫩大片a级| 国产福利电影一区二区三区| 国产精品欧美日韩| 久久久久久久九九九九| 日韩欧亚中文在线| 精品免费视频123区| 成人免费视频国产免费麻豆| 国产一区二区三区在线看 | 欧美日韩国产精品一区二区三区四区 | 欧美国产欧美亚州国产日韩mv天天看完整| 午夜精品99久久免费| 天天干天天操天天拍| 色综合中文字幕| 免费人成自慰网站| 久久66热re国产| 国产精品视频免费观看| 亚洲一区二区影视| 色婷婷综合久久久久| 91亚洲一线产区二线产区| 一区二区三区视频在线看| 国产毛片久久久久久国产毛片| 东方aⅴ免费观看久久av| 久久99国产精品| 美女视频一区在线观看| **亚洲第一综合导航网站| 亚洲国产欧美一区二区三区不卡| 免费在线看成人av| 黑人巨大精品欧美一区二区小视频| 日韩国产高清在线| 精品久久久三级| a亚洲天堂av| 成年在线观看视频| 国产精品麻豆99久久久久久| 日韩五码在线观看| 午夜精品视频在线观看| 久久人妻少妇嫩草av蜜桃| 日韩一区二区三| 青青青在线免费观看| 久久综合伊人77777蜜臀| 啪啪小视频网站| 国产精品免费一区二区三区都可以| 日韩在线视频免费| 欧美日韩免费观看一区| 国产三级欧美三级日产三级99| 18岁视频在线观看| 69久久99精品久久久久婷婷| 久久久久久久久久一区二区三区| 久久久在线观看| 日韩成人一区二区三区在线观看| 麻豆成人av| 国产精品久久久久精k8| 三级性生活视频| 精品无码久久久久久国产| 中文字幕一区二区三区四区欧美| 成人黄色大片在线免费观看| 不卡的av在线| 午夜一级免费视频| 亚洲视频国产视频| 久久午夜电影| 91精品久久久久久久久不口人| 日本三级免费看| 久久久不卡网国产精品一区| 久久人人九九| 国内精品在线播放| 日韩在线国产| 日韩电影在线免费看| 国产精品大全| 奇米一区二区三区| 色一情一区二区三区四区| 青青草97国产精品免费观看无弹窗版| 欧美一级视频免费在线观看| 九九九在线视频| 亚洲精品电影网站| 国产精品23p| 亚洲一区二区三区在线视频| 色综合久久综合网欧美综合网| 成人免费看片98欧美| 91九色国产社区在线观看| 成人美女视频在线看| 粉嫩av懂色av蜜臀av分享| 欧美精品videos另类日本| 日本伊人色综合网| www.色.com| 欧美精品一区二区三区蜜桃 | 国产精品免费久久久久影院| 人妻夜夜爽天天爽| 国产在线观看不卡| 美女性感视频久久| 亚洲国产午夜伦理片大全在线观看网站 | 精品无人区乱码1区2区3区在线| 国产精品无码在线| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 999精品在线视频| 在线观看日韩高清av| 欧美人与禽zoz0善交| 一区二区三区动漫| 人妻视频一区二区三区| 欧美成人免费在线| 一区二区三区不卡在线观看| 亚洲国产综合视频| 久久久久久亚洲精品中文字幕| 污视频软件在线观看| 怡红院av亚洲一区二区三区h| 91精品国产全国免费观看 | 色偷偷噜噜噜亚洲男人| 精品国产黄色片| 四虎一区二区| 欧美日韩国产一级| 欧美一区二区三区网站| 亚洲一区3d动漫同人无遮挡 | 久久久久久美女| 麻豆精品久久精品色综合| 成人一区二区免费视频| 亚洲第一在线视频| 色呦呦中文字幕| 91好吊色国产欧美日韩在线| 亚洲缚视频在线观看| 久久超级碰视频| 亚洲性生活网站| 亚洲另类激情图| 秋霞午夜av一区二区三区| 免费无码毛片一区二三区| 亚洲国产精品久久久久秋霞蜜臀| 精品国产av鲁一鲁一区 | 亚洲国产欧美在线| 久久久久亚洲av无码专区体验| 亚洲字幕在线观看| 亚洲欧美成人一区二区三区|