# 性能优化

  • 让加载更快
  • 让渲染更快

# 性能优化原则

  • 多使用内存、缓存或其他方法(比如 webpack 打包时候,设置 filename: 'bundle.[contenthash].js' 通过 contenthash 判断是否文件修改如果没修改不进行打包生成)
  • 减少 CPU 计算量,减少网络加载耗时
  • 适用于所有编程的性能优化-空间换时间

# 让加载更快

  • 减少资源体积:压缩代码
  • 较少访问次数:合并代码,SSR 服务器端渲染,缓存
  • 使用更快的网络:CDN

# 让渲染更快

  • CSS 放在 head,JS 放在 body 最下面
  • 尽早开始执行 JS,用 DOMContentLoaded 触发
  • 懒加载(图片懒加载,上划加载更多)
  • 对 DOM 查询进行缓存
  • 频繁 DOM 操作,合并到一起插入 DOM 结构
  • 节流 throttle 防抖 debounce

# 缓存

  • 静态资源加 hash 后缀,根据文件内容计算 hash。
  • 文件内容不变,则 hash 不变,则 url 不变。
  • url 和文件不变,则会自动触发 http 缓存机制,返回 304

# SSR

  • 服务器端渲染:将网页和数据一起加载,一起渲染
  • 非 SSR(前后端分离):先加载网页,再加载数据,再渲染数据
  • 早先的 JSP ASP PHP,现在的 vue、React SSR

# 懒加载

<img id="img1" src="preview.png" data-realsrc="abc.png" />
<script>
  // 当图片需要展示的时候,将 data-reslsrc 中存储的真正的图片地址进行加载。
  const img1 = docunment.getElementById('img1')
  img1.src = img1.getAttribute('data-reslsrc')
</script>

# 缓存 DOM 查询

// 不缓存 DOM 查询结果

for (let i = 0; i < document.getElementsByTagName('p').length; i ++) {
  // 每次循环,都会计算 length,频繁进行 DOM 查询
}

// 缓存 DOM 查询结果
const pList = document.getElementsByTagName('p')
const length = pList.length
for (let i = 0; i < length; i ++) {
  // 缓存 length,只进行一次 DOM 查询
}

# 多个 DOM 操作一起插入到 DOM 结构

// 循环查询
const list = document.getElementById('list')

for (let i = 0; i< 10; i++) {
  const li = document.createElement('li')
  li.innerHTML = `List item ${i}`
  list.appendChild(li)
}

// 一次查询
// 创建一个文档片段,此时还没有插入到 DOM 中,存在于内存中
const frag = document.createDocumentFragment()

// 执行插入
for(let x = 0; x < 10; x++) {
  const li = document.createElement('li')
  li.innerHTML = `List item ${x}`
  frag.appendChild(li)
}
// 都完成之后,再插入到 DOM 树中
list.appendChild(frag)

# 尽早开始 JS 执行

window.addEventListener('load', function() {
  // 页面的全部资源加载完才会执行,包括图片、视频等
})
document.addEventListener('DOMContentLoaded', function () {
  // DOM 渲染完即可执行,此时图片、视频还可能没有加载完
})

评 论:

更新: 11/21/2020, 7:00:56 PM