前端优化问题详解

一、页面级优化

1. 减少 HTTP请求数

  这条策略基本上所有前端人都知道,而且也是最重要最有效的。都说要减少 HTTP请求,那请求多了到底会怎么样呢 ?首先,每个请求都是有成本的,既包含时间成本也包含资源成本。一个完整的请求都需要经过 DNS寻址、与服务器建立连接、发送数据、等待服务器响应、接收数据这样一个 “漫长” 而复杂的过程。时间成本就是用户需要看到或者 “感受” 到这个资源是必须要等待这个过程结束的,资源上由于每个请求都需要携带数据,因此每个请求都需要占用带宽。另外,·由于浏览器进行并发请求的请求数是有上限的 ,因此请求数多了以后,浏览器需要分批进行请求,因此会增加用户的等待时间,会给用户造成站点速度慢这样一个印象,即使可能用户能看到的第一屏的资源都已经请求完了,但是浏览器的进度条会一直存在。
  
  减少 HTTP请求数的主要途径包括:

  1. 从设计实现层面简化页面
    如果你的页面像百度首页一样简单,那么接下来的规则基本上都用不着了。保持页面简洁、减少资源的使用时最直接的。如果不是这样,你的页面需要华丽的皮肤,则继续阅读下面的内容。

  2. 合理设置 HTTP缓存
    缓存的力量是强大的,恰当的缓存设置可以大大的减少 HTTP请求。以有啊首页为例,当浏览器没有缓存的时候访问一共会发出 78个请求,共 600多 K数据 (如图 1.1),而当第二次访问即浏览器已缓存之后访问则仅有 10个请求,共 20多 K数据 (如图 1.2)。 (这里需要说明的是,如果直接 F5刷新页面的话效果是不一样的,这种情况下请求数还是一样,不过被缓存资源的请求服务器是 304响应,只有 Header没有Body ,可以节省带宽 )

      怎样才算合理设置?原则很简单,能缓存越多越好,能缓存越久越好。例如,很少变化的图片资源可以直接通过 HTTP Header中的Expires设置一个很长的过期头 ;变化不频繁而又可能会变的资源可以使用 Last-Modifed来做请求验证。尽可能的让资源能够在缓存中待得更久。

    • 资源合并与压缩

    如果可以的话,尽可能的将外部的脚本、样式进行合并,多个合为一个。另外, CSS、 Javascript、Image 都可以用相应的工具进行压缩,压缩后往往能省下不少空间。

    • CSS Sprites

    合并 CSS图片,减少请求数的又一个好办法。

    • Lazy Load Images

    这条策略实际上并不一定能减少 HTTP请求数,但是却能在某些条件下或者页面刚加载时减少 HTTP请求数。对于图片而言,在页面刚加载的时候可以只加载第一屏,当用户继续往后滚屏的时候才加载后续的图片。这样一来,假如用户只对第一屏的内容感兴趣时,那剩余的图片请求就都节省了。 有啊首页 曾经的做法是在加载的时候把第一屏之后的图片地址缓存在 Textarea标签中,待用户往下滚屏的时候才 “惰性” 加载

2. 脚本延迟加载

  前文有谈到,浏览器是可以并发请求的,这一特点使得其能够更快的加载资源,然而外链脚本在加载时却会阻塞其他资源,例如在脚本加载完成之前,它后面的图片、样式以及其他脚本都处于阻塞状态,直到脚本加载完成后才会开始加载。如果将脚本放在比较靠前的位置,则会影响整个页面的加载速度从而影响用户体验。解决这一问题的方法有很多。

  1. 将脚本尽可能的往后挪,减少对并发下载的影响。
  2. 使用 script元素的defer 属性(存在兼容性问题和其他一些问题,例如不能使用 document.write)
  3. 使用setTimeout
  4. 在HTML5中引入了 Web Workers的机制,恰恰可以解决此类问题。
  5. Lazy Load Javascript(只有在需要加载的时候加载一般情况下并不加载)

      随着 Javascript框架的流行,越来越多的站点也使用起了框架。不过,一个框架往往包括了很多的功能实现,这些功能并不是每一个页面都需要的,如果下载了不需要的脚本则算得上是一种资源浪费 -既浪费了带宽又浪费了执行花费的时间。目前的做法大概有两种,一种是为那些流量特别大的页面专门定制一个专用的 mini版框架,另一种则是 Lazy Load。YUI 则使用了第二种方式,在 YUI的实现中,最初只加载核心模块,其他模块可以等到需要使用的时候才加载。

3. 将 CSS放在 HEAD中

  如果将 CSS放在其他地方比如 BODY中,则浏览器有可能还未下载和解析到 CSS就已经开始渲染页面了,这就导致页面由无 CSS状态跳转到 CSS状态,用户体验比较糟糕。除此之外,有些浏览器会在 CSS下载完成后才开始渲染页面,如果 CSS放在靠下的位置则会导致浏览器将渲染时间推迟。

4. 异步请求 Callback(就是将一些行为样式提取出来,慢慢的加载信息的内容)

  在某些页面中可能存在这样一种需求,需要使用 script标签来异步的请求数据。类似:

/*Callback 函数*/ 
function myCallback(info){ 
//do something here 
}

像以上这种方式直接在页面上写脚本对页面的性能也是有影响的,即增加了页面首次加载的负担,推迟了 DOMLoaded和window.onload 事件的触发时机。如果时效性允许的话,可以考虑在 DOMLoaded事件触发的时候加载,或者使用 setTimeout方式来灵活的控制加载的时机。

5. 减少不必要的 HTTP跳转

  对于以目录形式访问的 HTTP链接,很多人都会忽略链接最后是否带 ’/‘,假如你的服务器对此是区别对待的话,那么你也需要注意,这其中很可能隐藏了 301跳转,增加了多余请求。其中第一个链接是以无 ’/‘结尾的方式访问的,于是服务器有了一次跳转。

6. 避免重复的资源请求

  这种情况主要是由于疏忽或页面由多个模块拼接而成,然后每个模块中请求了同样的资源时,会导致资源的重复请求

7. 图片设定不响应重绘的尺寸

如果你的图片不设定尺寸、同时外部容器没有定死高宽,则图片在首次载入时候,占据空间会从0到完全出现,左右上下都可能位移,发生大规模的重绘。

二、代码级优化

1. Javascript

详细得补一补

2. CSS选择符

  在大多数人的观念中,都觉得浏览器对 CSS选择符的解析式从左往右进行的,例如

 #toc A { color: #444; }

  这样一个选择符,如果是从左往右解析则效率会很高,因为第一个 ID选择基本上就把查找的范围限定了,但实际上浏览器对选择符的解析是从右往左进行的。如上面的选择符,浏览器必须遍历查找每一个 A标签的祖先节点,效率并不像之前想象的那样高。

待续…
1.如何提高网页的加载速度?
4.一个图片网站该如何优化

实现一个性能优化后的 slider
网站性能优化
移动端性能优化
项目里的各种性能优化

三、其他一些

3.1 DOM操作优化

  1. 优化css样式 (尽量减少重绘
  2. 不要反复使用DOM查询操作,营改用变量缓存
  3. 优化节点添加,创建好了在添加到DOM树中
  4. 多使用ID选择器
  5. 避免大量使用会造成重绘的DOM操作

3.2 AJAX优化

请求小的时候使用GET方式 因为POST请求要发送两个数据包 :先发送文件头然后发送数据 GET类型只发送一个数据包

3.3 cookie优化

  • 减少cookie的大小
  • 使用无cookie的域。
    静态资源放在CDN上,客户端请求静态文件的时候,减少cookie反复传输时对主域名的影响。

3.4 重排或者重绘

重排: 渲染树的一部分必须要更新,并且节点尺寸发生了变化(相当于渲染树要重新进行计算)
重绘: 部分阶段需要更新,但是没有改变它的集合形状,比如改变背景颜色

  1. 增加或者删除DOM节点
  2. 设置display:none(重排并且重绘) , visibility:hidden(重绘)
  3. 移动页面中元素
  4. 增加或者修改样式
  5. 计算offsetWidth和offsetHeight
  6. 改变窗口大小以及滚动页面
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值