针对HTML,如何优化性能?
- 对于资源加载,按需加载和异步加载
- 预加载图片,将样式表放在顶部,将脚本放在底部,加上时间戳
- 首次加载的资源不超过1024KB,即越小越好。
- 压缩HTML、CSS、 JavaScript文件。
- 减少DOM节点。
- 避免空
src
(src属性为空,会重新加载当前页面,影响速度和效率)。 - 尽量避免在HTML标签中写 style属性
- 避免在页面的主体布局中使用表,表要在其中的内容完全下载之后才会显示出来,显示的速度比
DIV+CSS
布局慢。 - 不滥用Web字体,Web字体需要下载、解析、重绘当前页面,尽量少使用
- 避免30*、40*、50*请求错误
- 添加
Favicon.ico
,如果没有设置图标ico,则默认的图标会导致发送一个404或者500请求。
针对CSS,如何优化性能?
- 正确使用
display
属性,display
属性会影响页面的渲染,因此要注意以下几方面。
display:inline
后不应该再使用width
、height
、margin
、padding
和float
;
display:inline- block
后不应该再使用float
;
display:block
后不应该再使用vertical-align
;
display:table-*
后不应该再使用margin
或者float
。
- 不滥用
float
,float
在渲染时计算量比较大,尽量少使用。 - 不声明过多的
font-size
。 - 当值为
0
时不需要单位。 - 标准化各种浏览器前缀,并注意以下几方面。
浏览器无前缀应放在最后。
CSS动画只用( -webkit-无前缀)两种即可。
其他前缀包括 -webkit-、-moz-、-ms-、无前缀( Opera浏览器改用 blink内核,所以-0-被淘汰)
- 避免让选择符看起来像是正则表达式。避免使用CSS表达式、高级选择器、通配选择器,高级选择器不容易读懂,执行时间也长。
- 尽量使用id、 class选择器设置样式(避免使用 style属性设置行内样式)
- 尽量使用CSS3动画。
- 合理使用
requestAnimation Frame
动画代替setTimeout
- 避免使用CSS3渐变阴影效果
- 减少重绘和回流。
- 使用CSS图片精灵,初始首屏之外的图片资源按需加载,静态资源延迟加载。
- 为图片标明高度和宽度(如果浏览器没有找到这两个参数,它需要一边下载图片一边计算大小。如果图片很多,浏览器需要不断地调整页面。这不但影响速度,而且影响浏览体验。当浏览器知道高度和宽度参数后,即使图片暂时无法显示,页面上也会腾出图片的空位,然后继续加载后面的内容,从而优化加载时间,提升浏览体验)。
- 选择合适的图片格式(颜色数多用JPG格式,而很少使用PNG格式,如果能通过服务器端判断浏览器支持WebP就用WebP或SVG格式)。
图片懒加载
对于图片懒加载,可以为页面添加一个滚动条事件,判断图片是否在可视区域内或者即将进入可视区域,优先加载。
如果为幻灯片、相册文件等,可以使用图片预加载技术,对于当前展示图片的前一张图片和后一张图片优先下载。 如果图片为CSS图片,可以使用 CSS
Sprite、SVG sprite、 Icon font、Base64等技术。
如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩得特别小的缩略图,以提高用户体验。
如果图片展示区域小于图片的真实大小,则应在服务器端根据业务需要先行进行图片压缩,图片压缩后,图片大小与展示的就一致了。
哪些方法能提升移动端CSS3动画体验?
- 尽可能多地利用硬件能力,如使用3D变形来开启GPU加速,例如以下代码。
-webkit-transform: translate 3d(0, 0, 0);
-moz-transform : translate3d(0,0, 0);
-ms-transform : translate 3d(0,0,0);
transform: translate3d(0,0,0);
一个元素通过 translate3d右移500X的动画流畅度会明显优于使用left属性实现的动画移动,原因是CSS动画属性会触发整个页面重排、重绘、重组。paint通常是最耗性能的,尽可能避免使用触发 paint的CSS动画属性。
如果动画执行过程中有闪烁(通常发生在动画开始的时候),可以通过如下方式处理。
-webkit-backface-visibility:hidden;
-moz-backface-visibility:hidden;
-ms-backface-visibility:hidden ;
backface-visibility:hidden;
-webkit-perspective:1000;
-moz-perspective:1000;
-ms-perspective:1000;
perspective:1000;
- 尽可能少使用
box- shadows
和gradients
,它们往往严重影响页面的性能,尤其是在一个元素中同时都使用时。 - 尽可能让动画元素脱离文档流,以减少重排,如以下代码所示。
position:fixed;
position:absolute;
针对 JavaScript,如何优化性能?
- 缓存
DOM
的选择和计算。 - 少用全局变量
- 减少
DOM
操作次数 - 尽量使用事件委托模式,避免批量绑定事件。
- 移动端使用
touch
事件代替click
。 - 合理使用
requestAnimationFrame
动画代替setTimeOut
。 - 适当使用
canvas
动画。 - 尽量避免在高频事件(如
TouchMove
、Scroll
事件)中修改视图,这会导致多次渲染。 - 避免使用
with
(with会创建自己的作用域,增加作用域链的长度) - 多个变量声明合并
- 在前端用变量保存
Ajax
请求结果,每次操作本地变量时,不用请求,减少请求次数
如何优化服务器端?
- 可以进行文件合并、文件压缩使文件最小化,启用
Gzip
压缩。 - 延长资源缓存时间,合理设置资源的过期时间,对于一些长期不更新的静态资源过期时间设置得长一些。
- 减少
cookie
头信息的大小,头信息越大,资源传输速度越慢。 - 可以使用
CDN
托管文件(图片、CSS、 JavaScript文件),让用户更快速地访问 - 使用多个域名来缓存静态文件 。
如何优化服务器端的接口?
- 接口合并:如果一个页面需要请求两部分以上的数据接口,则建议合并成一个以减少
HTTP
请求数。 - 减少数据量:去掉接口返回的数据中不需要的数据。
- 缓存数据:首次加载请求后,缓存数据;对于非首次请求,优先使用上次请求的数据,这样可以提升非首次请求的响应速度。
如何优化脚本的执行?
脚本处理不当会阻塞页面加载、渲染,因此在使用时需注意。
- 把CSS写在页面头部,把 JavaScript程序写在页面尾部或异步操作中。
- 避免图片和 iFrame等的空src,空src会重新加载当前页面,影响速度和效率。
- 尽量避免重设图片大小。重设图片大小是指在页面、CSS、 JavaScript文件等中多次重置图片大小,多次重设图片大小会引发图片的多次重绘,影响性能
- 图片尽量避免使用 DataURL。DataURL图片没有使用图片的压缩算法,文件会变大,并且要在解码后再渲染,加载慢,耗时长。
如何优化渲染?
- 通过HTML设置
viewport
元标签,viewport
可以加速页面的渲染,如以下代码所示。
<meta name="viewport" content="width=device=width,initial-scale=1">
- 减少DOM节点数量,DOM节点太多会影响页面的渲染,应尽量减少DOM节点数量。
- 尽量使用CSS3动画,合理使用 requestAnimationFrame动画代替 setTimeout,适当使用 canvas动画(5个元素以内使用CSS动画,5个元素以上使用 canvas动画(iOS 8中可使用 webGL))。
- 对于高频事件优化 Touchmove, Scroll事件可导致多次渲染。使用 requestAnimationFrame监听帧变化,以便在正确的时间进行渲染,增加响应变化的时间间隔,减少重绘次数。使用节流模式(基于操作节流,或者基于时间节流),减少触发次数。
- 提升GPU的速度,用CSS中的属性(CSS3 transitions、CSS3 3D transforms、 Opacity、 Canvas、 WebGL、Video)来触发GPU渲染.
如何设置DNS缓存?
在浏览器地址栏中输入URL
以后,浏览器首先要查询域名
( hostname)对应服务器的IP地址
,一般需要耗费20~120ms的时间。DNS查询完成之前,浏览器无法识别服务器IP,因此不下载任何数据。基于性能考虑,ISP运营商、局域网路由、操作系统、客户端(浏览器)均会有相应的DNS缓存机制。
- 正IE缓存30min,可以通过注册表中 DnsCacheTimeout项设置。
- Firefox混存1 min,通过 network.dnsCacheExpiration配置。
- 在 Chrome中通过依次单击“设置”→“选项”→“高级选项”,并勾选“用预提取DNS提高网页载入速度”选项来配置缓存时间。