iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >前端工程化之H5性能优化篇
  • 715
分享到

前端工程化之H5性能优化篇

前端工程化之H5性能优化篇 2017-09-19 23:09:51 715人浏览 无得
摘要

前端工程化之H5性能优化篇

  导读:从粗糙到精致,从简单到复杂,全球互联网WEB App(网页应用)平均体积已增压到1.6Mb,随着音视频等富媒体内容的流量池膨胀,终端设备上的用户对网页装载速度尤其敏感。页面不能做到秒开,就会有大量用户选择离开。重视并改善网站性能,优化即时网页装载时间,加速即时网页在浏览器平台终端状态展现,进而可以带来网站流量增长。

  本文源自百度直播研发部,提出了前端渐进增强的页面渲染方案,即“路由分离+预静态化+WebView预创建”方案,来替代模板同步渲染方案,并采用工程化的方式将能力打包下沉赋能产品线。

  一、背景

  在直播业务落地的场景中,构建打赏服务精神,创造风格多样,令人难忘的运营活动形式,以满足目标用户需求。进行有效的服务创新,保障H5服务品质,控制访问性能,及时化解金主情绪为商业价值,制造特效惊喜,流畅的用户体验,有利于赢得用户对平台的尊重,提升平台品牌气质:

  1. 优化访问体验:优化H5首屏性能,围绕提升用户服务感受和提升开发者工作效率进行创新,探索Web追赶原生的体验创新;

  2. 加速需求闭环:解决H5页面路由与数据接口耦合的问题,实现H5服务自治,释放业务对Web产品形态的旺盛需求;

  3. 基础设施建设:使用工程化手段沉淀公共通用的前端基础设施,让前端组织更敏捷的支持跨业务的人力调配,技术赋能更多产品线;

  围绕以用户为中心的功能完善的体验,以客户为中心的商业价值的转化。提升H5服务品质,发挥现代浏览器潜能,赋能传统Web新的解决方案。

  历史架构的原因,H5页面的加载过程是Server向Smarty模板注入JSON_encode后的接口主数据,响应给浏览器带有页面完全jsON数据的页面,然后在浏览器端执行javascript,最终Paint给用户,流程如下图:

  △H5优化前的加载与渲染流程

  △H5首屏关键路径耗时拆解

  两个影响H5首屏内容(FCP,First Contentful Paint,首次内容绘制)的关键路径为:

  1. 网络耗时:依赖Server端数据查询及模板编译,当数据查询慢时延迟了首字节到达(TTFB,Time To First Byte,首字节时间)。

  2. 内核渲染耗时:依赖JavaScript执行读取页面主数据并生成完全的DOM结构。

  因此,我们针对性地设计并实施了“路由分离+预静态化+WebView预创建”的方案,改进后的页面加载与渲染流程如下图:

  △H5优化后的加载与渲染流程

  二、路由分离

  路由分离之前H5页面的URL由Server分配,前端负责编写TPL模板产物,TPL与最终URL的对应关系在Server通过配置文件做映射,日益暴露出启动开发慢,页面后期维护交接沟通成本高的问题。 所以我们希望页面路由规范化,让前端开发者自主控制页面入口格式,让后端开发者更专注于api接口数据逻辑。因此,我们设计了前端路由分离方案,约定了页面URL与页面源代码目录映射关系,规则如下图:

  △预定式URL路由规范

  Nginx直接响应预静态化的html文件,首字节到达不依赖数据查询与模版编译。

  三、预静态化

  前端路由分离直接在NGINX代理层返回HTML文件,但没有页面完全渲染需要的数据,在执行ajax请求没有返回之前,需要规避页面一直处于白屏或全局loading状态,提前FCP的时间。 我们采用了预静态化页面的方案。预静态化不像服务器渲染那样即时编译产出完全静态化的 HTML,它只在构建时为了特定的路由生成特定的几个静态页面,我们可以通过 webpack插件将一些特定页面在编译时就注入DOM结构,这样做有几个好处:第一缩短页面白屏时间,第二相对于服务器端渲染节省云基础设施资源成本,第三输出给搜索引擎爬取页面通用内容。 结合实际应用场景和市面上主流的预静态化方式,最终我们开发了基于ReactDomServer原生的服务端渲染能力的webpack插件,提升预静态化性能和效率。 通过webpack插件系统获取每次构建的compilation上下文,通过html-webpack-plugin的before AssetTagGeneration hook获取当前页面bundle,afterTemplateExecution hook获取当前页面编译后的模板HTML,通过eval执行bundle导出的整个页面APP模块,通过ReactDomServer对单页应用的每个路由产出APP HTML与模板HTML合并后落盘为预静态化的HTML。

  H5预静态化调用序列如下:

  △H5预静态化调用序列

  页面入口export APP:

  module.exports = (locals) => Promise.resolve(locals.preRender({id: containerId, main: App}));

  复制

  基于node.js环境,创建JSDOM实例提供浏览器宿主环境,使用ReactDOMServer将组件渲染为静态HTML标记。使用自研的预静态化webpack插件替换html-webpack-plugin,并不增加新的编译阶段。 Webpack插件与市面上主流的预静态化方法做个对比,如基于无头浏览器的、基于本地启动Http Server、通用的静态站点生成工具等。结果如下:

  react-snapprerender-spa-pluginreact-snapshotprepsnapshotify@baidu/html-webpack-pre-render-plugin

  Statesupportedsupportedunsupportedunsupportedexperimentalsupported

  DOM implementationpuppeteerphantomjs-prebuiltjsdomnightmarepuppeteerjsdom+implement

  Load perfORMance optimisation+---+-

  Zero-configuration+-+-++

  Redux+-+--+

  Async components+---+-

  Webpack code splitting++--+-

  CSSStyleSheet.insertRule+---++implement

  blob urls+?---+implement

  All browser features+--?++implement

  Speedslowslowfastslowslowfast(real time)

  结果如下:

  综合对比,我们的预静态化速度最优,可在开发阶段实时看到预静态化结果,所见即所得,方便研发调试,不需要增加新的编译阶段。

  遵循尽可能让页面骨架内容显示最终内容的原则,产出预静态化的HTML文件,对于展示用户个性化内容的动态组件,仍需要等待一个AJAX请求的时间,这部分组件在执行AJAX请求没有返回之前,我们采用了组件级别的Skeleton方案,以保证首屏使用通用内容+动态组件骨架填充:

  1. 静态组件开发时定义公共部分state,填充页面公共部分内容,代码示例:

  this.state = { // 预静态化环境的标记(编译阶段预静态化插件注入) isPreRender: window.isPreRender, // 页面公共内容 rights: [ // 权益 { dataIndex: "cameraAction", icon: require("../../../../assets/cashVideoActivity/ricon_1.png"), button: require("../../../../assets/cashVideoActivity/do_shoot.png"), text: 亿万奖金,

  全网最高!, action: {} // 通过 dataIndex 在接口数据里获取 }, { dataIndex: "renzhengAction", icon: require("../../../../assets/cashVideoActivity/ricon_2.png"), button: require("../../../../assets/cashVideoActivity/do_auth.png"), text: 加V认证,

  十倍收益!, action: {} } ] };

  复制

  2. 动态组件根据window.isPrerender标记做预静态化环境与浏览器渲染环境两种环境下的响应,代码示例:

  // 组件骨架可使用 http://danilowoz.com/create-content-loader/ 在线生成import ContentLoader from "react-content-loader";const GrowthCardLoader = props => ( );// 组件环境响应核心逻辑{ window.isPreRender ? ( ): ( <正式组件 ... )}

  复制

  △动态组件在两种环境下的响应流程 经过预静态化后的页面首屏内容(FCP)不依赖JS执行完毕,通过一次首次渲染(FP,First Paint,首次绘制)即可向用户展示出页面公共内容,待AJAX返回后替换成完全渲染的页面。

  四、WebView预创建

  在APP启动时立即初始化好WebView组成的缓存池,保证加载每个URL时省去了WebView初始化的时间,并利用上预静态化的HTML缓存,最终使页面无白屏加载态。

  五、整体收益

  △优化效果可感知对比(左新右旧)

  渲染流程改进前后对比:

  △渲染流程改进前后对比

  直接收益:

  △H5性能优化直接收益

  预静态化收益:

  1. 发布前端通用高性能预静态化插件;2. 提供了工程化引入骨架屏(Skeleton)的方式。

  路由分离收益:

  1. 约定式的页面URL路径,减小维护成本,减少前后端沟通成本;2. BrowserRouter支持,针对SPA(Single Page Application)页面场景,支持了基于history API的BrowserRouter访问方式;3. 删除模版配置管理步骤,对于后端同学可以更加专注于数据逻辑。

  六、工程化

  前端组织从小作坊发展到了大前端时代,前端工程开发模式受到了新的挑战如模块化、组件化、规范化、自动化等。

  前端工程本质上是软件工程的一种。软件工程化关注的是性能、稳定性、可用性、可维护性等方面,注重基本的开发效率、运行效率的同时,思考维护效率。采用工程化的思想管理前端工程范畴的各环节,转化挑战为机遇,创建支持多团队协作的开发流,建立坚实的工业前端基础设施。

  七、总结

  Web H5性能优化不再是只追求一两个页面装载速度指标的提升,更考验一个前端团队的综合能力:

  1. 顶层设计能力在设计时提前布局,寻找痛点一击即中,并根据实际情况不断维护、进行调整、优化、保证规范有效性;

  2. 工程管理能力用更有效的工作方法和手段使全局实践最优,节约成本并提升研发效率;

  3. 文化创新能力持续学习是最好的创新办法,始终保持着与时俱进的基本价值观,每一次契机都可能会促成一次成功的创新,创造独特价值。

  北海房价走势 http://house.bh.Goufang.com/lpfangjia/

  Web生态技术日新月异,性能是日趋规范化的领域,如PWA/快应用/小程序,标准化是彻底解决频发问题、改善工作质量的好办法。

您可能感兴趣的文档:

--结束END--

本文标题: 前端工程化之H5性能优化篇

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么优化前端性能
    这篇文章主要讲解了“怎么优化前端性能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么优化前端性能”吧!一 引发性能问题原因引发性能问题的原因通常不是单方面...
    99+
    2024-04-02
  • Android性能优化典范之多线程篇
    多线程在Android性能优化中起到非常重要的作用。通过合理地使用多线程,可以提高应用程序的响应速度,加快数据处理和计算速度,提升用...
    99+
    2023-09-20
    Android
  • web前端性能优化总结
    本篇内容介绍了“web前端性能优化总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.原则多使用内存,缓...
    99+
    2024-04-02
  • Android 勇闯高阶性能优化之启动优化篇
    目录🔥 背景🔥 启动内部机制💥 冷启动🌀 创建 Application🌀 创建Activity ...
    99+
    2024-04-02
  • Androd 勇闯高阶性能优化之布局优化篇
    目录🔥 布局层级管理💥 绘制(Measurement)💥 摆放(Positioning)💥 背景设置产生的过度绘制&#...
    99+
    2024-04-02
  • Android性能优化及性能优化工具
    目录1.Allaction Tracking(1)追踪(2)分类我们的内存分配(3)查看统计图2.LeakCanary(1)配置(2)制造一个单例内存泄漏的点(3)LeakCanar...
    99+
    2024-04-02
  • Android性能优化系列篇UI优化
    目录前言一、UI优化1.1 系统做的优化1.1.1 硬件加速1.2 优化方案1.2.1 java代码布局1.2.2 View重用1.2.3 异步创建view1.2.4 xml布局优化...
    99+
    2022-11-13
    Android性能UI优化 Android UI优化
  • 如何理解前端性能优化CRP
    这篇文章主要介绍“如何理解前端性能优化CRP”,在日常操作中,相信很多人在如何理解前端性能优化CRP问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解前端性能优化CRP”...
    99+
    2024-04-02
  • 如何进行Web前端性能优化
    这篇文章给大家介绍如何进行Web前端性能优化 ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Yahoo! 的 Exceptional Performance team 在 Web 前端方面作出了卓越的贡献。广为人知的优...
    99+
    2023-06-08
  • 前端性能优化的示例分析
    这篇文章给大家分享的是有关前端性能优化的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。反复看下以下三个问题。有木有不同的人问过你:什么是前端性能优化?有木有不同的面试官问...
    99+
    2024-04-02
  • 性能优化进阶篇:ASP 优化大揭秘
    使用 OutputCache 属性对整个页面或部分页面进行缓存。 启用浏览器缓存,使用 HTTP 头(如 Expires、Cache-Control)控制缓存时长。 考虑使用 Response.Buffer 节省网络带宽。 数据库优化...
    99+
    2024-04-02
  • 如何利用Webpack来优化前端性能
    本篇内容主要讲解“如何利用Webpack来优化前端性能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用Webpack来优化前端性能”吧!一、背景随着前端的...
    99+
    2024-04-02
  • JavaScript 浏览器开发者工具,前端性能优化利器
    JavaScript 浏览器开发者工具(例如 Chrome DevTools、Firefox Developer Tools)是前端开发人员必不可少的工具,提供了广泛的功能来调试、优化和维护 Web 应用程序。这些工具特别适用于提高前端性...
    99+
    2024-04-02
  • Web前端性能优化方法有哪些
    本篇内容介绍了“Web前端性能优化方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、精简java...
    99+
    2024-04-02
  • 如何提高web前端的性能优化
    如何提高web前端的性能优化,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前端性能优化是一个不断追求的过程,前面的文章虽然讲解了一些性能优化,但是关于性能优化的路还有很长,很多...
    99+
    2023-06-08
  • H5前端性能实例测试教程
    本篇内容主要讲解“H5前端性能实例测试教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“H5前端性能实例测试教程”吧!一、开篇:H5 页面加载过程浅析如下图所示...
    99+
    2024-04-02
  • WEB前端性能优化的方法有哪些
    这篇文章将为大家详细讲解有关WEB前端性能优化的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。减少请求数量合并如果不进行文件合并,有如下3个隐患1、文件与文件之...
    99+
    2024-04-02
  • JavaScript前端性能优化小窍门有哪些
    这篇文章主要讲解了“JavaScript前端性能优化小窍门有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript前端性能优化小窍门有哪些”...
    99+
    2024-04-02
  • 前端发开中如何进行性能优化
    小编给大家分享一下前端发开中如何进行性能优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!content方面1,减少HTTP请求...
    99+
    2024-04-02
  • Web前端性能的优化方法有哪些
    这篇文章主要讲解了“Web前端性能的优化方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Web前端性能的优化方法有哪些”吧!  Web前端性能优化的结果直接影响到用户体验,而用户体验...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作