前端开发 之 性能优化

原则

  1、多使用内存、缓存或者其他方法存储

  2、减少 CPU 计算、减少网络请求

入手

  1、怎么让页面、静态资源加载的更快

  2、怎么让页面上的一些操作变得更快

加载资源优化

1、静态资源的压缩合并,预加载文件

<script src="a.js"></script>
<script src="b.js"></script>
<script src="c.js"></script>

<script src="abc.js"></script>  // 合并在一起

window.addEventListener('DOMConetentLoaded', function(){
  setTimeout(function(){
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://dome.js');
    xhr.send(null);
    xhr.open('GET', 'http://demo.css');
    xhr.send(null);
    xhr.open('GET', 'http://demo.jpg');
    xhr.send(null);
  }, 1000)
})

2、静态资源进行缓存

通过链接名称控制缓存
<link rel="stylesheet" href="/css/main.css" />  // 浏览器第一访问后会自动缓存,第二次或以后访问都会从缓存中读取
<link rel="stylesheet" href="/css/main_20171018.css" /> // 只有内容改变的时候,链接的名称才会改变,浏览器又会重新请求拉取,继续缓存 

3、使用 CDN 让资源加载更快

<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" />
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

4、使用 SSR 后端渲染,数据直接输出到 HTML 中(如: angular,数据直接输出到页面上,不通过 Ajax 网络请求)

渲染优化

1、CSS 放前面,JS 放后面

2、懒加载(图片懒加载、下拉加载更多),图片先不加载,什么时候用,什么时候加载

<img id="imgId" src="preview.png" data-realsrc="abc.png" />  // 第一次加载是全站通用的预览图,很小,会很快加载
<script type="text/javascript">
  var imgId = document.getElementById('imgId');
  imgId.src = imgId.getAttribute('data-realsrc');  // 当需要展示的时候,再把 data-realsrc 里面图片的真正地址赋值给 src
</script>

3、减少 DOM 查询,对 DOM 查询做缓存,减少 DOM 操作,多个操作尽量合并在一起执行(DOM 操作是非常昂贵的,意思就是耗时、耗性能)

var listNode = document.getElementById('list');
var frag = document.createDocumentFragment();  // 创建一个代码片段,不会有实质的 DOM 结构
var x, li;
for (x=0; x<10; x++) {
  li = document.createElement('li');
  li.innerHTML = 'List item' + x;
  frag.appendChild(li);  // 在片段中插入 li,不会触发的 DOM 操作
}
listNode.appendChild(frag);  // 只有一次的 DOM 插入操作

4、事件节流

var textarea = document.getElementById('text');
var timeoutId;
textarea.addEventListener('keyup', function(){
  if(timeoutId){
    clearTimeout(timeoutId);
  }
  timeoutId = setTimeout(function(){
    // 延迟执行 1秒 触发 change 事件
  }, 1000)
})

5、尽早执行操作(如:DOMContentLoaded)

window.addEventListener('load', function(){
  // 页面的全部资源加载完才会执行,包括图片、视频等
})

window.addEventListener('DOMContentLoaded', function(){
  // DOM 渲染完即可执行,此时图片、视频等可能还没有加载完
})
原文地址:https://www.cnblogs.com/joffe/p/7687937.html