浅谈浏览器加载优化
呼~总算搞定了博客,终于可以写一点自己的东西了,第一篇博客就来聊聊关于浏览器加载速度的话题,这个直接关乎用户在浏览我们网站时候的体验,也是作为我们前端工程师所必须了解的。
浏览器加载网页的过程
既然要探讨加载问题,我们首先得先知道浏览器是怎么加载网页的,知道了加载过程,就能针对其中的一些点进行不同程度的优化,浏览器加载网页的过程大致分为以下几步:
- 浏览器接受到服务器的 html 响应,开始以8k / chunk的速度开始下载 html 页面
- 浏览器开始解析页面代码,并开始构建
DOM 树 - 遇到 css 标签或者 js 标签就重新开启线程去下载对应的文件,然后继续构建
DOM 树 - 当 css 文件下载完后,开始解析 css 为
CSS 规则树 ,然后浏览器根据CSS 规则树 和DOM 树 生成render tree ,也就是开始渲染页面了 - 当 js 文件下载完后,开始解析 js 文件,若 js 文件里有修改 dom 的DOM API 或者修改 css 样式的CSSOM API,每次执行都会使
render tree 重新渲染,相比而言,修改 dom 的代价更高,它会使render tree 重新布局构建(reflow)然后进行重新渲染(repaint),而修改样式只会触发重新渲染。 - 渲染完成,显示页面
简单优化的一些建议
压缩 css 和 javascript 文件
既然是从服务器上下载下来的,首先想到的自然就是减少下载下来的文件体积。压缩就是一个很好的办法,市面上有很多工具可以帮助我们完成压缩的工作,个人比较推荐用
安装
1 | npm install uglify-js -g |
使用也很简单,博主在这就不展开了,具体文档点
启用 GZIP 压缩
压缩完 css 和 javascript 文件,我们是不是也能把 html 页面也压缩一下呢,毕竟页面是最先下载的,要是能压缩体积,必定能提升网站的访问速度。我们可以在服务器上通过Gzip压缩做到这一点,这能有效减少 HTTP 响应的时间,提高访问速度。
使用 CSS Sprites
俗称 css 精灵或雪碧图,把多个小图片整合到一张大图片中,需要取某张图片的话,通过
CSS 文件放在页面顶部,而 JS 文件放在底部
根据我们之前了解的网站加载过程,可以知道 css 是用来渲染整颗
而对于 js 文件来说,它会阻塞 DOM 树的构建,若放在
利用浏览器的缓存
浏览器自带缓存功能,能避免重复文件的多次下载,但是这个有时候也是个缺点,若有一些新的文件的版本更新,浏览器里可能还留着老版本文件的缓存导致不能更新到最新版本,这点对于一些更新频繁的网站是致命的,解决办法是给文件后面加
使用内容分发网络(CDN)
当一个网站的流量很大的时候,会对服务器造成很大的压力,处理的东西多了自然用户打开页面的时候就慢了,
减少重定向
重定向增加了额外的 HTTP 请求,也增加了页面加载时间。