Web优化
页面加载优化
页面加载顺序
1、解析HTML
,构建DOM
树
2、解析CSS
,构建CSSOM
树
3、合并DOM
和CSSOM
,构建渲染树(Render Tree
)
4、计算布局,计算元素位置和大小信息
5、加载图片及外部内容,如果此时dom
元素的集合属性发生变化,则会发生回流,重新执行以上几步
6、网页加载完毕
页面加载主要耗时
Waiting(TTFB)
耗时:指用户打开页面到服务器返回第一个字节之间的等待时间,一般在500ms以内。主要受用户网速与站点服务器响应速度影响
Dom Completed
耗时:完成页面加载的时间。
请求优化
浏览器的缓存策略
强缓存:直接使用浏览器缓存中的内容,不向服务器发送请求,在响应头配置Cache-Control
no-cache
是指先要和服务器确认是否有资源更新,在进行判断。也就是说没有强缓存,但是会有协商缓存;
no-store
是指不存储缓存,也就没有缓存可使用,每次请求都直接从服务器获取资源。
max-age=3
:3s内再次发起相同请求不会去服务器重新请求,使用缓存数据
协商缓存(Etag):请求的资源通过资源标识与服务器协商比对,协商成功,服务器返回304状态码,浏览器从本地加载。协商缓存需要用到 Etag
字段与 if-none-match
,Etag
是 HTTP
响应头中的字段,Etag
的值是根据资源内容编码生成的一段字符串(资源标识),内容不同就会生成不同的Etag
。
再次发起请求时,请求头会带有if-none-match
字段,值为上一次响应的 Etag
(没有则不会携带)。
静态的html页面设置http缓存
通过HTTP
的META
设置cache-control
<meta http-equiv="Cache-Control" content="no-cache" />
如果不想命中协商缓存与强缓存,win
系统可以直接 ctrl + f5
cookie优化
少使用Cookie
,发送请求时,浏览器会自动带上cookie
,cookie
内容越多请求越慢
代码层面的优化
seo搜索引擎优化
<!-- 1. TDK标题编写:-->
<title>网站标题</title>
<meta name="keywords" content="北京餐饮物联网,北京餐饮物联网平台,餐饮物联网,餐饮">
<meta name="description" content="北京餐饮物联网平台是一个提供美食餐饮相关咨询的网站">
1.语义化标签,结构与样式分离
H5
新增的语义化标签,以及strong
,h
等含有语义的标签利于浏览器爬取,排除死链接
图片需要加上alt
,title
属性,以及label
的运用,增加用户体验
html优化
1.减少不必要的元素嵌套,尽量扁平化,浏览器编译更快
2.采用div
+css
布局,避免使用table
布局,table
要等其中的内容完全下载后才会显示出来,显示比div+css
慢
3.少写行内样式,做到结构与样式分离
4.script
标签写到html
末尾,防止js
阻塞页面解析
5.多使用语义化标签,利于浏览器爬取,也利于开发人员维护
css优化
提升css
实现性能的方式可以从选择器嵌套、属性特性、减少http请求这三面考虑,同时还要注意css
代码的加载顺序
少写内联样式
- 内联样式不易阅读、维护,特别是内联样式优先级较高的问题
- 影响打包效率
合理使用选择器
css
匹配的规则是从右往左开始匹配,例如#markdown .content h3
匹配规则如下:
- 先找到
h3
标签元素 - 然后去除祖先不是
.content
的元素 - 最后去除祖先不是
#markdown
的元素
如果嵌套的层级更多,页面中的元素更多,那么匹配所要花费的时间代价自然更高
所以我们在编写选择器的时候,可以遵循以下规则:
- 不要嵌套使用过多复杂选择器,最好不要三层以上
- 使用
id
选择器就没必要再进行嵌套 - 通配符和属性选择器效率最低,避免使用
不要使用@import
css
样式文件有两种引入方式,一种是link
元素,另一种是@import
@import
会影响浏览器的并行下载,使得页面在加载时增加额外的延迟,增添了额外的往返耗时
而且多个@import
可能会导致下载顺序紊乱
比如一个css
文件index.css
包含了以下内容:@import url("reset.css")
那么浏览器就必须先把index.css
下载、解析和执行后,才下载、解析和执行第二个文件reset.css
资源加载
icon
图标使用字体图标- 使用压缩工具压缩图片体积
资源压缩
利用webpack、gulp/grunt、rollup
等打包工具,将css
文件进行压缩,使文件变小,大大降低了浏览器的加载时间
javascript优化
减少对dom
操作,减少重绘和重排,销毁或重建元素,修改元素几何属性会引发重排
可以适当使用innerHTML
代替dom
操作,减少dom
操作次数,优化性能
适当使用事件委托,减少注册监听事件
内存问题,少用全局变量,慎用闭包,避免造成内存泄漏
封装可复用的函数
防抖函数和节流函数的使用,避免短时间内多次执行回调,造成资源的浪费
switch
语句替代if ... else...
Vue项目中的优化
v-if
和v-show
的使用,需要频繁切换时使用v-show
。因为v-if
是通过销毁重建dom
实现的,性能消耗较大;v-show
是通过修改display
属性来实现显示隐藏
v-for
遍历时要指定非下标的唯一key
值,提高虚拟dom
对比效率。
v-for
不要和v-if
一起使用,v-for
的优先级高于v-if
,每次遍历后都要计算v-if
,浪费性能
组件销毁时及时清除addEventListener
绑定的事件和定时器等,可在beforeDestory
钩子中清除
路由和组件使用懒加载:const Home = () => import(@/views/Home)
图片懒加载:vue-lazyload
项目打包优化
关于webpack对前端性能的优化,可以通过文件体积大小入手,其次还可通过分包的形式、减少http请求次数等方式,实现对前端性能的优化
减小打包体积
- 小图片转换为
base64
格式,减少http
请求次数,缺点会增加图片体积 - 从
js
中将css
提取到单独文件,优化页面加载效果 - 通过
postcss
配置css
的兼容性,browserslist
配置目标浏览器范围 - 在
vue
项目中,通过打包生成的report.html
页面去分析那些占体积较大的文件可以优化,有些体积较大的依赖项可以采用CDN
引入的方式