Ⅰ 我们还能在哪些方面进行webpack性能优化
Bigo前端组计算平台前端组基于amis框架,参考之前的文章:https%3A%2F%2Fgithub.com%2Fbigo-frontend%2Fblog%2Fissues%2F17 ;有很好的研发效率提升,但是构建速度却很慢,亟需进行优化。优化之后达到了将webpack构建速度提升80%左右的一个成绩,以下是优化前后的对比
团队做了3件事情来达到这凯腊样的一个效果:
基于这次优化做了功课,看了一些资料,看看还有哪些可以优化的地方。
官网的定义:
webpack is a static mole bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph which maps every mole your project needs and generates one or more bundles.
也就是说 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具,从入口出发,找到入口文件所有的依赖,生成浏览器可以用的bundle文件。webpack的出现使得前端的工程化更加地丰富。从webpack在2013的第一次release(v1.0.0-beta2)开始,至今已经有8、9年的 历史 了,是一个相当成熟的工具,其生态也比较完善,所以前端圈用webpack也是铅差非常地广泛。
尽量用较新的版本,新版本相较之前都会有一定的性能提升和优化,包括Node和Webpack。要注意的是 Node.js v8.9.10 - v9.11.1 ES6的 Set 和 Map 会有性能回退问题,现在LTS的node已经是 v14.16.0 ,所以假设 Node 版本已经较新,并且用的是 WP4 ( webpack4 )。目前还不建议对求稳的或者已经很庞大的项目立即升级到 WP5 ,其一是因为webpack生态里面并不一定所有的插件都能跟的上最新的版本,可能会出现兼容性的问题;其二由于webpack5还并未被广泛地应用,到新版本的稳定和成熟还是需要一定的时间,为避免不必要的bug,建议暂时使用 webpack4 。
对于开发者来说,每次在build的时候不希望花费较长的时间,优化构建速度能够减少开发成本;对于用户而言,优化bundle文件的数量和大小能减少用户的流失率,提升用户体验。所以webpack的性能优化是一个非常关键的技术手段。
webpack构建大概可分为 loader解析 -> 依赖搜索 -> 打包 等三个阶段,就这三个阶段我们分别展开阐述如何去优化。
loader解析:
依赖搜索:
打包: Smaller = Faster
当然需要在 index.html 里面引入cdn依赖,否则在runtime无法找到相应的模块: 。
开发环境* *:** 同样地,生产环境有些配置也不适用于开发环境,比如 TerserPlugin 就不需要,因为在开发环境中压缩代码是没有意义的;devTools的最佳实践是 eval-cheap-mole-source-map ,我现在的项目比较轻量,但是也能看出对比:
虽然是不到1000ms的差距,苍蝇肉也是肉不是?而且将来代码量越来越庞大的时候,差距就更明显了。
当然还有其他的可以优化的方法,比如使用ES mole,能更好地利用webpack的tree shaking功能;Dll,为更改不频繁的代码生成单独的编译结果,但却是一个配置比较复杂的过程;还有对图片的压缩等等。以上是对于webpack4性能优化基本的配置,期待webpack5成熟稳定的那槐孙皮一天。
Ⅱ 网站性能优化有哪些
一、提高服务器并发处理能力
我们总是希望一台服务器在单位时间内能处理的请求越多越好,这也成了web服务器的能力高低的关键所在。服务器之所以可以同时处理多个请求,在于操作系统通过多执行流体系设计,使得多个任务可以轮流使用系统资源,这些资源包括CPU、内存以及I/O等。这就需要选择一个合适的并发策略来合理利用这些资源,从而提高服务器的并发处理能力。这些并发策略更多的应用在apache、nginx、lighttpd等底层web server软件中。
二、Web组件分离
这里所说的web组件是指web服务器提供的所有基于URL访问的资源,包括动态内容,静态网页,图片,样式表,脚本,视频等等。这些资源在文件大小,文件数量,内容更新频率,预计并发用户数,是否需要脚本解释器等方面有着很大的差异,对不同特性资源采用能充分发挥其潜力的优化策略,能极大的提高web站点的性能。例如:将图片部署在独立的服务器上并为其分配独立的新域名,对静态网页使用epoll模型可以在大并发数情况下吞吐率保持稳定。
三、数据库性能优化和扩展。
Web服务器软件在数据库方面做的优化主要是减少访问数据库的次数,具体做法就是使用各种缓存方法。也可以从数据库本身入手提高其查询性能,这涉及到数据库性能优化方面的知识本文不作讨论。另外也可以通过主从复制,读写分离,使用反向代理,写操作分离等方式来扩展数据库规模,提升数据库服务能力。
四、Web负载均衡及相关技术
负载均衡是web站点规模水平扩展的一种手段,实现负载均衡的方法有好几种包括基于HTTP重定向的负载均衡,DNS负载均衡,反向代理负载均衡,四层负载均衡等等。
对这些负载均衡方法做简单的介绍:基于HTTP重定向的负载均衡利用了HTTP重定向的请求转移和自动跳转功能来实现负载均衡,我们熟悉的镜像下载就使用这种负载均衡。DNS负载均衡是指在一个DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时返回不同的解析结果将客户端的访问引到不同的机器上,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。反向代理负载均衡也叫七层负载均衡,这是因为反向代理服务器工作在TCP七层结构的第七层(应用层),它通过检查流经的HTTP报头,根据报头内的信息来执行负载均衡任务。四层负载均衡是基于NAT技术的负载均衡,它将一个Internet上合法注册的IP地址映射为多个内部服务器的IP地址,对每次TCP连接请求动态使用其中一个内部IP地址,达到负载均衡的目的。此外,还有工作在数据链路层(第二层)的直接路由方式下的负载均衡,它通过修改数据包目标MAC地址来实现。以及,基于IP隧道的负载均衡,在这种方式下可以将实际服务器根据需要部署在不同的地域,并根据就近访问的原则来转移请求,CDN服务便是基于IP隧道技术来实现的。
Web负载均衡在扩展web服务器规模的同时也给web站点性能优化提供了一个更大更复杂也更灵活自由的平台,基于该平台性能优化的策略包括共享文件系统,内容分发与同步,分布式文件系统,分布式计算,分布式缓存等等。
五、web缓存技术
web缓存技术被认为是减轻服务器负载、降低网络拥塞、增强万维网可扩展性的有效途径,其基本思想是利用客户访问的时间局部性(Temporal Locality)原理,将客户访问过的内容在Cache中存放一个副本,当该内容下次被访问时,不必连接到驻留网站或重新计算生成,而是由Cache中保留的副本提供。Web缓存可以带来如下的好处:
(1) 减少网络流量,从而减轻网络拥塞;这是因为缓存避免了一部分HTTP请求。
(2) 降低客户访问延迟,其主要原因有:①已缓存的内容,客户可以缓存获取而不是从服务器获取或重新计算生成,从而减小了传输延迟缩短了响应时间;②没有被缓存的内容由于网络拥塞及服务器负载的减轻而可以较快地被客户获取;
(3) 由于客户的部分或者全部请求内容可以从通过缓存获取,从而减轻了远程服务器负载。
(4) 如果由于服务器故障或网络故障造成服务器无法响应客户请求,客户可以从缓存中获取缓存的内容副本,使得web站点服务的鲁棒性(Robustness)得到了加强。
可以看出web缓存能给web站点带可观的性能提升。其实在用户发出请求到一幅完整的网页呈现在用户面前这一过程中缓存无处不在,下面是web性能优化时常用的缓存技术,你会发现缓存被广泛应用在各个环节。
浏览器缓存:浏览器一般会在用户文件系统中创建一个目录,用于存放缓存文件,并给每个缓存文件打上必要的标记,比如过期时间等。这些标记主要用于浏览器和服务器之间的缓存协商。
Web服务器缓存:一个URL在一段较长时间内对应一个唯一的响应内容,比如静态内容或者更新不太频繁的动态内容,web服务器可将响应内容缓存起来,下次web服务器便可以在收到请求后立即拿出事先缓存好的响应内容并返回给浏览器。
代理服务器缓存:暴露在互联网中与后端的web服务器通过内部网络相连的前端服务器称为反向代理服务器,建立在反向代理服务器上的缓存称为反向代理缓存。暴露在互联网中与后端的web客户端通过内部网络相连的前端服务器称为正向代理服务器,建立在正向代理服务器上的缓存称为正向代理缓存。代理服务器缓存位于客户端和web服务器之间,可以将它看做二者之间的一个中继站。它的存在可以改善客户端的访问速度、提升web server的服务能力、安全性等等。
总共分析总结了五种技术,主要希望能够对web server性能优化这块提供一个整体的认识。后续会专门就web缓存技术发表一些自己的看法。
Ⅲ java web性能优化有哪些
最常见的优化方案:代码优化最简单的就是提高代码的重用性,不管是前端代码还是后端代码,学会把公共性的代码抽取出来,事物的控制,特别是当对数据库进行增加删除修改的时候,保持数据的一致性,数据库的话加索引,视图等等,sql语句关联的时候注意尽量用高效的sql语句。一般的优化差不多就是这样,当然,更多的要更难了。
Ⅳ 高性能Web站点的优化招数
1.这里的吞吐率特指Web服务器单位时间内处理的请求。
2.压力测试的前提:1>并发用户数 2>总请求数 3>请求资源描述
3.用户平均请求等待时间主要用户衡量服务器在一定并发用户数的情况下,对于单个用户的服务器质量;而服务器平均请求处理时间与前者相比,则用于衡量服务器的整体服务质量,它其实就是吞吐率的倒数。
4.对http header中标记为Connection: Keep-Alive的请求,开启web服务器的长连接支持。减少系统调用accept的次数,即减少建立连接的开销。
5.老调重弹,进程,内核级线程和用户级线程在不同情况下的优劣。IO模型,mmap(内村映射),直接IO,例如sendfile syscall以及异步IO等。多路IO复用(select, poll,epoll and kqueue etc)
6.服务器并发策略
1> 一个进程处理一个连接,非阻塞IO。稳定性强,但context switch的开销随http request递增而快速增长。
2> 一个内核级线程处理一个连接,非阻塞IO,多进程多线程混合方式。Context switch的问题依然存在。理论上可以支持更多的并发连接。
3>一个进程处理多个连接,非阻塞IO。(氏派epoll, kqueue)lighttpd, nginx。支持并发性能强劲。 上述情况的适用范围不能一刀切,而且这里都是指单机并发,需根据实际情况(实际并发数)来选择。通常,在并发用户数较大的情况下,Web服务器使用什么样的并发策略,是影响最大并发数的关键。 在实际应用中,动态内容缓存可能是使用得最多的技术,但是并不见得所有的动态内容都适合使用网页缓存,缓存带来的性能提升恰恰与有些动态数据实时交互的需求形成矛盾,这就是一个权衡。
1. 缓存动态生成的html代码。
2. 把动态内容静态化,直接缓存整个html文件。这样就可以直接访问缓存。这时的更新策略:
1>在数据更新时重新生成静态化内容 2>定时重新生成静态化内容
3. 使用SSI(server side include)进行局部静态化。但web server的SSI功能会对静态文件的吞吐率有负面影响。 减少http请求,充分利用浏览器的缓存。而webapp通过http协议(更具体位置就是http header)来与浏览器协商,那些东东浏览器可以使用其缓存即可。
1. Last-Modified/If-Modified-Since
2. ETag/If-None-Match
3.Expires + Cache-Control: max-age=<seconds>
1和2需要浏览器和webserver交互后,有服务器端通知浏览器是否使链扰用浏览器缓存,而3则是在过期前直接使用浏览器缓存,这样就直接kill掉了http request。同时还需注意,在使用SSI的内容中,由于整个歼唤贺页面是服务器动态生成的,所以Last-Modified标记在不同的Web服务器中有不同的生成方法。 Web服务器隐藏在代理服务器之后。这种代理机制称为反向代理(Reverse proxy),同时,实现这种机制的服务器便成为反向代理服务器。隐藏在反向代理服务器之后的Web服务器,我们习惯称它为后端服务器(Back-end server),当然,反向代理服务器就被称为前端服务器(Front-end server)。
引入反向代理服务器的目的之一就是基于缓存的加速。我们可以将内容缓存在反向代理服务器上,所有缓存机制的实现仍然采用HTTP/1.1协议。
缓存命中率和后端吞吐率的理想技术模型
缓存丢失率=(活跃内容数/(实际吞吐率×平均缓存有效期))×100%
缓存命中率= 1-缓存丢失率 后端吞吐率= 活跃内容数/平均缓存有效期
缓存命中率= (1-(后端吞吐率/实际吞吐率))×100%
后端吞吐率 = (1 – 缓存命中率)×实际吞吐率
结论: 1. 活跃内容数和平均缓存有效期一定的情况下,缓存命中率与实际吞吐率成正比。
2. 实际吞吐率和平均缓存有效期一定的情况下,缓存命中率与活跃内容数成反比。
3. 活跃内容数和实际吞吐率一定的情况下,缓存命中率与平均缓存有效期成正比。
4. 活跃内容数一定的情况下,后端吞吐率与平均缓存有效期成反比。
5. 平均缓存有效期一定的情况下,后端吞吐率与活跃内容数成正比。
6. 缓存命中率的变化不一定会影响后端吞吐率。
7. 后端吞吐率的变化不一定会影响缓存命中率。
ESI – Edge Side Include类似与SSI,但不在webserver端组装内容,而是在http代理服务器上组装内容,包括反向代理。在处理只有局部更新动态内容时AJAX是更好的原则,它不依赖与底层webserver的实现,但ESI的优势在于再有多个后端服务器的情况下,变可以避免多个后端的重复组装,减少总工作量。 从以下几个方面来看Web组件的差异:
1. 文件大小
2. 文件数量
3. 内容更新频率
4. 预计并发用户数
5. 是否需要脚本解释器
6. 是否涉及大量CPU计算
7. 是否访问数据库
8. 访问数据库的主要操作是读还是写
9. 是否包含RPC
对每种类型的Web组件采取不同的优化方式(一种或多种):
1. 是否使用epoll模型
2. 是否使用sendfile() syscall
3. 是否使用异步IO
4. 是否支持HTTP持久连接(http keep-alive)
5. 是否需要opcode缓存
6. 是否使用动态内容缓存以及有效期为多长
7. 是否使用Web服务器缓存以及有效期为多长
8. 是否使用浏览器缓存以及有效期为多长
9. 是否使用反向代理缓存以及有效期为多长
10. 是否使用负载均衡策略
按照Web组件的不同类型将其放在不同的二级域名/机器/不同类型的WebServer
同时,还需考虑到不同的浏览器对同一个域名下的访问有多大并发数限制,而使用多个域名。
IE6,7 2(http/1.1)
IE8 6(http/1.1)
Firefox2 2(http/1.1)
Firefox3 6(http/1.1)
发挥各自的潜力
对于动态内容:开启opcode缓存,使用足够快的CPU,足够大的内存,多进程以及与数据库保持高速连接
对于静态内容:支持epoll,非阻塞IO,异步IO,使用sendfile,单进程(对于IO密集型任务,多进程无法发挥优势),使用高速磁盘,使用RAID
对于image, css and script分配合理设置其过期时间(expires) 1.合理的执行计划,包括合理使用索引
2.使用慢查询分析工具,找出执行很慢的sql并优化之。
3.合理的数据库缓存,索引缓存,数据缓存等
4.更具实际需求选择合理的数据库引擎或数据库
5.反范式化设计,对查询带来优化,但增加写和更新的工作量。
6.放弃关系型数据库,针对实际情况,读写要求极高时 数据库扩展: 读写分离,按业务实施合理的垂直分区,对热点表进行水平分区。 DNS负载均衡
需要DNS服务商提供该功能,且DNS记录存在缓存,无法及时修改,带来更新延迟。
反向代理负载均衡
HTTP重定向和DNS解析在请求的调度上体现在“转发”上,而其则体现在“转移”。
任何对于实际服务器的http请求都必须经过调度器;调度器必须等待实际服务器的http响应,并将它反馈给用户。
由于调度策略在自己手中,就可以使用诸如按照权重进行调度等策略。也可以对个应用服务器进行健康监控,对无效服务器不在把请求转移给它;还可以实现sticky sessions。
作为负载均衡调度器的反向代理服务器在扩展上的制约,反向代理服务器的处理能力制约了整个集群的处理能力,其次,容易出现单点故障
IP负载均衡
Netfilter+ IPVS
用iptables修改Netfilter规则,进行基于IP的tcp包转发,也即调度。 IPVS(IP Virtual Server)也成为LVS(Linux Virtual Server)。
两者结合的具体策略有 1. LVS + NAT
2. LVS + DR
Ⅳ web后端性能调优主要优化哪些东西
尽量简洁的页面设计,最大程度减少图片的使用,通过放弃一些不必要的页面特效来减少javascript的使用。
- 使用一些优化技巧,比如利用图片的背景位移减少图片的个数;image map技术;使用Inline images将css图片捆绑到网页中。
- 尽量合并js和css文件,减少独立文件个数。
Ⅵ 如何优化Web网站性能
这个问题不难!是优化网站性能,不是提高用户体验,那么能增加资金预算的话,硬件方面提高配置,比如用更快的CPU,加大内存,使用高速硬盘,增加带宽等等。
软件方面,对程序代码和数据库进行优化,网站页面生成静态页,减少对数据库和服务器的压力,使用存储过程等等。
Ⅶ web前端面试经常问到的面试题有哪些
Web前端经常被问到的面试题及答案
一、HTML+CSS
1.对WEB标准以及W3C的理解与认识
标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、使用外
链css和js脚本、结构行为表现的分离、文件下载与页面速度更快、内容能被更多的用户所访问、内容能被更广泛的设备所访问、更少的代码和组件,容易维
护、改版方便,不需要变动页面内容、提供打印版本而不需要复制内容、提高网站易用性;
2.xhtml和html有什么区别
HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言
最主要的不同:
XHTML 元素必须被正确地嵌套。
XHTML 元素必须被关闭。
标签名必须用小写字母。
XHTML 文档必须拥有根元素。
3.Doctype? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
用于声明文档使用那种规范(html/Xhtml)一般为 严格 过度 基于框架的html文档
加入XMl声明可触发,解析方式更改为IE5.5 拥有IE5.5的bug
4.行内元素有哪些?块级元素有哪些?CSS的盒模型?
块级元素:div p h1 h2 h3 h4 form ul
行内元素: a b br i span input select
Css盒模型:内容,border ,margin,padding
5.CSS引入的方式有哪些? link和@import的区别是?
内联 内嵌 外链 导入
区别 :同时加载
前者无兼容性,后者CSS2.1以下浏览器不支持
Link 支持使用javascript改变样式,后者不可
6.CSS选择符有哪些?哪些属性可以继承?优先级算法如何计算?内联和important哪个优先级高?
标签选择符 类选择符 id选择符
继承不如指定 Id>class>标签选择
后者优先级高
7.前端页面有哪三层构成,分别是什么?作用是什么?
结构层 Html 表示层 CSS 行为层 js
8.css的基本语句构成是?
选择器{属性1:值1;属性2:值2;……}
9.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?
Ie(Ie内核) 火狐(Gecko) 谷歌(webkit) opear(Presto)
二、Javascript
1.javascript的typeof返回哪些数据类型
Object number function boolean underfind
2.例举3种强制类型转换和2种隐式类型转换?
强制(parseInt,parseFloat,number)
隐式(== – ===)
3.split() join() 的区别
前者是切割成数组的形式,后者是将数组转换成字符串
4.数组方法pop() push() unshift() shift()
Push()尾部添加 pop()尾部删除
Unshift()头部添加 shift()头部删除
5.事件绑定和普通事件有什么区别
6.IE和DOM事件流的区别
1.执行顺序不一样、
2.参数不一样
3.事件加不加on
4.this指向问题
7.IE和标准下有哪些兼容性的写法
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target
8.ajax请求的时候get 和post方式的区别
一个在url后面 一个放在虚拟载体里面
有大小限制
安全问题
应用不同 一个是论坛等只需要请求的,一个是类似修改密码的
9.call和apply的区别
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
10.ajax请求时,如何解释json数据
使用eval parse 鉴于安全性考虑 使用parse更靠谱
11.b继承a的方法
12.写一个获取非行间样式的函数
function getStyle(obj,attr,value)
{
if(!value)
{
if(obj.currentStyle)
{
return obj.currentStyle(attr)
}
else
{
obj.getComputedStyle(attr,false)
}
}
else
{
obj.style[attr]=value
}
}
Ⅷ 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则更耗费性能,因为他会导致浏览器重新计算页面的几何变化。<通常的做法是减少访问DOM的次数,把运算尽量留在JS这一端。
注团御:如过在一个对性能要求比较高的操作中更新一段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;}
td>p{text-align:left;}
td>pspan{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=པpx'
//读取样式
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(current>300){_
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.length>0){_____
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.length>0&&(+newDate()-start<50));
____f(todo.length>0){_____
_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前端工程师。
Ⅹ web性能优化有哪些
常用的优化有两部谨物镇分
第祥粗一:面向内容的优化
1. 减少 HTTP 请求
2. 减少 DNS 查找
3. 避免重定向
4. 使用 Ajax 缓存
5. 延迟载入组件
6. 预先载入组件
7. 减少 DOM 元素数量
8. 切分组件到多个域
9. 最小化 iframe 的数量
10. 不要出现http 404 错误
第二:面向 Server
1. 缩小 Cookie
2. 针对 Web 组件使用域名无蚂消关性的