当前位置:首页 > 休闲 > web后端如果从四方面来强化中文网站? 正文

web后端如果从四方面来强化中文网站?

来源:俗下文字网   作者:知识   时间:2025-10-24 13:21:57

不晓得是后化中哪一位薄罗藓的该文,转过身来回答。端果

后端是从方巨大的,主要包括 HTML、面强 CSS、文网 Javascript、后化中Image 、端果Flash等等各种各样的从方天然资源。后端强化是面强复杂的,针对方方面面的文网天然资源都有不同的方式。那么,后化中后端强化的端果目的是什么 ?

  1. 从采用者视角来说,强化能让网页读取得更快、从方对采用者的面强操作积极响应得更及时,能给采用者提供更为友好的文网新体验。

  2. 从服务商视角来说,强化能增加网页允诺数、或是减小允诺所占频宽,能节约可观的天然资源。

  总之,正确的强化不仅能改善公交站点的采用者新体验并且能节约相当的天然资源利用。

  后端强化的有效途径有很多,按粒度大体能分为两类,第三类是网页等级的强化,比如 HTTP允诺数、JAVA的无堵塞读取、内联JAVA的位置强化等 ;第二类则是代码等级的强化,比如 Javascript中的DOM 操作强化、CSS选择符强化、相片强化以及 HTML结构强化等等。除此之外,本着提高其次比的目的,早先提到的各种强化思路大体按照其次比从大到小的顺序排列。

  一、网页级强化

  1. 增加 HTTP允诺数

  这条思路大体上所有后端人都晓得,而且也是最重要最有效的。都说要增加 HTTP允诺,那允诺多了到底会怎么样呢 ?首先,每一允诺都是有生产成本的,既包涵时间生产成本也包涵天然资源生产成本。两个完整的允诺都须要经过 DNS寻址、与伺服器建立连接、发送统计数据、等候伺服器积极响应、接收统计数据这样两个 “漫长” 而复杂的过程。时间生产成本就是采用者须要看到或是 “感受” 到这个天然资源是必须要等候这个过程结束的,天然资源上由于每一允诺都须要携带统计数据,因而每一允诺都须要占用频宽。除此之外,由于应用程序进行mammalian允诺的允诺四元组有上限的 (具体参见该处 ),因而允诺数多了以后,应用程序须要科孔允诺,因而会增加采用者的等候时间,会给采用者造成公交站点速度慢这样两个印象,即使可能采用者能看到的第三屏的天然资源都已经允诺完了,但是应用程序的unlock会一直存在。

  增加 HTTP允诺数的主要有效途径主要包括:

  (1). 从设计实现层面简化网页

  假如你的网页像百度主页那样简单,那么接下来的规则大体上都用不着了。保持网页简洁、增加天然资源的采用时最间接的。假如不是这样,你的网页须要华丽的皮肤,则继续阅读下面的文本。

  (2). 合理增设 HTTP内存

  内存的力量是强大的,正确的内存增设能大大的增加 HTTP允诺。短果啊主页为例,当应用程序没有内存的这时候出访一共会发出 78个允诺,共 600多 K统计数据 (如图 1.1),而当第二次出访即应用程序已内存之后出访则仅有 10个允诺,共 20多 K统计数据 (如图 1.2)。 (这儿须要说明的是,假如间接 F5刷新网页不然效果是不那样的,这种情况下允诺数还是那样,不过被内存天然资源的允诺伺服器是 304积极响应,只有 Header没有Body ,能节约频宽 )

  怎样才算合理增设 ?原则很简单,能内存越多越好,能内存Porcheresse好。比如,很少变化的相片天然资源能间接通过 HTTP Header中的Expires增设两个很长的过期头 ;变化不频繁而又可能会变的天然资源能采用 Last-Modifed来做允诺验证。尽量的让天然资源能在内存中待得更久。有关 HTTP内存的具体增设和原理该处就不再详述了,有兴趣的能参考下列该文:

HTTP1.1协议中有关内存思路的描述Fiddler HTTP Performance中有关内存的介绍

  (3). 天然资源分拆与填充

  假如能不然,尽量的将内部的JAVA、式样进行分拆,多个合为两个。除此之外, CSS、 Javascript、Image 都能用相应的工具进行填充,填充后往往省钱下不少空间。

  (4). CSS Sprites

  分拆 CSS相片,增加允诺数的又两个好办法。

  (5). Inline Images

  采用 data:

URL scheme

的方式将相片内嵌到网页或 CSS中,假如不考虑天然资源管理上的问题不然,不失为两个好办法。假如是内嵌网页不然换来的是增大了网页的体积,而且无法利用应用程序内存。采用在 CSS中的相片则隐脉一些。

  (6). Lazy Load Images(自己对这一块的文本还是不了解)

  这条思路实际上并不一定能增加 HTTP允诺数,但是却能在某些条件下或是网页刚读取时增加 HTTP允诺数。对于相片来说,在网页刚读取的这时候能只读取第三屏,当采用者继续往后滚屏的这时候才读取后续的相片。这样一来,假如采用者只对第三屏的文本感兴趣时,那剩余的相片允诺就都节约了。

有啊主页

曾经的做法是在读取的这时候把第三屏之后的相片地址内存在 Textarea标签中,待采用者往下滚屏的这时候才 “惰性” 读取。

  2. 将内部JAVA置底(将JAVA文本在网页信息文本读取后再读取)

  前文有谈到,应用程序是能mammalian允诺的,这一特点使得其能更快的读取天然资源,然而快照JAVA在读取时却会堵塞其他天然资源,比如在JAVA读取完成之前,它后面的相片、式样以及其他JAVA都处于堵塞状态,直到JAVA读取完成后才会开始读取。假如将JAVA放在比较靠前的位置,则会影响整个网页的读取速度从而影响采用者新体验。解决这一问题的方法有很多,在

这儿有比较详细的介绍

(这儿是译文和

更详细的例子

),而最简单可依赖的方法就是将JAVA尽量的往后挪,增加对mammalian下载的影响。

  3. 异步执行 inlineJAVA(其实原理和上面是那样,保证JAVA在网页文本后面读取。)

  inlineJAVA对性能的影响与内部JAVA相比,是有过之而无不及。主页,与内部JAVA那样, inlineJAVA在执行的这时候那样会堵塞mammalian允诺,除此之外,由于应用程序在网页处理方面是单线程的,当 inlineJAVA在网页渲染之前执行时,网页的渲染工作则会被推迟。简来说之, inlineJAVA在执行的这时候,网页处于空白状态。鉴于以上两点原因,建议将执行时间较长的 inlineJAVA异步执行,异步的方式有很多种,比如采用 script元素的defer 属性(存在兼容性问题和其他一些问题,比如不能采用 document.write)、采用setTimeout ,此外,在HTML5中引入了

Web Workers

的机制,恰恰能解决此类问题。

  4. Lazy Load Javascript(只有在须要读取的这时候读取,在一般情况下并不读取信息文本。)

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

  5. 将 CSS放在 HEAD中

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

  6. 异步允诺 Callback(就是将一些行为式样提取出来,慢慢的读取信息的文本)

  在某些网页中可能存在这样一种需求,须要采用 script标签来异步的允诺统计数据。类似:

  Javascript:

/*Callback 函数*/

function myCallback(info){

//do something here

}

  HTML:

  cb返回的文本 :

myCallback(Hello world!);

像以上这种方式间接在网页上写 <script>对网页的性能也是有影响的,即增加了网页首次读取的负担,推迟了 DOMLoaded和window.onload 事件的触发时机。假如时效性允许不然,能考虑在 DOMLoaded事件触发的这时候读取,或是采用 setTimeout方式来灵活的控制读取的时机。

  7. 增加不必要的 HTTP跳转

  对于以目录形式出访的 HTTP链接,很多人都会忽略链接最后是否带 ’/,假如你的伺服器对此是区别对待不然,那么你也须要注意,这其中很可能隐藏了 301跳转,增加了多余允诺。具体参见下图,其中第三个链接是以无 ’/结尾的方式出访的,于是伺服器有了一次跳转。

  8. 避免重复的天然资源允诺

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

  二、代码级强化

  1. Javascript

  (1). DOM

  DOM操作应该是JAVA中最耗性能的一类操作,比如增加、修改、删除 DOM元素或是对 DOM集合进行操作。假如JAVA中包涵了大量的 DOM操作则须要注意以下几点:

  a. HTML Collection(HTML收集器,返回的是两个数组文本信息)

  在JAVA中 document.images、document.forms 、getElementsByTagName()返回的都是 HTMLCollection类型的集合,在平时采用的这时候大多将它作为数组来采用,因为它有 length属性,也能采用索引出访每两个元素。不过在出访性能上则比数组要差很多,原因是这个集分拆不是两个静态的结果,它表示的仅仅是两个特定的查询,每次出访该集合时都会重新执行这个查询从而更新查询结果。所谓的 “出访集合” 主要包括读取集合的 length属性、出访集合中的元素。

  因而,当你须要遍历 HTML Collection的这时候,尽量将它转为数组后再出访,以提高性能。即使不转换为数组,也请尽量少的出访它,比如在遍历的这时候能将 length属性、成员保存到局部变量后再采用局部变量。

  b. Reflow & Repaint

  除了上面一点之外, DOM操作还须要考虑应用程序的 Reflow和Repaint ,因为这些都是须要消耗天然资源的,具体的能参加以下该文:

如何增加应用程序的repaint和reflow?Understanding Internet Explorer Rendering Behaviour

Notes on HTML Reflow

  (2). 慎用 with

with(obj){ p = 1}; 代码块的行为实际上是修改了代码块中的

执行环境

,将obj放在了其作用域链的最后端,在 with代码块中出访非局部变量是都是先从 obj上开始查找,假如没有再依次按作用域链向上查找,因而采用 with相当于增加了作用域链长度。而每次查找作用域链都是要消耗时间的,过长的作用域链会导致查找性能下降。

  因而,除非你能肯定在 with代码中只出访 obj中的属性,否则慎用 with,替代的能采用局部变量内存须要出访的属性。

  (3). 避免采用 eval和 Function

  每次 eval 或 Function 构造函数作用于字符串表示的源代码时,JAVA引擎都须要将源代码转换成可执行代码。这是很消耗天然资源的操作 —— 通常比简单的函数调用慢 100倍以上。

  eval 函数效率特别低,由于事先无法知晓传给 eval 的字符串中的文本,eval在其上下文中解释要处理的代码,也就是说编译器无法强化上下文,因而只能有应用程序在运行时解释代码。这对性能影响很大。

  Function 构造函数比 eval略好,因为采用此代码不会影响周围代码 ;但其速度仍很慢。

  此外,采用 eval和 Function也不利于Javascript 填充工具执行填充。

  (4). 增加作用域链查找(这方面设计到一些文本的相关问题)

  前文谈到了作用域链查找问题,这一点在循环中是尤其须要注意的问题。假如在循环中须要出访非本作用域下的变量时请在遍历之前用局部变量内存该变量,并在遍历结束后再重写那个变量,这一点对全局变量尤其重要,因为全局变量处于作用域链的最顶端,出访时的查找次四元组最多的。

  低效率的写法:

// 全局变量

var globalVar = 1;

function myCallback(info){

for( var i = 100000; i--;){

//每次出访 globalVar 都须要查找到作用域链最顶端,本例中须要出访 100000 次

globalVar += i;

}

}

  更高效的写法:

// 全局变量

var globalVar = 1;

function myCallback(info){

//局部变量内存全局变量

var localVar = globalVar;

for( var i = 100000; i--;){

//出访局部变量是最快的

localVar += i;

}

//本例中只须要出访 2次全局变量

在函数中只须要将 globalVar中文本的值赋给localVar 中区

globalVar = localVar;

}

  此外,要增加作用域链查找还应该增加闭包的采用。

  (5). 统计数据出访

  Javascript中的统计数据出访主要包括间接量 (字符串、正则表达式 )、变量、对象属性以及数组,其中对间接量和局部变量的出访是最快的,对对象属性以及数组的出访须要更大的开销。当出现以下情况时,建议将统计数据放入局部变量:

  a. 对任何对象属性的出访超过 1次

  b. 对任何数组成员的出访次数超过 1次

  除此之外,还应当尽量的增加对对象以及数组深度查找。

  (6). 字符串拼接

  在 Javascript中采用"+" 号来拼接字符串效率是比较低的,因为每次运行都会开辟新的内存并生成新的字符串变量,然后将拼接结果赋值给新变量。与之相比更为高效的做法是采用数组的 join方法,即将须要拼接的字符串放在数组中最后调用其 join方法得到结果。不过由于采用数组也有一定的开销,因而当须要拼接的字符串较多的这时候能考虑用此方法。

  有关 Javascript强化的更详细介绍请参考:

Write Efficient Javascript(PPT)Efficient JavaScript

  2. CSS选择符

  在大多数人的观念中,都觉得应用程序对 CSS选择符的解析式从左往右进行的,比如

#toc A { color: #444; }

  这样两个选择符,假如是从右往左解析则效率会很高,因为第三个 ID选择大体上就把查找的范围限定了,但实际上应用程序对选择符的解析是从右往左进行的。如上面的选择符,应用程序必须遍历查找每两个 A标签的祖先节点,效率并不像之前想象的那样高。根据应用程序的这一行为特点,在写选择符的这时候须要注意很多事项,有人已经一一列举了,

详情参考该处

  3. HTML

  对 HTML本身的强化现如今也越来越多的受人关注了,详情能参见这篇

总结性该文

  4. Image填充

  相片填充是个技术活,不过现如今这方面的工具也非常多,填充之后往往能带来不错的效果,具体的填充原理以及方法在《 Even Faster Web Sites》第10 章有很详细的介绍,有兴趣的能去看看。

  总结

  本文从网页级以及代码级两个粒度对后端强化的各种方式做了两个总结,这些方法大体上都是后端开发人员在开发的过程中能借鉴和实践的,除此之外,完整的后端强化还应该主要包括很多其他的有效途径,比如 CDN、 Gzip、多域名、无 Cookie伺服器等等,由于对于开发人员的可操作性并不强大,在此也就不多叙述了,详细的能参考 Yahoo和Google 的这些“金科玉律

标签:

责任编辑:百科

全网热点