iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么解决HTML5页面无缝闪开的问题
  • 358
分享到

怎么解决HTML5页面无缝闪开的问题

2023-06-09 10:06:24 358人浏览 安东尼
摘要

这篇文章主要介绍怎么解决HTML5页面无缝闪开的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!传统方案的困境无论是 html 离线,还是直出,以及让 WEBview 启动和网络请求并行 ,页面的切换和打开都无法避

这篇文章主要介绍怎么解决HTML5页面无缝闪开的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

传统方案的困境

无论是 html 离线,还是直出,以及让 WEBview 启动和网络请求并行 ,页面的切换和打开都无法避免 html 加载这一过程。对于大型应用而言,庞大的 js 初始化解析和执行会耗费巨大的时间。

怎么解决HTML5页面无缝闪开的问题 

新的思考方向?

速度优化的本质是以空间换时间。我们是否可以从这个思路,将打开 webview 及解析 html 这以过程省略掉呢?答案是可以的。

怎么解决HTML5页面无缝闪开的问题

容器化方案

容器 即是我们最终探索与实践的出来的一套方案。正常 web 页面关闭后,webview 组件即会销毁掉,下一次再打开需要重新启动。通常让 webview 保持常驻的做法可以节省 webview 启动时间, 但简单的常驻 webview 并不能做到页面秒开,页面打开仍然需要重新解析 html。

对于我们的应用特征而言,页面切换实际上是仅仅内容数据的变化,比如切换一篇文档,其 html 容器及样式都是同一套,而差异仅仅只是在数据上,重新载入 html 及初始化 js 这部分耗时完全可以避免掉。让 webview 组件及其容器内的 html 页面常驻,在文档切换的过程,仅仅对数据进行替换,这即是容器化方案。容器化方案省去了 webview 重复启动和渲染 html 的问题,打开文档,耗时只在做数据替换,真正做到了秒开。

怎么解决HTML5页面无缝闪开的问题

容器切换

web 侧如何感知到不同的页面在进行互切换,数据如何做到替换呢?

首先在 app 打开的时候,文档列表会进行数据预拉取,同时触发客户端预启动容器,除此外,其他任意场景也能按需触发容器启动(后面会聊到)。容器内会提前进行 html 渲染和 js 执行,此时的数据是空的。用户点击文档,客户端会对打开 url 这一行为进行监听,同时解析 url,取出唯一标识符, 判断本地是否已经存在并且符合要求的数据,如果条件命中,直接使用已经打开的容器切出,通知到容器内的 web,web 收到通知,通过 url 取出标识符,从本地进行数据获取,然后对数据进行替换渲染,从而完成页面切换。

怎么解决HTML5页面无缝闪开的问题

容器化数据替换

直接容器替换的思路省去了代码加载和解析时间,但对于前端代码而言,需要支持直接替换数据。大部分前端项目代码设计都是 自执行调用 方式,支持容器化的前提是:需要对代码改造成可支持 数据组装和销毁

// 大部分应用加载页面初始化的场景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 服务执行具体任务,独立服务的好处是让各种容器化基础服务和文档管理列表本身进行解耦,同时将拉取、解析、储存数据这一对性能有消耗的过程放后台服务,减少了列表用户交互界面层的性能压力。

另一方面,作为多端公用的一个服务,构建流程上单独部署,更新代码的时候能够不依赖其他页面,变得更灵活。

怎么解决HTML5页面无缝闪开的问题

数据快照

对于纯 dom 结构的文档型品类,我们会在打开文档,解析数据后,把生成的 html 缓存在本地数据库一张快照表里。下一次切换容器时,在取本地数据去解析的同时,会判断对应 id 在快照表是否存在缓存,如果有,直接取出来,覆盖在 html 上,用户可以提前看到上一次渲染的数据,等本地数据真正解析完,再展示可交互界面。解析数据准备渲染也是需要一个上百毫秒的过程,这一策略可以让用户提前看到内容。

预创建

有了极致的打开速度,如何优化新建速度呢。正常的新建流程是这样的,用户点击新建按钮,前端请求创建 cgi, 等待后台创建成功返回新文档 url,前端再新开 webview,加载展示页面。我们可以看,由于需要等待创建接口返回的原因,到新建的过程比正常打开一个文档还要更久。

怎么样才能让新建也做到秒开呢?思路和数据预拉取一样,在用户进入文档首页的同时,我们会提前预请求一批创建 id,然后缓存到本地,同时根据创建 id 生成一篇空白文档数据,储存在本地,标示状态为未使用。用户点击新建按钮,本质上是从本地取一个未使用的文档 url,直接用容器切换打开,然后再和后台进行同步。

秒开效果

容器化方案前:

怎么解决HTML5页面无缝闪开的问题

容器化方案后:

怎么解决HTML5页面无缝闪开的问题 

监控与开关系统

容器方案使用了数据预取场景,命中率的监控非常重要。由于切换页面的过程,如果命中容器,我们会接受来自客户端的通知,在这个时机,我们可以进行上报。

另外一个非常重要的是容器能力的开关系统,在发布之初保持现网稳定性是非常重要的措施,但任何程序都不能保证没有 bug,我们通过内部七彩石配置系统控制这套容器方案的各种特性在不同品类下是否启用,同时这套配置也支持灰度和回滚方案,能够应急各种突发问题。

灰度期容器间命中率

怎么解决HTML5页面无缝闪开的问题 

待优化的问题

容器化方案用各种预创建 webview 的方式换取了打开速度,app 内存占用上会比未使用容器化方案要大非常多,webview 的释放时机、预加载数据的策略优化,及从客户端到 web 端,如何更好的做内存管理是接下来需要进一步优化的点。

以上是“怎么解决HTML5页面无缝闪开的问题”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 怎么解决HTML5页面无缝闪开的问题

本文链接: https://www.lsjlt.com/news/255711.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么解决HTML5页面无缝闪开的问题
    这篇文章主要介绍怎么解决HTML5页面无缝闪开的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!传统方案的困境无论是 html 离线,还是直出,以及让 webview 启动和网络请求并行 ,页面的切换和打开都无法避...
    99+
    2023-06-09
  • 如何解决vue页面加载闪烁的问题
    这篇文章主要介绍了如何解决vue页面加载闪烁的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。v-if 和 v-show 的区别v-if只...
    99+
    2024-04-02
  • 如何解决小程序页面闪烁问题
    解决小程序页面闪烁问题的方法:主要由于运行内存不够,微信对小程序图片渲染过大进行拦截,引起的小程序页面闪烁问题。优化办法:对大图片进行压缩,如果是网页路径可附加参数x-oss-process=image/auto-orient,1/resi...
    99+
    2024-04-02
  • 单页面Vue页面刷新出现闪烁问题及解决
    目录分析原因: 为什么刷新会出现闪烁的问题解决方法: 使用 v-cloak 用法关于Vue刷新页面问题如何解决 provide / inject 组合分析原因: 为什么刷新...
    99+
    2024-04-02
  • 怎么解决在win8无法打开网页的问题
    这篇文章主要介绍了怎么解决在win8无法打开网页的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。win8无法打开网页的原因分析:有可能是winsock协议配置的问题,会直...
    99+
    2023-06-28
  • html5中怎么解决外链嵌入页面通信问题
    这篇文章给大家分享的是有关html5中怎么解决外链嵌入页面通信问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用postMessage推送和window.addEventListener接收原理:发送方使用p...
    99+
    2023-06-09
  • 如何解决HTML5页面在iPhoneX适配问题
    这篇文章将为大家详细讲解有关如何解决HTML5页面在iPhoneX适配问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.  iPhoneX的介绍 ...
    99+
    2024-04-02
  • SpringMvc返回modelandview的页面无法跳转问题怎么解决
    这篇文章主要介绍了SpringMvc返回modelandview的页面无法跳转问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringMvc返回modelandview的页面无法跳转问题怎么解决文...
    99+
    2023-06-30
  • win10闪退问题怎么解决
    这篇文章主要介绍“win10闪退问题怎么解决”,在日常操作中,相信很多人在win10闪退问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win10闪退问题怎么解决”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-01
  • 如何解决HTML5手机端页面缩放的问题
    小编给大家分享一下如何解决HTML5手机端页面缩放的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通常在写HTML5手机端页...
    99+
    2024-04-02
  • jupyter闪退怎么办?jupyter闪退问题的解决
    目录问题描述问题解决第一种:命令行启动第二种:修改jupyter notbook快捷方式的目标内容为什么闪退呢第三种:修复jupyter-notebook-script.py文件具体...
    99+
    2023-01-04
    jupyter闪退问题 jupyter闪退 jupyter闪退解决
  • win10开机桌面无限刷新闪屏怎么解决
    如果Windows 10开机后出现无限刷新闪屏的问题,可以尝试以下解决方法:1. 进入安全模式:按下电源按钮启动电脑,当Window...
    99+
    2023-09-11
    win10
  • 如何解决HTML5中图片之间缝隙的问题
    这篇文章给大家分享的是有关如何解决HTML5中图片之间缝隙的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在做h6的项目,碰到了一个百思不得其解的问题,几个img标签中间有大...
    99+
    2024-04-02
  • vue解决刷新页面时会出现变量闪烁的问题
    目录刷新页面时会出现变量闪烁问题解决办法是: v-cloakvue刷新当前页面,且页面不闪烁场景:刷新当前页的方法provide/inject 组合介绍provide/inject ...
    99+
    2024-04-02
  • mybatis无参数分页问题怎么解决
    当使用MyBatis进行无参数分页查询时,可以通过在SQL查询语句中使用LIMIT关键字来实现分页。具体步骤如下:1. 在Mappe...
    99+
    2023-08-09
    mybatis
  • win10无法打开设置界面且闪退怎么解决
    Win10无法打开设置界面且闪退可能是由于系统文件损坏或设置应用程序的问题引起的。以下是一些可能的解决方法:1. 运行系统文件检查器...
    99+
    2023-08-08
    win10
  • 怎么解决php web页面的乱码问题
    随着互联网的普及,越来越多的网站采用PHP语言来构建其网站开发,PHP已经成为了众多网站开发者的热门选择。但是在PHP的开发过程中,经常会出现一种令人头疼的问题:乱码。特别是在Web页面中,乱码问题更是常见。下面本文将结合实际案例,为大家讲...
    99+
    2023-05-14
  • C#控件的闪烁问题怎么解决
    这篇文章主要讲解了“C#控件的闪烁问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#控件的闪烁问题怎么解决”吧!最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体...
    99+
    2023-06-17
  • 如何解决移动端Html5页面中1px边框的问题
    这篇文章将为大家详细讲解有关如何解决移动端Html5页面中1px边框的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题提出这是一个比较老的问题了,我第一次注意到的时候,是UI设计师来找我麻烦,emm...
    99+
    2023-06-09
  • HTML5页面点击按钮显示闪烁或黑色背景怎么解决
    本篇内容介绍了“HTML5页面点击按钮显示闪烁或黑色背景怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作