--- title: 05-页面渲染性能优化 publish: true --- ## 浏览器渲染过程 ![](https://img.smyhvae.com/20210114_2115.png) 1. 浏览器解析 HTML,生成 DOM Tree(Parse HTML)。 2. 浏览器解析 CSS,生成 CSSOM(CSS Object Model)Tree。 3. JavaScript 会通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree,浏览器将 DOM Tree 和 CSSOM Tree 合成渲染树(Render Tree)。 4. 布局(Layout):根据生成的 Render Tree,进行回流,以计算每个节点的几何信息(位置、大小、字体样式等等)。 5. 绘制(Painting):根据渲染树和回流得到的几何信息,得到每个节点的绝对像素。 6. 展示(Display):将像素发送给图形处理器(GPU),展示在页面上。 ## 页面渲染技术方案总览 **服务端渲染**: - 后端同步渲染、同构直出、BigPipe。 **客户端渲染**: - JavaScript 渲染:静态化、前后端分离、单页面应用 - Web App:React、Vue、PWA - Hybrid App:PhoneGap 、AppCan 等 - 跨平台开发:RN 、Flutter 、小程序等。 - 原生 App:iOS 、Android 建议: - 依赖业务形式、依赖团队规模、依赖技术水平。 ## 静态化技术方案 静态化是使动态化的网站生成静态 HTML 页面以供用户更好访问的技术,一般分为纯动态化和伪动态化。 技术优势: - 提高了页面访问速度,降低了服务器的负担,因为访问页面时不需要每次去访问数据库。 - 提高网站内容被搜索引擎搜索到的几率,因为搜索引擎更喜欢静态页面。 - 网站更稳定,如果后端程序、数据库出现问题,会直接影响网站的正常访问,而静态化页面有缓存,更不容易出现问题。 技术不足: - 服务器存储占用问题,因为页面量级在增加,要占用大量硬盘空间。 - 静态页面中的链接更新问题会有死链或者错误链接问题。 技术实现: - 跑定时任务,将已有的动态内容进行重定,生成静态的 HTML 页面。 - 利用模板技术,将模板引擎中模板字符替换为从数据库字段中取出来的值, 同时生成 HTML 文件。 协作方式: - 前端统一写好带有交互的完整静态页面。 - 后端拆分出静态页面文件,并嵌套在后端模板文件中。 选型建议:后端研发人员充分,又需要考虑用户体验、服务器负载的业务。 ## 前后端分离技术与实现 前后端分离是指研发人员分离、业务代码分离、后端实现业务接口,前端渲染页面。 技术实现: - 后端只负责功能接口实现,提供按照约定的数据格式并封装好的 API 接口。 - 前端负责业务具体实现,获取到 API 接口数据后,进行页面模板拼接和渲染,独立上线。 协作方式: - 前端负责实现页面前端交互,根据后端 API 接口拼装前端模板。 - 后端专注于业务功能实现和 API 接口封装。 技术优势: - 团队更加专注 - 提升了开发效率 - 增加代码可维护性 技术架构: - 后端架构:Java、C++、PHP、 + Nginx,使用微服务(比如 Dubbo 等)等实现业务的解耦,所有的服务使用某种协议提供不同的服务(比如 JSF 等) 。 - 前端架构:使用 Angular、React、Vue 前端框架并部署页面至 CDN。 - 前端架构 2:使用 Angular、React、Vue 前端框架并部署在 Node Server。 技术不足: - 因为前端需要负责一大部分业务逻辑实现,和服务端同步、静态化,需要前端人力非常多。 - 页面数据异步渲染,不利于 SEO,搜索引擎更喜欢纯静态页面。 选型建议: - 这是大型互联网公司正在采用的开发模式,一句话,如果考虑用户体验,以及前端人力够用,就可以积极采用。 ## 单页面应用技术方案 单页应用(single-page application,缩写 SPA),通过动态重写当前页面,来与用户交互,而非传统的从服务器重新加载整个新页面。这种方法在使用过程中不需要重新加载页面,避免了页面之间切换打断用户体验,使应用程序更像一个桌面应用程序。 技术优点: - 不错的加载速度:用户往往感觉页面加载非常快,因为一进入页面就能看到页面元素; - 良好的交互体验:进行局部渲染,避免不必要的页面间跳转和重复渲染; - 前后端职责分离:前端进行页面交互逻辑,后端负责业务逻辑; - 减轻服务器负载:服务器只处理数据接口输出,不用考虑页面模板渲染和 HTML 展示。 技术缺点: - 开发成本相对较高 - 首次页面加载时间过多 - SEO 难度比较大 技术实现: - 使用 React、Vue 框架可以很好的。 ## BigPipe 简介和工作模式 BigPipe 通过将页面加载到称为 Pagelet 的小部件中,来加快页面渲染速度,并允许浏览器在 PHB 服务器呈现页面的同时,一直请求页面不同区块的结构,类似一个“流”传输管道。 **技术实现**: 1. 浏览器从服务器请求页面。 2. Server 迅速呈现一个包含 标记的页面框架,以及一个包含空 div 元素的主体,这些元素充当 Pagelet 的容器。由于该页面尚未完成,因此与浏览器的 HTTP 连接保持打开状态。 3. 浏览器将开始下载 bigpipe.js 文件,然后它将开始呈现页面。 4. PHP 服务器进程仍在执行,并且一次构建每个 Pagelet 。Pagelet 完成后,其结果将在`