前端常见的面试题(十五)

前端优化

1、图片处理

  • 雪碧图
    CSS雪碧图是以前非常流行的技术,可以把网站上的一些图片整合到一张单独的图片中,这样可以减少网站的HTTP请求数量,但是当整合图片比较大时,一次加载比较慢,随着字体图片、SVG图片的流行,该技术渐渐的退出了历史的舞台。

  • Base64
    将图片的内容以Base64格式内嵌套到HTML中,可以减少HTTP请求数量,但是由于Base64编码用8位字符表示信息中的6个位,所以编码后大小大约比原始值扩大了33%

base64位转码有两种:

base64在HTML中的使用

<img width="40" height="30" src="data:image/jpg;base64,/9j/4QMZRXhpZgAASUkqAAgAAAAL...."/>

base64在CSS中使用

.demolmg{background-image:url("data:image/jpg;base64,/9j/4QMZRXhpZgAASUkqAAgAAAAL....");}
  • 使用字体图标来代替图片

【减少重定向】  
尽量避免使用重定向,当页面发生了重定向,就会延迟整个HTML文档的传输。在HTML文档到达之前,页面中不会呈现任何东西,也没有任何组件会被下载,降低了用户体验  如果一定要使用重定向,如http重定向到https,要使用301永久重定向,而不是302临时重定向。因为,如果使用302,则每一次访问http,都会被重定向到https的页面。而永久重定向,在第一次从http重定向到https之后 ,每次访问http,会直接返回https的页面
【使用缓存】  
使用cach-control或expires这类强缓存时,缓存不过期的情况下,不向服务器发送请求。强缓存过期时,会使用last-modified或etag这类协商缓存,向服务器发送请求,如果资源没有变化,则服务器返回304响应,浏览器继续从本地缓存加载资源;如果资源更新了,则服务器将更新后的资源发送到浏览器,并返回200响应
【不使用CSS @import】
CSS的@import会造成额外的请求
【避免使用空的src和href】
a标签设置空的href,会重定向到当前的页面地址 form设置空的method,会提交表单到当前的页面地址

2、性能优化

  • 减少请求资源大小或者次数

1、尽量和并和压缩css和js文件。(将css文件和并为一个。将js合并为一个)
原因:主要是为了减少http请求次数以及减少请求资源的大小
打包工具: webpack gulp grunt.  …
2、尽量所使用的字体图标或者SVG图标来代替传统png图
因为字体图标或者SVG是矢量图,代码编写出来的,方大不会变形,而且渲染速度快
3、采用图片的懒加载(延迟加载)
目的为了,减少页面第一次加载过程中http的请求次数
具体步骤:
(1)页面开始加载时不去发送http请求,而是放置一张占位图
(2)当页面加载完时,并且图片在可视区域再去请求加载图片信息
4、能用css做的效果,不要用js做,能用原生js做的,不要轻易去使用第三方插件。 避免引入第三方大量的库。而自己却只是用里面的一个小功能
5、使用雪碧图或者是说图片精灵
把所有相对较小的资源图片,绘制在一张大图上,只需要将大图下载下来,然后利用 图片定位来讲小图展现在页面中(background-position:百分比,数值)
6、减少对cookie的使用(最主要的就是减少本地cookie存储内容的大小),因为客户端操作cookie的时候,这些信息总是在客户端和服务端传递。如果上设置不当,每次发送一个请求将会携带cookie
7、前端与后端进行数据交互时,对于多项数据尽可能基于json格式来进行传送。相对于使用xml来说传输有这个优势,目的:是数据处理方便,资源偏小
8、前端与后端协商,合理使用keep-alive
9、前端与服务器协商,使用响应资源的压缩
10、避免使用iframe
不仅不好管控样式,而且相当于在本页面又嵌套其他页面,消耗性能会更大。因为还回去加载这个嵌套页面的资源
11、在基于ajax的get请求进行数据交互的时候,根据需求可以让其产生缓存(注意:这个缓存不是我们常看到的304状态码,去浏览器本地取数据),这样在下一次从相同地址获取是数据时,取得就是上一次缓存的数据。
(注意:很少使用,一般都会清空。根据需求来做)

3、代码优化相关

1、在js中尽量减少闭包的使用
原因:使用闭包后,闭包所在的上下文不会被释放
2、减少对DOM操作,主要是减少DOM的重绘与回流(重排)
关于重排(回流)的分离读写:如果需要设置多个样式,把设置样式全放在一起设置,不要一条一条的设置。使用文档碎片或者字符串拼接做数据绑定(DOM的动态创建)
3、在js中避免嵌套循环和"死循环"(一旦遇到死循环,浏览器就会直接卡掉)
4、把css放在body上,把js放在body下面让其先加载css(注意:这里关于优化没有多大关系)
5、减少css表达式的使用
6、css选择器解析规则所示从右往左解析的。减少元素标签作为对后一个选择对象
7、尽量将一个动画元素单独设置为一个图层(避免重绘或者回流的大小)注意:图层不要过多设置,否则不但效果没有达到反而更差了
8、在js封装过程中,尽量做到低耦合高内聚。减少页面的冗余代码
9、css中设置定位后,最好使用z-index改变盒子的层级,让盒子不在相同的平面上
10、css导入的时候尽量减少@import导入式,因为@import是同步操作,只有把对应的样式导入后,才会继续向下加兹安,而link是异步的操作
11、使用window.requestAnimationFrame(js的帧动画)代替传统的定时器动画如果想使用每隔一段时间执行动画,应该避免使用setInterval,尽量使用setTimeout,代替setInterval定时器。因为setInterval定时器存在弊端:可能造成两个动画间隔时间缩短
12、尽量减少使用递归。避免死递归,解决:建议使用尾递归
13、基于script标签下载js文件时,可以使用defer或者async来异步加载
14、在事件绑定中,尽可能使用事件委托,减少循环给DOM元素绑定事件处理函数。 15、在js封装过程中,尽量做到低耦合高内聚。减少页面的冗余代码
16、减少Flash的使用

4、存储

1、结合后端,利用浏览器的缓存技术,做一些缓存(让后端返回304,告诉浏览器去本地拉取数据)。(注意:也有弊端)可以让一些不太会改变的静态资源做缓存。比如:一些图片,js,css
2、利用h5的新特性(localStorage、sessionStorage)做一些简单数据的存储,避免向后台请求数据或者说在离线状态下做一些数据展示

5、其他优化

1、避免使用iframe不仅不好管控样式,而且相当于在本页面又嵌套其他页面,消耗性能会更大。因为还回去加载这个嵌套页面的资源
2、页面中的是数据获取采用异步编程和延迟分批加载,使用异步加载是数据主要是为了避免浏览器失去响应。如果你使用同步,加载数据很大并且很慢那么,页面会在一段时间内处于阻塞状态。
目的:为了解决请求数据不耽搁渲染,提高页面的渲染效率。
解决方法:需要动态绑定的是数据区域先隐藏,等数据返回并且绑定后在让其显示延迟分批加载类似图片懒加载。减少第一次页面加载时候的http请求次数
3、页面中出现音视频标签,我们不让页面加载的时候去加载这些资源(否则第一次加载会很慢)
解决方法:只需要将音视频的preload=none即可。
目的:为了等待页面加载完成时,并且音视频要播放的时候去加兹安音视频资源4、尽量将一个动画元素单独设置为一个图层(避免重绘或者回流的大小)
注意:图层不要过多设置,否则不但效果没有达到反而更差了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值