浏览器性能优化

浏览器性能优化
关于浏览器性能优化这方面,也是web开发一个不可避免地重点。下面就分别从几个方面谈一谈如何提高浏览器性能。

一、网络加载类
1.首屏数据请求提前,避免 JavaScript 文件加载后才请求数据
为了进一步提升页面加载速度,可以考虑将页面的数据请求尽可能提前,避免在 JavaScript 加载完成后才去请求数据。通常数据请求是页面内容渲染中关键路径最长的部分,而且不能并行,所以如果能将数据请求提前,可以极大程度上缩短页面内容的渲染完成时间。那怎么将请求数据提前呢?建议采用首屏数据渐进式预加载的优化思路,具体如下:
1.优化首屏数据加载节点的速度。

2.预先加载首屏数据,使得多个串行节点并行化。
接下来详细介绍优化步骤,第1点会在第一步优化中体现,但核心思路和主要优化收益更多体现在第2点:多个串行节点并行化。
Step1:资源文件下载与首屏数据请求节点并行
为了达到资源下载与数据请求并行的效果,我们充分利用了 HTTP Chunk 传输与浏览器的渐进式渲染特性:
将入口页分为静态片段和数据片段:静态片段包含了各个资源标签 (script,link),静态的导航栏,加载指示器等;数据片段则是包含首屏数据的内联脚本,大至如下:

<script>window.__APP_DATA__ = { /* 相关的首屏数据 */ };</script>
1
复制代码浏览器请求入口页时,入口页服务器 并行 做以下操作:

HTTP Chunk 方式输出静态片段

请求首屏数据并在所有数据请求完成后将数据片段和应用初始化代码返回给浏览器。

注:http chunk 方式输出在 NodeJS 中及其容易满足,简单的 res.write(chunk) 即可。
Step2:应用初始化,资源文件下载,首屏数据请求节点并行
在 Step1 的基础上继续分析,应用初始化节点耗时也很明显,同时该节点要进行必须等待资源文件下载完毕,但理论上可以不依赖我们的首屏数据,还是可以让其和首屏数据请求并行。这里我们无法在 Step1 方案上直接将应用初始化和数据请求并行化,主要原因在于当首屏数据请求时间大于资源加载+应用初始化完成时间时,应用会在没有数据的情况下进入首屏渲染节点,从而导致异常。
解决方案是将数据片段的输出变成 promise 片段:

pending promise 片段,与静态片段一起输出,大概如下:

```javascript
<script>
window.__APP_DATA__ = {
 RESOLVERS: {}
 userInfo: new Promise((resolve, reject) => {
   // 超时认为失败
   let timer = setTimeout(reject.bind(null, {message: 'timeout'}), 12000);
   window.__APP_DATA__.userInfo = (err, data) => {
     clearTimeout(timer);
     err ? reject(err) : resolve(data)
   }
 })
};
</script>

  

resolve promise 片段,该片段在数据请求成功返回后输出,大概如下:

```javascript
<script>window.__APP_DATA__.RESOLVERS.userInfo(null, data); </script>

  

复制代码
reject promise 片段,该片段在数据请求失败后输出,大概如下:

<script>window.__APP_DATA__.RESOLVERS.userInfo(error); </script>
1
复制代码2.首屏加载和按需加载,非首屏内容滚屏加载,保证首屏内容最小化
由于移动端网络速度相对较慢,网络资源有限,因此为了尽快完成页面内容的加载,需要保证首屏加载资源最小化,非首屏内容使用滚动的方式异步加载。一般推荐移动端页面首屏数据展示延时最长不超过 3 秒。目前中国联通 3G 的网络速度为 338KB/s(2.71Mb/s),所以推荐首屏所有资源大小不超过 1014KB,即大约不超过 1MB。

3.模块化资源并行下载
在移动端资源加载中,尽量保证 JavaScript 资源并行加载,主要指的是模块化 JavaScript 资源的异步加载,例如 AMD 的异步模块,使用并行的加载方式能够缩短多个文件资源的加载时间。

4.inline 首屏必备的 CSS 和 JavaScript
通常为了在 HTML 加载完成时能使浏览器中有基本的样式,需要将页面渲染时必备的 CSS 和 JavaScript 通过

<!DOCTYPE html>
<html lang="en">
   <head>
   <meta charset="UTF-8">
   <title>样例</title>
   <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
   <style>
   /*必备的首屏CSS*/
   html,body{
        margin:0;
        padding:0;
        background-color:#eee;
    }
    </style>
</head>
<body>
</body>
</html>

  复制代码5. meta dns prefetch 设置 DNS 预解析
设置文件资源的 DNS 预解析,让浏览器提前解析获取静态资源的主机 IP,避免等到请求时才发起 DNS 解析请求。通常在移动端 HTML 中可以采用如下方式完成。

<!--cdn域名预解析-->
<meta http-equiv="x-dns-prefetch-control" content="on" >
<link rel="dns-prefetch" href="//cdn.domain.com" >

  

6.资源预加载
对于移动端首屏加载后可能会被使用的资源,需要在首屏完成加载后尽快进行加载,保证在用户需要浏览时已经加载完成,这时候如果再去异步请求就显得很慢。

7.合理利用 MTU 策略
通常情况下,我们认为 TCP 网络传输的最大传输单元 (Maximum Transmission Unit,MTU)为 1500B,即一个 RTT(Round-Trip Time,网络请求往返时间)内可以传输的数据量最大为 1500 字节。因此,在前后端分离的开发模式中,尽量保证页面的 HTML 内容在 1KB 以内,这样整个 HTML 的内容请求就可以在一个 RTT 内请求完成,最大限度地提高 HTML 载入速度。
缓存类

(1).合理利用浏览器缓存
除了之前说到的使用 Cache-Control、Expires、Etag 和 Last-Modified 来设置 HTTP 缓存外,在移动端还可以使用 localStorage 等来保存 AJAX 返回的数据,或者使用 localStorage 保存 CSS 或 JavaScript 静态资源内容,实现移动端的离线应用,尽可能减少网络请求,保证静态资源内容的快速加载。

(2).静态资源离线方案
对于移动端或 Hybrid 应用,可以设置离线文件或离线包机制让静态资源请求从本地读取,加快资源载入速度,并实现离线更新。关于这块内容,我们会在后面的章节中重点讲解。

(3).尝试使用 AMP HTML
AMP HTML 可以作为优化前端页面性能的一个解决方案,使用 AMP Component 中的元素来代替原始的页面元素进行直接渲染

<!--不推荐-->
<video width="400" height="300" src="http://www.domain.com/videos/myvideo.mp4" poster="path/poster.jpg">
   <div fallback>
        <p>Your browser doesn’t support HTML5 video</p>
    </div>
    <source type="video/mp4" src="foo.mp4">
    <source type="video/webm" src="foo.webm">
</video>
<!--推荐-->
<amp-video width="400" height="300" src="http://www.domain.com/videos/myvideo.mp4"
poster="path/poster.jpg">
   <div fallback>
       <p>Your browser doesn’t support HTML5 video</p>
   </div>
   <source type="video/mp4" src="foo.mp4">
   <source type="video/webm" src="foo.webm">
</amp-video>

  

 
posted @ 2022-06-17 08:00  青竹之下  阅读(376)  评论(0编辑  收藏  举报