前端代码优化(前端代码优化方法有哪些)

今天给各位分享前端代码优化的知识,其中也会对前端代码优化方法有哪些进行解释,如果能碰巧解决你现在面临的问题,可以联系我们!

本文目录一览:

  • 1、前端性能优化有哪些方法
  • 2、前端性能优化总结
  • 3、Web前端性能优化的实用技巧汇总
  • 4、Web前端新手要掌握的性能优化
  • 5、如何对前端性能进行优化
  • 6、如何进行前端优化

前端性能优化有哪些方法

前端性能优化的方法有:

一、减少http请求数

常用的减少http请求数有以下几种:

1、合并图片。当图片较多时,可以合并为一张大图,从而减少http请求数。经常变化的图片可能不太合适,变化相对稳定的就可以考虑。合并大图除了能减少http请求数外,还可以充分利用缓存来提升性能。

2、合并压缩css样式表和js脚本,他们的共同目的都是为了减少http连接数。

3、去掉不必要的请求。开发写代码或者系统升级之后残留的无效请求连接。

4、充分利用缓存。这里说的缓存是客户端侧缓存或者说浏览器缓存。Expires头信息是客户端侧缓存的重要依据,格式类似于Expires:sun ,20 Dec 2024 23:00:00 GMT。

如果当前时间小于Expires指定的时间,浏览器就会从缓存中直接获取相关的数据信息或html文件,如果当前时间大于Expires指定的时间,浏览器会向服务器发送请求来获取相关数据信息。

以Apache为例,可在Apache的配置文件httpd.conf中设置Expires。

二、图片优化

优化方法:

1、尽可能的使用PNG格式的图片,它相对来说体积较小。

2、对于不同格式的图片,在上线之前最好进行一定的优化。

3、图片的延迟加载,也叫做赖加载。

三、使用CDN

CDN即内容分发网络,可以使用户就近取得所需内容,解决网络拥挤的状况,提高用户访问网站的响应速度。

四、开启GZIP

GZIP即数据压缩,用于压缩使用Internet传输的所有文本资源。开启GZIP的方法很简单,到对应的web服务配置文件中设置一下即可。以Apache为例,在配置文件httpd.conf中添加。

五、样式表和JS文件的优化

一般我们会把css样式表文件放到文件的头部。比如,放到<head标签中,这样可以让CSS样式表尽早地完成下载。对应js脚本文件,一般我们把他放到页面的尾部。

六、使用无cookie域名

无cookie域名的概念:当发送一个请求时,同时还要请求一张静态的图片和发送cookie时,服务器对于这些cookie不会做任何使用,也就是说这些cookie没什么用,没不要随请求一同发送。

前端性能优化总结

gzip压缩

gzip压缩效率很高,可以达到70%的压缩率

//npm i -D compression-webpack-plugin 安装插件依赖

configureWebpack: config = {

const CompressionPlugin = require('compression-webpack-plugin')

config.plugins.push(new CompressionPlugin())

}

去掉console.log

生产环境中,不需要打印日志。通过对webpack进行配置,打包时自动去掉console.log

//npm i -D terser-webpack-plugin

configureWebpack:config ={

const TerserPlugin = require('terser-webpack-pulugin')

config.optimzation.minimizer.push(

new TerserPlugin({

extractComments:false,

terserOptions:{compress:{drop_console:true}} //插件配置项 移除console

})

)

}

去除SourceMap

代码压缩后进行调bug定位将非常困难,于是引入sourcemap记录压缩前后的位置信息记录,当产生错误时直接定位到未压缩前的位置,将大大的方便我们调试。

sourcemap附带了很多信息,如果build需要生成sourcemap,将会大大降低build的速度,还会增加包的体积。

//vue 中

module.exports = {

productionSourceMap: false,

}

//react中

//打开webpack.config.prod.js

const shouldUseSourceMap = false

CDN

内容分发网络,它能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。所以可以通过将资源部署在CDN上来提高响应速度,提高用户体验

预渲染

简单来说,就是将浏览器解析JavaScript动态渲染的工作,在打包阶段完成了(只构建了静态数据)。换个说法,在构建过程中,webpack通过使用prerender-spa-plugin插件生成静态结构的html

// 1、安装prerender-spa-plugin

npm install prerender-spa-plugin --save-dev

// 2、安装vue-meta-info

npm install vue-meta-info --save-dev

// 3、相关配置

// 预渲染配置:在webpack.prod.conf文件中加入

const PrerenderSPAPlugin = require('prerender-spa-plugin')

const Renderer = PrerenderSPAPlugin.PuppeteerRenderer

// 在 plugins 中加入

new PrerenderSPAPlugin({

// 生成文件的路径,也可以与webpakc打包的一致。

// 下面这句话非常重要!!!

// 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。

staticDir: path.join(__dirname, '../dist'),

// 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。

routes: ['/', '/first', '/second', '/third', '/fourth', '/userCenter/userFirst','/userCenter/userSecond','/userCenter/userThird'],

// 这个很重要,如果没有配置这段,也不会进行预编译

renderer: new Renderer({

inject: {

foo: 'bar'

},

// headless: false,

renderAfterDocumentEvent: 'render-event', // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。

args: ['--no-sandbox', '--disable-setuid-sandbox']

})

})

// 4、在main.js中

import MetaInfo from 'vue-meta-info'

new Vue({

el: '#app',

router,

components: { App },

template: '',

// 添加mounted,不然不会执行预编译

mounted () {

document.dispatchEvent(new Event('render-event'))

}

})

注意:路由模式必须为 history ,如果不设置 history 模式,也能运行和生成文件,每个 index.html 文件的内容都会是一样的

Service Worker

ServiceWorker 是运行在浏览器后台进程里的一段 JS,它可以做许多事情,比如拦截客户端的请求、向客户端发送消息、向服务器发起请求等等,其中最重要的作用之一就是离线资源缓存。

ServiceWorker 拥有对缓存流程丰富灵活的控制能力,当页面请求到 ServiceWorker 时,ServiceWorker 同时请求缓存和网络,把缓存的内容直接给用户,而后覆盖缓存

注意:需要HTTPS才能使用ServiceWorker

HTTP缓存

HTTP缓存一般分为两类:强缓存(本地缓存)、协商缓存(304缓存)

普通刷新会启用协商缓存

在地址栏输入网址、通过链接引入资源等情况下,浏览器才启用强缓存

强缓存(200)。本地缓存是最快速的一种缓存方式,只要资源还在缓存有效期内,浏览器就会直接在本地读取,不会请求服务端。在chrome控制台的Network选项中可以看到该请求返回200的状态码,并且Size显示from disk cache或from memory cache。强缓存可以通过设置两种 HTTP Header 实现:Expires 和 Cache-Control。

协商缓存(304)。协商缓存,顾名思义是经过浏览器与服务器之间协商过之后,在决定是否读取本地缓存,如果服务器通知浏览器可以读取本地缓存,会返回304状态码,并且协商过程很简单,只会发送头信息,不会发送响应体。

协商缓存可以通过设置两种 HTTP Header 实现:Last-Modified 和 ETag

首先在精确度上,Etag要优于Last-Modified

第二在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值

第三在优先级上,服务器校验优先考虑Etag

缓存优先级:Service Worker - Memory Cache(内存缓存) - Disk Cache(硬盘缓存) - Push Cache(推送缓存)

Push Cache 只在会话(session)中存在,会话结束就被释放,而且缓存时间很短

HTTP2

HTTP2 四个新特性:

多路复用,无需多个TCP连接,因为其允许在单一的HTTP2连接上发起多重请求,因此可以不用依赖建立多个TCP连接。

二进制分帧,将所有要传输的消息采用二进制编码,并且会将信息分割为更小的消息块。

头部压缩,用HPACK技术压缩头部,减小报文大小

服务端推送,服务端可以在客户端发起请求前发送数据,换句话说,服务端可以对客户端的一个请求发送多个相应,并且资源可以正常缓存。

。。。。。。。。。。。。。

作者:MonkeySoft

篇幅有限更多请见扩展链接:

Web前端性能优化的实用技巧汇总

今天小编要跟大家分享的文章是关于Web前端性能优化的实用技巧汇总。javascript在浏览器中运行的性能,可以认为是开发者所面临的最严重的可用性问题。这个问题因为javascript的阻塞性而变得复杂,事实上,多数浏览器使用单一进程来处理用户界面和js脚本执行,所以同一时刻只能做一件事。js执行过程耗时越久,浏览器等待响应的时间越长。

一.提高加载性能

1.IE8,FF,3.5,Safari4和Chrome都允许并行下载js文件,当script下载资源时不会阻塞其他script的下载。但是js下载仍然会阻塞其他资源的下载,如图片。尽管脚本下载不会互相影响,但页面仍然必须等待所有js代码下载并执行完才能继续。因此仍然存在脚本阻塞问题.推荐将所有js文件放在body标签底部以减少对整个页面的影响。

2.减少页面外链脚本文件的数量将会提高页面性能:

http请求会带来额外的开销,因此下载单个300k的文件将比下载10个30k的文件效率更高。

3.动态脚本加载技术:

无论何时启动下载,文件的下载和执行都不会阻塞页面其他进程。

functionlaodScript(url,callback){

varscript=document.createElement('script');_

_cript.type='text/javascript';

__f(script.readyState){//ie

____cript.onreadystatechange=function(){_____

if(script.readyState=='loaded'||script.readyState=='complete'){_______

_cript.onreadystatechange=null;_______

callback()_____

____

__

}else{//其他浏览器___

script.onload=function(){_____

_allback()

___}_

}_

script.src=url;_

document.getElementsByTagName('head')[0].appendChild(script);

}

//使用

loadScript('./a.js',function(){_

loadScript('./b.js',function(){___

loadScript('./c.js',function(){_____

console.log('加载完成')___

})_

})

})

4.无阻塞加载类库——LABjs,使用方法如下:

//链式调用时文件逐个下载,.wait()用来指定文件下载并执行完毕后所调用的函数

$LAB.script('./a.js')_

.script('./b.js')_

.wait(function(){__

_pp.init();

})

//为了保证执行顺序,可以这么做,此时a必定在b前执行

$LAB.script('./a.js').wait()_

.script('./b.js')_

.wait(function(){___

_pp.init();

})

二.数据存取与JS性能

1.在js中,数据存储的位置会对代码整体性能产生重大影响。数据存储共有4种方式:字面量,变量,数组项,对象成员。他们有着各自的性能特点。

2.访问字面量和局部变量的速度最快,相反,访问数组和对象相对较慢

3.由于局部变量存在于作用域链的起始位置,因此访问局部变量的比访问跨域作用变量更快

4.嵌套的对象成员会明显影响性能,应尽量避免

5.属性和方法在原型链位置越深,访问他的速度越慢

6.通常我们可以把需要多次使用的对象成员,数组元素,跨域变量保存在局部变量中来改善js性能

三.DOM编程

1.访问DOM会影响浏览器性能,修改DOM则更耗费性能,因为他会导致浏览器重新计算页面的几何变化。

注:如过在一个对性能要求比较高的操作中更新一段HTML,推荐使用innerHTML,因为它在绝大多数浏览器中运行的都很快。但对于大多数日常操作而言,并没有太大区别,所以你更应该根据可读性,稳定性,团队习惯,代码风格来综合决定使用innerHTML还是createElement()

2.HTML集合优化

HTML集合包含了DOM节点引用的类数组对象,一直与文档保持连接,每次你需要最新的信息时,都会重复执行查询操作,哪怕只是获取集合里元素的个数。

①_优化一——集合转数组collToArr

functioncollToArr(coll){_

for(vari=0,a=[],len=coll.length;i

a._ush(coll[i]);

__

returna

}

②缓存集合length

③访问集合元素时使用局部变量(即将重复的集合访问缓存到局部变量中,用局部变量来操作)

3.遍历DOM

①使用只返回元素节点的API遍历DOM,因为这些API的执行效率比自己实现的效率更高:

td{border:1pxsolid#ccc;padding:5px;margin:auto;}

tdp{text-align:left;}

tdpspan{text-align:center;display:block;}

属性名

被替代属性

children

childNodes

childElementCount

childNodes.length

firstElementChild

firstChild

lastElementChild

lastChild

nextElementSibling

nextSibling

previousElementSibling

previousSibling

_谘≡衿_PI——querySelectorAll()

querySelectorAll()方法使用css选择器作为参数并返回一个NodeList——包含着匹配节点的类数组对象,该方法不会返回HTML集合,因此返回的节点不会对应实时文档结构,着也避免了HTML集合引起的性能问题。

let_rr=_ocument.querySelectorAll('div.warning,_iv.notice_')

4.重绘和重排

浏览器在下载完页面的所有组件——html,js,css,图片等之后,会解析并生成两个内部数据结构——_OM树,渲染树.一旦DOM树和渲染树构建完成,浏览器就开始绘制页面元素(paint).

①重排发生的条件:

添加或删除可见的DOM元素位置变化元素尺寸改变内容改变页面渲染器初始化浏览器窗口尺寸变化出现滚动条时会触发整个页面的重排_嘏疟囟ㄖ鼗

5.渲染树变化的排列和刷新

大多数浏览器通过队列化修改并批量执行来优化重排过程,然而获取布局信息的操作会导致队列强制刷新。

offsetTop,offsetWidth...

scrollTop,scrollHeight...

clientTop,clientHeight...

getComputedStyle()

一些优化建议:将设置样式的操作和获取样式的操作分开:

//设置样式

body.style.color='red';

body.style.fontSize='24px'

//读取样式

letcolor=body.style.color

let_ontSize=_ody.style.fontSize

另外,获取计算属性的兼容写法:

functiongetComputedStyle(el){_

varcomputed=(document.body.currentStyle?el.currentStyle:document.defaultView.getComputedStyle(el,'');_

returncomputed

}

6.最小化重绘和重排

①.批量改变样式

/*使用cssText

*/el.style.cssText='border-left:1px;_order-right:2px;_adding:20px';

②.批量修改dom的优化方案——使元素脱离文档流-对其应用多重改变-把元素带回文档

functionappendDataToEl(option){

vartargetEl=option.target||document.body,___

createEl,___

data=option.data||[];_//让容器脱离文档流,减少重绘重排_

vartargetEl_display=targetEl.style.display;_

targetEl.style.display='none';

_

//*****创建文档片段来优化Dom操作****_

varfragment=document.createDocumentFragment();_//给元素填充数据_

for(vari=0,max=data.length;i

createEl=

document.createElement(option.createEl);___

for(varitemindata[i]){_____

if(item.toString()==='text'){_______

createEl.appendChild(document.createTextNode(data[i][item]));________ontinue;___________

_f(item.toString()==='html'){_______

createEl.innerHTML=item,data[i][item];_______

continue;_____

}_____

_reateEl.setAttribute(item,data[i][item]);_______

//****将填充好的node插入文档片段****___

fragment.appendChild(createEl);___

//****将文档片段统一插入目标容器****_

targetEl.appendChild(fragment);_

//显示容器,完成数据填充_

targetEl.style.display=

targetEl_display;

}

//使用

varwrap=document.querySelectorAll('.wrap')[0];

vardata=[_

_name:'xujaing',text:'选景',title:'xuanfij'},_

{name:'xujaing',text:'选景',title:'xuanfij'},_

{name:'xujaing',text:'选景',title:'xuanfij'}];

appendDataToEl({_

target:wrap,_

createEl:'div',

_ata:data

});

上面的优化方法使用了文档片段:_蔽颐前盐牡灯尾迦氲浇诘阒惺保导噬媳惶砑拥闹皇歉闷蔚淖咏诘悖皇瞧伪旧怼?梢允沟_om操作更有效率。

②.缓存布局信息

//缓存布局信息

letcurrent=el.offsetLeft;

current++;

el.style.left=current+'px';

if(current300){_

stop();

}

④.慎用:hover

如果有大量元素使用:hover,那么会降低相应速度,CPU升高

⑤.使用事件委托(通过事件冒泡实现)来减少事件处理器的数量,减少内存和处理时间

functiondelegation(e,selector,callback){_

e=e||window.event;_

vartarget=e.target||e.srcElement;

_if(target.nodeName!==selector||

target.className!==selector||target.id!==selector){___

return;

_}_

if(typeofe.preventDefault==='function'){__

_.preventDefault();___

e.stopPropagation();

}else{___

e.returnValue=false;

e.cancelBubble=true;_

}

__allback()}

四.算法和流程控制

1.循环中减少属性查找并反转(可以提升50%-60%的性能)

//for循环

for(vari=item.length;i--){_

process(item[i]);

}

//while循环

varj=item.length;

while(j--){_

process(item[i]);

}

2.使用Duff装置来优化循环(该方法在后面的文章中会详细介绍)

3.基于函数的迭代(比基于循环的迭代慢)

items.forEach(function(value,index,array){__rocess(value);})

4.通常情况下switch总比if-else快,但是不是最佳方案

五.字符串和正则表达式

1.除了IE外,其他浏览器会尝试为表达式左侧的字符串分配更多的内存,然后简单的将第二个字符串拷贝到他的末尾,如果在一个循环中,基础字符串位于最左侧,就可以避免重复拷贝一个逐渐变大的基础字符串。2.使用[sS]来匹配任意字符串3.去除尾部空白的常用做法:

if(!String.prototype.trim){_

String.prototype.trim=function(){___

returnthis.replace(/^s+/,'').replace(/ss*$/,'')_

}

}

六.快速响应的用户界面

1.浏览器的UI线程:用于执行javascript和更新用户界面的进程。

2.在windows系统中定时器分辨率为15毫秒,因此设置小于15毫秒将会使IE锁定,延时的最小值建议为25ms.

3.用延时数组分割耗时任务:

functionmultistep(steps,args,callback){_

vartasks=steps.concat();

__etTimeout(function(){___

vartask=tasks.shift();___

task.apply(null,args||[]);_//调用Apply参数必须是数组

___

if(tasks.length0){_____

setTimeout(arguments.callee,25);

___else{_____

_allback();___

__

},25);

}

4.记录代码运行时间批处理任务:

functiontimeProcessArray(items,process,callback){_

vartodo=item.concat();

__etTimeout(function(){___

varstart=+newDate();

__o{_____

_rocess(todo.shift());___

}while(todo.length0(+newDate()-start____f(todo.length0){_____

_etTimeout(arguments.callee,25);

___else{____

_allback(items);_

}_

_,25)

}

5.使用WebWorker:它引入了一个接口,能使代码运行且不占用浏览器UI线程的时间。一个Worker由如下部分组成:

①一个navigator对象,包括app


Web前端新手要掌握的性能优化

今天小编要跟大家分享的文章是关于Web前端新手要掌握的性能优化知识。本文将分享一些前端性能优化的常用手段,包括减少请求次数、减小资源大小、各种缓存、预处理和长连接机制,以及代码方面的性能优化等方面。下面来和小编一起看一看吧!

base64:尤其是在移动端,小图标可以base64(webpack),大图片慎用(如果加载速度过于慢的,而且很重要的图片,可以用base64)

1、减少HTTP的请求次数和传输报文的大小

「CSSSprite(雪碧图、图片精灵)技术」

使用字体图标(IconFont)或者SVG等矢量图

+减少HTTP请求次数或者减少请求内容的大小

+渲染更快:因为它们是基于代码渲染的,而对于位图(png/jpg/gif)是需要先把图片编码在渲染

+不容易是帧变形

+也可以使用webp格式图片,这种格式要小一些(但是需要服务器端支持这种格式的请求处理)

「图片懒加载(延迟加载)技术」

+第一次加载页面的时候不去请求真实的图片,提高第一次渲染页面的速度,请求图片的额外消耗尽可能不要处理

+当页面加载完,把出现在用户视野区域中的图片做真实加载,没有出现的先不加载(节约流浪,也能减少对服务器的请求压力)

o对于数据我们也尽可能分批加载(不要一次请求过多的数据,例如分页技术)

音视频文件取消预加载(preload='none'),这样可以增加第一次渲染页面的速度,当需要播放的时候在加载

客户端和服务器端的数据传输尽可能基于JSON格式完成,XML格式比JSON格式要大一些(还可以基于二进制编码或者文件流格式,这种格式比文件传输好很多)

「把页面的css/js等文件进行合并压缩」

合并:争取css和js都只导入一个(webpack可以实现并合并压缩哦)

压缩:基于webpack可以压缩,对于图片自己找工具先压缩,可以使用服务器的GZIP压缩

图片BASE64(用BASE64码代表图片,减少HTTP,增加浏览器渲染速度,所以真是项目中,尤其是移动端,如果图片加载缓慢,BASE64一下就好了,;但是base64会导致文件中心的代码超级恶心,不利于维护和开发,所以减少使用);webpack中科院配置图片

2、设置各种缓存、预处理和长连接机制

不经常更改的静态资源做缓存处理(一般做的是304或者ETAG等协商缓存)

「建立Cache-Control和ExpiresHTTP的强缓存」

DNS缓存或者预处理(DNSPrefetch),减少DNS的查找

设置本地的离线存储(manifest)或者把一些不经常更改的数据做本地临时存储(webstorage,indexdb)等

有钱就做CDN(地域分布式服务器),或者加服务器

「建立Connection:keep-aliveTcp长连接」

使用HTTP2版本协议(现在用的一般都是http1.1),可以多条tcp通道共存=管道化链接

一个项目分为不同的域(不同的服务器),例如:资源web服务器、数据服务器,图片服务器,视频服务器等,合理利用服务器资源,但是导致过多的DNS解析

Cache-Control的优先级高于Expires

基于本地存储,做数据的存储

3、代码方面的性能优化

减少对闭包的使用(因为过多使用闭包会产生很多不销毁的内存,处理不好的话,会导致内存溢出“栈溢出”),减少闭包的嵌套(减少作用域链的查找层级)

对于动画来说:能用css解决的不用js(能够用transform处理的,不用传统的css样式,因为transform开启硬件加速,不会引发回流,或者使用定位的元素也会好很多,因为定位的元素脱离文档流,不会对其他元素的位置造成影响),能用

requestAnimationFrame解决的不用定时器

+用requestAnimationFrame还有一个好处,当页面处于休眠无访问状态,动画会自己暂停,知道回复访问才开始,而定时器是不论什么状态,只要页面不管,就一直处理

避免使用iframe(因为iframe会嵌入其他页面,这样父页面渲染的时候,还要同时把子页面也渲染了,渲染进度会变慢)

减少直接对DOM的操作(原因是减少DOM的回流和重绘...),当代项目基本基于mvvm,mvc数据驱动视图渲染的,对DOM的操作框架本身完成,性能要好很多

低耦合高内聚(基于封装的方式:方法封装,插件,组件,框架,类库等封装,减少页面中的冗余代码,提高代码使用率)

尽可能使用事件委托

避免出现死循环或者嵌套循环(嵌套循环会成倍增加循环的次数)

项目中尽可能使用异步编程来模拟出多线程的效果,避免主线程阻塞(异步操作基于Promise设计模式来管理)

JS中不要使用with

避免使用css表达式

函数的防抖和节流

减少使用eval(主要原因是防止压缩代码的时候,由于符号书写不合规,导致代码混乱)

图片地图:对于多次调取使用的图片(尤其是背景图),尽可能把它提取成为公共的样式,而不是每一次重新设置background

减少filter滤镜的使用

尽可能减少选择器的层级

尽可能减少table布局

手动回收堆栈内存(赋值为null)

「栈溢出:死递」

functionfunc(){

func();

}func();

解决方案:

functionfunc(){

setTimeout(func,0);

}func();

相互引用:引用类型之间的相互调用,形成嵌套式内存

letobj1={

name:'obj1',};

letobj2={

name:'obj2',

x:obj1}

obj1.x=obj2;

以上就是小编今天为大家分享的关于Web前端新手要掌握的性能优化知识的文章,希望本篇文章能够对正在从事web前端工作的小伙伴们有所帮助,想要了解更多web前端知识记得关注北大青鸟web培训官网,最后祝愿小伙伴们工作顺利,成为一名优秀的web前端工程师

如何对前端性能进行优化

前端开发代码优化、可维护性、浏览器兼容性是非常重要的课题。从实际的工程应用角度出发,最常遇见的前端优化问题。前端性能进行优化规则,基本可以涵盖现在前端大部分的性能优化原则了,很多更加geek和精细优化方法都是从这些原则里面延伸出来的。

前端性能进行优化都有哪些规则

减少HTTP请求次数

尽量合并图片、CSS、JS。比如加载一个页面有5个css文件的话,把这个5个文件合成一个的话,就只需要发出一次http请求,节省网络请求时间,加快页面的加载。

2. 使用CDN

网站上静态资源即css、js全都使用cdn分发,包括图片

3. 避免空的src和href

当link标签的href属性为空、script标签的src属性为空的时候,浏览器渲染的时候会把当前页面的URL作为它们的属性值,从而把页面的内容加载进来作为它们的值。所以要避免犯这样的疏忽。

4. 为文件头指定Expires

Exipres是用来设置文件的过期时间的,一般对css、js、图片资源有效。 他可以使内容具有缓存性,这样下回再访问同样的资源时就通过浏览器缓存区读取,不需要再发出http请求。如下例子:

新浪微博的这个css文件的Expires时间是2024-5-04 09:14:14.

5. 使用gzip压缩内容

gzip能够压缩任何一个文本类型的响应,包括html,xml,json。大大缩小请求返回的数据量。

6. 把CSS放到顶部

网页上的资源加载时从上网下顺序加载的,所以css放在页面的顶部能够优先渲染页面,让用户感觉页面加载很快。

7. 把JS放到底部

加载js时会对后续的资源造成阻塞,必须得等js加载完才去加载后续的文件 ,所以就把js放在页面底部最后加载。

8. 避免使用CSS表达式

举个css表达式的例子

font-color: expression( (new Date()).getHours()%3 ? “#FFFFFF" : “#AAAAAA" );

这个表达式会持续的在页面上计算样式,影响页面的性能。并且css表达式只被IE支持。

9. 将CSS和JS放到外部文件中

目的是缓存文件,可以参考原则4。 但有时候为了减少请求,也会直接写到页面里,需根据PV和IP的比例权衡。

10. 权衡DNS查找次数

减少主机名可以节省响应时间。但同时,需要注意,减少主机会减少页面中并行下载的数量。

IE浏览器在同一时刻只能从同一域名下载两个文件。当在一个页面显示多张图片时,IE 用户的图片下载速度就会受到影响。所以新浪会搞N个二级域名来放图片。

下面是新浪微博的图片域名,我们可以看到他有多个域名,这样可以保证这些不同域名能够同时去下载图片,而不用排队。不过如果当使用的域名过多时,响应时间就会慢,因为不用响应域名时间不一致。

11. 精简CSS和JS

这里就涉及到css和js的压缩了。比如下面的新浪的一个css文件,把空格回车全部去掉,减少文件的大小。现在的压缩工具有很多,基本主流的前端构建工具都能进行css和js文件的压缩,如grunt,glup等。

12. 避免跳转

有种现象会比较坑爹,看起来没什么差别,其实多次了一次页面跳转。比如当URL本该有斜杠(/)却被忽略掉时。例如,当我们要访问 http:// baidu.com 时,实际上返回的是一个包含301代码的跳转,它指向的是 http:// baidu.com/ (注意末尾的斜杠)。在nginx服务器可以使用rewrite;Apache服务器中可以使用Alias 或者 mod_rewrite或者the DirectorySlash来避免。

另一种是不用域名之间的跳转, 比如访问 http:// baidu.com/bbs 跳转到 http:// bbs.baidu.com/ 。那么可以通过使用Alias或者mod_rewirte建立CNAME(保存一个域名和另外一个域名之间关系的DNS记录)来替代。

13. 删除重复的JS和CSS

重复调用脚本,除了增加额外的HTTP请求外,多次运算也会浪费时间。在IE和Firefox中不管脚本是否可缓存,它们都存在重复运算JavaScript的问题。

14. 配置ETags

它用来判断浏览器缓存里的元素是否和原来服务器上的一致。比last-modified date更具有弹性,例如某个文件在1秒内修改了10次,Etag可以综合Inode(文件的索引节点(inode)数),MTime(修改时间)和Size来精准的进行判断,避开UNIX记录MTime只能精确到秒的问题。 服务器集群使用,可取后两个参数。使用ETags减少Web应用带宽和负载

15. 可缓存的AJAX

异步请求同样的造成用户等待,所以使用ajax请求时,要主动告诉浏览器如果该请求有缓存就去请求缓存内容。如下代码片段, cache:true就是显式的要求如果当前请求有缓存的话,直接使用缓存

$.ajax({      url : 'url',      dataType : "json",      cache: true,      success : function(son, status){                  }

16. 使用GET来完成AJAX请求

当使用XMLHttpRequest时,浏览器中的POST方法是一个“两步走”的过程:首先发送文件头,然后才发送数据。因此使用GET获取数据时更加有意义。

17. 减少DOM元素数量

这是一门大学问,这里可以引申出一堆优化的细节。想要具体研究的可以看后面推荐书籍。总之大原则减少DOM数量,就会减少浏览器的解析负担。

18. 避免404

比如外链的css、js文件出现问题返回404时,会破坏浏览器的并行加载。

19. 减少Cookie的大小

Cookie里面别塞那么多东西,因为每个请求都得带着他跑。

20. 使用无cookie的域

比如CSS、js、图片等,客户端请求静态文件的时候,减少了 Cookie 的反复传输对主域名的影响。

21. 不要使用滤镜

IE独有属性AlphaImageLoader用于修正7.0以下版本中显示PNG图片的半透明效果。这个滤镜的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。在每一个元素(不仅仅是图片)它都会运算一次,增加了内存开支,因此它的问题是多方面的。

完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替,这种格式能在IE中很好地工作。如果你确实需要使用AlphaImageLoader,请使用下划线_filter又使之对IE7以上版本的用户无效。

22. 不要在HTML中缩放图片

比如你需要的图片尺寸是50* 50

那就不用用一张500*500的大尺寸图片,影响加载

23. 缩小favicon.ico并缓存

如何进行前端优化

1.减少 HTTP 请求....

2.使用 HTTP2

3.使用服务端渲染

4.静态资源使用 CDN

5.将 CSS 放在文件头部,JavaScript 文件放 ...

6.使用字体图标 iconfont 代替图片图标

7.善用缓存,不重复加载相同的资源

8.压缩文件

9.图片优化

(1).图片延迟加载

(2). 响应式图片

(3). 调整图片大小

(4). 降低图片质量

(5). 尽可能利用 CSS3 效果代替图片

(6). 使用 webp 格式的图片

10. 通过 webpack 按需加载代码,提取第三库代码,减少 ES6 转为 ES5 的冗余代码

11. 减少重绘重排

12. 使用事件委托

13. 注意程序的局部性

14. if-else 对比 switch

15. 查找表

16. 避免页面卡顿

17. 使用 requestAnimationFrame 来实现视觉变化

18. 使用 Web Workers

19. 使用位操作

20. 不要覆盖原生方法

21. 降低 CSS 选择器的复杂性

(1). 浏览器读取选择器,遵循的原则是从选择器的右边到左边读取。

(2). CSS 选择器优先级

22. 使用 flexbox 而不是较早的布局模型

23. 使用 transform 和 opacity 属性更改来实现动画

24. 合理使用规则,避免过度优化

性能优化主要分为两类:

加载时优化

运行时优化

关于前端代码优化和前端代码优化方法有哪些账户介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得关注我们官网。

上一篇 2022-12-06 00:35:05
下一篇 2022-12-06 00:37:05

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注