[关闭]
@demonly 2017-10-14T04:01:44.000000Z 字数 3152 阅读 946

页面性能优化

零碎知识


根据 RAIL 模型优化判断页面性能

优化内容效率

删除不必要的下载

优化基于文本的资产的编码和传输大小

图片优化

网页字体优化

使用 font-face 定义字体系列时需要提供多种格式的字体文件

使用 unicode-range 描述符,我们可以指定一个以逗号分隔的范围值的列表,其中的范围值可以是单一代码点(例如 U+416)、间隔范围(例如 U+400-4ff)或者通配符范围(例如 U+4??)

  1. @font-face {
  2. font-family: 'Awesome Font';
  3. font-style: normal;
  4. font-weight: 400;
  5. src: local('Awesome Font'),
  6. url('/fonts/awesome-l.woff2') format('woff2'),
  7. url('/fonts/awesome-l.woff') format('woff'),
  8. url('/fonts/awesome-l.ttf') format('ttf'),
  9. url('/fonts/awesome-l.eot') format('eot');
  10. unicode-range: U+4e00-9fff; /* Chinese glyphs */
  11. }

使用字体加载优化 API

  1. //引入字体
  2. var font = new FontFace("Awesome Font", "url(/fonts/awesome.woff2)", {
  3. style: 'normal', unicodeRange: 'U+000-5FF', weight: '400'
  4. });
  5. font.load();
  6. //在字体加载完毕之后替换网页字体
  7. font.ready().then(function() {
  8. document.fonts.add(font);
  9. document.body.style.fontFamily = "Awesome Font, serif";
  10. var content = document.getElementById("content");
  11. content.style.visibility = "visible";
  12. });

优化关键呈现路径

浏览器首次描绘页面的步骤,尽可能缩短这几个步骤中的时间。

CSS

使用 HTML 和 CSS 媒体查询将一些 CSS 标记为不阻塞渲染,不阻塞渲染的 CSS 仅仅是不会暂停浏览器的首次渲染,依然会被下载。

应该尽早在 HTML 文档中指定所有 CSS 资源,使浏览器可以尽早发现<link>标签,并尽早发出 CSS 请求。

避免使用 CSS import。

JavaScript

在浏览器解析时遇到 script 标签会停止 DOM 树的构建,然后执行 JavaScript 脚本,如果这个脚本是外部文件引入的,那么还需要等待外部文件的下载。加入 async 关键字可以使脚本不阻塞 DOM 树的构建。

CSSOM 的构建会阻塞 JavaScript 脚本的执行。

  1. <script src="app.js" async></script>

分析关键呈现路径的性能

优化关键呈现路径

渲染性能

用 JS 修改 CSS 有三种常用的流水线。
- 修改布局属性,经过 计算样式、布局、绘制、渲染层合并。
- 修改绘制属性,经过 计算样式、绘制、渲染层合并。
- 修改非布局非绘制属性,经过 计算样式、渲染层合并。

对于动画和滚动这类负荷重的操作尽量采用第三种。

优化 JavaScript 效率

  1. var taskList = breakBigTaskIntoMicroTasks(monsterTaskList);
  2. requestAnimationFrame(processTaskList);
  3. function processTaskList(taskStartTime) {
  4. var taskFinishTime;
  5. do {
  6. var nextTask = taskList.pop();
  7. processTask(nextTask);
  8. taskFinishTime = window.performance.now();
  9. } while (taskFinishTime - taskStartTime < 3);
  10. if (taskList.length > 0)
  11. requestAnimationFrame(processTaskList);
  12. }

降低样式计算的范围和复杂度

避免大规模、复杂的布局

简化绘制复杂度、减小绘制区域

  1. .moving-element {
  2. will-change: transform;
  3. }

对于不支持 will-change 的浏览器

  1. .moving-element {
  2. transform: translateZ(0);
  3. }

使用 will-change 属性可以创建一个新的渲染层,在这个渲染层中使用 transform 来实现移动效果将不会对其他绘制层产生影响。

优先使用渲染层合并属性、控制层数量

用户输入事件

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注