前端性能优化问题汇总

 一、压缩、合并文件

l  压缩文件 -> 减少HTTP请求大小,可以减少请求时间;

l  文件合并 -> 减少HTTP请求数量。
 

1、使用在线网站进行压缩

2、使用 html-minifier、uglifyjs2 等工具对html/js文件内容进行压缩

3、对大文件启用gzip压缩:

Ø  安装依赖:npm install compression-webpack-plugin;

Ø  vue.config.js文件配置:

new CompressionWebpackPlugin({
   filename: '[path].gz[query]',  // 目标文件名
   algorithm: 'gzip', // 使用gzip压缩
   test: new RegExp(
     '\\.(js|css)$' // 压缩 js 与 css
   ),
   threshold: 10240,// 资源文件大于10240B=10kB时会被压缩
   minRatio: 0.8 // 最小压缩比达到0.8时才会被压缩
}),

Ø  Nginx配置:

gzip_static on;

4、JS/CSS文件合并
 

二、HTML优化

减少 DOM 元素数量和深度。语义化标签,避免乱嵌套,合理命名属性,使用高效简洁的css选择器等等。HTML 中标签元素越多,标签的层级越深,浏览器解析 DOM 并绘制到浏览器中所花的时间就越长,所以应尽可能保持 DOM 元素简洁和层级较少

三、JS和CSS优化

JS和CSS尽量写在单独的文件中,引用外部资源可以有效利用浏览器的静态资源缓存,如果写在HTML中的话,只要地址不同浏览器就会认为是不同的网址,所以每次都需要重新加载这些JS和CSS。但有时候在移动端页面 CSS 或 JavaScript 比较简单的情况下为了减少请求,也会将 CSS 或 JavaScript 直接写到 HTML 里面,具体要根据 CSS 或 JavaScript 文件的大小和业务的场景来分析。(如果 CSS 或 JavaScript 文件内容较多,业务逻辑较复杂,建议放到外部文件引入。)

1、JS优化

l  减少重绘和回流;(减少DOM操作次数)

l  JS文件放置在文件底部;(JS 加载和执行会阻塞 HTML 解析)

l  上线后屏蔽一切日志代码,console.log对性能的影响还是比较大的;

2、CSS优化

l  减少内联样式的使用(style);

l  css文件放在head中;

l  尽可能多的合并类似样式。(比如:如果2个class里面分别定义了10个CSS属性,其中只有1个不一样,那么就可以把这9个一样的拿出来写一个样式;)

l  合并一些分开写的样式。(比如:border-width、border-style、border-color合并成border;)

l  根据实际环境删除一些不必要的兼容性代码。(比如:如果你的项目只运行在移动端,那么诸如IE系列所有适配代码、-moz、-o等等这些玩意儿就不需要写了。)

l  CSS选择器优化:

u  尽量减少标签选择器的使用;

u  尽量少使用id选择器,多使用样式类选择器(通用性比较强)

u  减少选择器前面的前缀(选择器是从右向左查找的,前缀多,查询的时间多)

3、尽量使用css动画来代替js动画

css3的动画或者变形,性能比js动画,JS 直接操作 DOM 极容易引起页面的重排(transform 和 opacity 属性)

4、布局模型推荐使用flexbox,不滥用 float 

在 DOM 渲染树生成后的布局渲染阶段,使用 float 的元素布局计算比较耗性能,所以尽量减少 float 的使用。推荐使用固定布局或 flex-box 弹性布局的方式来实现页面元素布局,对于相同数量的元素和相同的视觉外观,布局的时间要少得多,性能比较好。(注:flexbox的兼容性还是有点问题,不是所有浏览器都支持它,所以要谨慎使用)

四、图片优化

1、尽量采用svg图片或者字体图标:

因为字体图标或者SVG是矢量图,代码编写出来的,放大不会失真,而且渲染速度快。字体图标使用时就跟字体一样,可以设置属性,例如 font-size、color 等等,非常方便,还有一个优点是生成的文件特别小。

2、图片压缩,降低图片质量

例如 JPG 格式的图片,100% 的质量和 90% 质量的通常看不出来区别,尤其是用来当背景图的时候。

3、大的背景图可采用图片切分

将过大的背景图切分成多张小图,通过html的方式拼到一起。利用浏览器的并发加载。

4、图片懒加载

在一些图片密集型的网站中运用较多,通过图片懒加载可以让一些不可视的图片不去加载,避免一次性加载过多的图片导致请求阻塞(浏览器一般对同一域名下的并发请求的连接数有限制),这样就可以提高网站的加载速度,提高用户体验。
 

<img data-src="test.jpg" >
等页面可见时,使用 JS 加载图片:
const img = document.querySelector('img');
img.src = img.getAttribute("data-src");

五、cookie优化

减小cookie体积。因为每次http请求都会携带当前path下所有的cookie发送到服务端,cookie太多无形中会造成一定的带宽浪费;

六、其他编码层面:

1、避免页面中空的 href 和 src

当 <link>标签的 href 属性为空,或 <script>、 <img>、 <iframe>标签的 src 属性为空时,浏览器在渲染的过程中仍会将 href 属性或 src 属性中的空内容进行加载,直至加载失败,这样就阻塞了页面中其他资源的下载进程,而且最终加载到的内容是无效的,因此要尽量避免。

<!--不推荐-->

<img src="" alt="photo" >

<a href="">点击链接</a>

2、switch语句相对if较快

当判断条件数量越来越多时,越倾向于使用 switch 而不是 if-else。通过将case语句按照最可能到最不可能的顺序进行组织。

3、keep-alive

vue2.0提供了一个keep-alive组件,用来缓存组件,避免多次加载相应的组件,减少性能消耗,但keep-alive是一把双刃剑,确实需要缓存组件的时候才使用。

4、v-show,v-if使用场景

只要涉及到权限相关的展示无疑要用 v-if;

在没有权限限制时根据用户点击的频次选择,频繁切换的使用 v-show,不频繁切换的使用 v-if(减少页面中 dom 数量)

5、减少页面重定向

页面每次重定向都会延长页面内容返回的等待延时,一次重定向大约需要 200 毫秒不等的时间开销(无缓存),为了保证用户尽快看到页面内容,要尽量避免页面重定向。

6、巧用||和&&布尔运算符

function eventHandler(e) { if (!e) e = window.event; } 
//可以替换为: function eventHandler(e) { e = e || window.event; }  if (myobj) { doSomething(myobj); } 
//可以替换为: myobj && doSomething(myobj); 

7、避免全局查找

在一个函数中会用到全局对象存储为局部变量来减少全局查找,因为访问局部变量的速度要比访问全局变量的速度更快些

function search() {  //当我要使用当前页面地址和主机域名 alert(window.location.href + window.location.host); 
//最好的方式是如下这样 先用一个简单变量保存起来 
function search() {  
var location = window.location; 
alert(location.href + location.host); 
} 

8、提取公共代码

多次使用到的公共代码进行提取,打包成公共模块。如果项目中没有去将每个页面的第三方库和公共模块提取出来,则项目会存在以下问题:

l  相同的资源被重复加载,浪费用户的流量和服务器的成本。

l  每个页面需要加载的资源太大,导致网页首屏加载缓慢,影响用户体验。

七、如何让用户感觉很快

顾名思义,并没有实际上的提升速度,而是优化了用户体验,我们可以采用骨架屏、懒加载、合理loading,防抖、节流(减少不必要的请求)等方式让用户的等待变得舒服。

事件的节流与防抖:都以闭包的形式存在,它们通过对事件对应的回调函数进行包裹、以自由变量的形式缓存时间信息,最后用 setTimeout 来控制事件的触发频率;

节流:只触发第一次,并在计时结束时给予响应;

防抖:只触发最后一次;

八、查找性能瓶颈

使用 Chrome 开发者工具:

l  Network:页面中各种资源请求的情况,这里能看到资源的名称、状态、使用的协议、资源类型、资源大小、资源时间线等情况。

l  Performance面板:可以录制一段时间内的 js 执行细节及时间,能看到白屏时间、FPS、资源加载时间线、内存变化曲线等信息,分析页面性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值