原文javascript
咱们都知道前端性能很重要,并尝试从各个方面优化它,但你是否真的知道你网站的性能瓶颈在哪呢?是你的代码执行效率低下,仍是javascript文件过大,是频繁的Dom操做,仍是缓慢的渲染速度?最重要的是你应该知道从哪些方面提高网站的性能瓶颈,并长期观察对比各个方案的效果。css
代码优化包含两个方面,一是对于JS引擎和浏览器而言,高效率的代码,二是对于不一样构建环境的代码,这部分优化针对不一样的框架而言手段都不尽相同。html
高性能Javascript
一书1、数据存取前端
var global = 0;
function() {
// 在函数内部定义一个变量, 后续直接访问局部变量便可
var temp = global;
temp++;temp--;
console.log(temp);
}
复制代码
location.href
老是比读取window.location.href
要快,对于须要频繁访问的深层对象,须要将其缓存:var name = element.name;
for(var i = 0; i < 10000; i++) {
name += "zhou";
// element.name += "zhou";
}
复制代码
2、DOM编程vue
innerHTML
要比原生DOM方法快,如createElement
。querySelectorAll
查询语句性能高于其它的查询语句,缘由在于querySelect返回的不是动态的HTML集合
离线
DOM树,减小访问DOM布局的次数。3、算法和流程控制java
// 原始版本
for(let i = 0; i < list.length; i++){
fn(list[i]);
}
// 优化版本1, 缓存list.length,由于length值是不变的
for(let i = 0, len = list.length; i < len; i++){
fn(list[i]);
}
// 优化版本2,倒序循环,把i的值做为控制条件,去掉 i < len的比较消耗
for(let i = list.length; i--){
fn(list[i]);
}
复制代码
条件语句react
递归webpack
4、Ajaxcss3
new Image()
,并将其src属性设置为服务器的urlsrc = url + params
,服务器会接受到数据并保存,使用这种方式的消耗是很是小的。5、编程实践web
var a = [], b = {}
,能够在控制台中查看效率动态做用域
问题且性能较低。i % 2 === 1
判断, 这个计算可转换为位运算提高效率: i & 1
1、webpack
2、React
<></>
// 一、使用内联函数
render() {
return (
<div onClick={e => this.handleClick(e)}>test</div>
)
}
// 二、不使用内联函数
render() {
return (
<div onClick={this.handleClick}>test</div>
)
}
复制代码
getDerivedStateFromProps
钩子被设计为static函数的缘由 参考react16的更新。render
方法和子组件的生命周期方法抛出的错误,为应用提供一个错误收集的方式和兜底的设计。3、Vue
Object.freeze()
冻结对象。props: ["status"]
一般,网站的性能指标反应在网站加载时间,和后续交互体验上。网站从加载到用户可交互的时间有多个过程时间和。
用户在访问网站过程当中,会有DNS解析,TCP握手,HTTP资源传输等过程, 针对这些过程优化以下。
DNS预解析,对静态资源域名添加dns-prefetch
dns-prefetch
,可是https域名不会。<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//wddsss.com/a.jpg">
HttpDns防劫持 DNS劫持是运营商的DNS服务在解析后返回了不正确的主机IP,将用户导入到其余网页的现象,可使用HttpDns(某云有提供此服务)。
http://127.0.0.1?domain=https://www.wddsss.com
CDN加速资源传输
慢启动
和流量控制
能够用于避免网络拥塞,2: 设置rwnd
为一合理的值提高最大吞吐量(针对不一样类型的流量,rwnd的值设置应该不尽相同)SSL加速
Http/2优化资源传输
资源压缩
图片优化
资源缓存
script.text = rs.jsContent
,经过此方式添加的js的主要优势是你能够下载js代码但不当即执行。async和defer都能异步下载js文件,作到了js下载的同时不阻塞文档解析,可是async因为其加载完成后当即执行的特性,致使js的执行顺序没法控制,因此实战中推荐使用defer。
const io = new IntersectionObserver(callback);
let imgs = document.querySelectorAll('[data-src]')
imgs.forEach((item)=>{
io.observe(item)
})
function callback(items){
items.forEach(item => {
if(item.isIntersecting){ // 当前元素可见
item.target.src = item.target.dataset.src
io.unobserve(item.target)
}
})
}
复制代码
这里图片的初始src能够设置一个质量很低的图片,以达到图片加载的流畅度。
预加载
preconnet
能够预先创建链接,在须要使用时直接获取资源。<link preconnet href="https://www.wddsss.com/a.js"/>
<link prefetch href="https://www.wddsss.com/a.html" />
css优先下载
骨架屏:骨架屏就是在页面数据还没有加载前先给用户展现出页面的大体结构,经常使用在比较规则的列表页面,能够本身设计也可以使用已有的解决方案。
动画优化
will-change: transform
, will-change: contents
transform
、opacity
等,减小使用box-shadow
等消耗较大的属性动画。布局信息
则会打乱这里过程,迫使浏览器将暂存的全部渲染操做优先执行,而后获取最新的渲染状态,如获取元素的offsetTop、clientTop
等。setInterval
中实现,setInterval中的代码并非严格意义上的定时执行,有可能形成性能问题,requestAnimationFrame则充分利用了屏幕的刷新机制,可使用此API代替setInterval
。服务端渲染
web worker: 使用web woker处理耗时操做,在执行完成后将结果通知主线程便可,web woker优化可让用户的交互及时响应,不至于被耗时的js执行阻止界面渲染。
DOM
CSS
事件
本次的优化指南从代码的执行到网站的加载,从构建的优化到资源传输,罗列了一组优化清单,你能够经过逐条对比的方式找到本身网站的优化空间。因为篇幅问题,其中多数内容都只是总结输出一笔带过,并不涉及具体如何优化细节,能够自行经过本身搜索或超连接阅读。
性能的优化应该始于一个完善的检测系统,而且有健全的度量过程,且必需要清楚,对于网站的一次优化重构,具体带来了怎样的性能提高?整个优化过程最好是一个有计划且有目标的,你须要清楚这次优化的目的,和目标性能的提高,这不是盲目的。
权衡你的站点,权衡时间和收益,首先列出优先级最高的优化清单,而后就去作吧!
最后给你们推荐一网站,热点检索专用,站长高产似那啥,你想看的站点都有。戳我查看