浅谈网页基本性能优化规则小结
function updateUI(){ var imgs = document.getElementsByTagName("img"); for (var i=0, len=imgs.length; i < len; i++){ imgs[i].title = document.title + " image " + i; } var msg = document.getElementById("msg"); msg.innerHTML = "Update complete."; } 在上面函数中多次使用到document全局变量,尤其在for循环中。因此将document全局变量存储为局部变量再使用是更优的方案。 function updateUI(){ var doc = document; var imgs = doc.getElementsByTagName("img"); for (var i=0, len=imgs.length; i < len; i++){ imgs[i].title = doc.title + " image " + i; } var msg = doc.getElementById("msg"); msg.innerHTML = "Update complete."; } 值得注意的一点是,在javascript代码中,任何没有使用var声明的变量都会变为全局变量,不正当的使用会带来性能问题。 避免不必要的属性查询 使用变量和数组要比访问对象上的属性更有效率,因为对象必须在原型链中对拥有该名称的属性进行搜索。 // 使用数组 var values = [5, 10]; var sum = values[0] + values[1]; alert(sum); // 使用对象 var values = { first: 5, second: 10}; var sum = values.first + values.second; alert(sum); 上面代码中,使用对象属性来计算。一次两次的属性查找不会造成性能问题,但若需要多次查找,如在循环中,就会影响性能。 在获取单个值的多重属性查找时,如: var query = window.location.href.substring(window.location.href.indexOf("?")); 应该减少不必要的属性查找,将window.location.href缓存为变量。 var url = window.location.href; var query = url.substring(url.indexOf("?")); 函数节流 假设有一个搜索框,给搜索框绑定onkeyup事件,这样每次鼠标抬起都会发送请求。而使用节流函数,能保证用户在输入时的指定时间内的连续多次操作只触发一次请求。 <input type="text" id="input" value=http://www.jb51.net/web/"" /> // 绑定事件 document.getElementById('input').addEventListener('keyup', function() { throttle(search); }, false); // 逻辑函数 function search() { console.log('search...'); } // 节流函数 function throttle(method, context) { clearTimeout(method.tId); method.tId = setTimeout(function() { method.call(context); }, 300); } 节流函数的应用场景不局限搜索框,比如页面的滚动onscroll,拉伸窗口onresize等都应该使用节流函数提升性能。 最小化语句数 语句数量的多少也是影响操作执行速度的因素。 将多个变量声明合并为一个变量声明 // 使用多个var声明 var count = 5; var color = "blue"; var values = [1,2,3]; var now = new Date(); // 改进后 var count = 5, color = "blue", values = [1,2,3], now = new Date(); 改进的版本是只使用一个var声明,由逗号隔开。当变量很多时,只使用一个var声明要比单个var分别声明快很多。 使用数组和对象字面量 使用数组和对象字面量的方式代替逐条语句赋值的方式。 var values = new Array(); values[0] = 123; values[1] = 456; values[2] = 789; // 改进后 var values = [123, 456, 789]; var person = new Object(); person.name = "Jack"; person.age = 28; person.sayName = function(){ alert(this.name); }; // 改进后 var person = { name : "Jack", age : 28, sayName : function(){ alert(this.name); } }; 字符串优化 字符串拼接 早期浏览器未对加号拼接字符串方式优化。由于字符串是不可变的,就意味着要使用中间字符串来存储结果,因此频繁的创建和销毁字符串是导致它效率低下的原因。 var text = "Hello"; text+= " "; text+= "World!"; 把字符串添加到数组中,再调用数组的join方法转成字符串,就避免了使用加法运算符。 var arr = [], i = 0; arr[i++] = "Hello"; arr[i++] = " "; arr[i++] = "World!"; var text = arr.join(''); 现在的浏览器都对字符串加号拼接做了优化,所以在大多数情况下,加法运算符还是首选。 减少回流和重绘 在浏览器渲染过程中,涉及到回流和重绘,这是一个损耗性能的过程,应注意在脚本操作时减少会触发回流和重绘的动作。 回流:元素的几何属性发生了变化,需要重新构建渲染树。渲染树发生变化的过程,就叫回流; 重绘:元素的几何尺寸没有变化,某个元素的CSS样式(背景色或颜色)发生了变化。 触发重排或重绘的操作有哪些? 调整窗口大小 修改字体 增加或者移除样式表 内容变化,比如用户在<input/>框中输入文字 操作class属性 脚本操作DOM(增加、删除或修改DOM元素) 计算offsetWidth和offsetHeight属性 设置style属性的值 如何减少重排和重绘,提升网页性能? 1、脚本操作DOM元素 将DOM元素设置为display:none,设置过程中会触发一次回流,但之后可以随意改动,修改完后再显示; 将元素clone到内存中再进行操作,修改完后重新替换元素。 2、修改元素的样式 尽量批量修改,而不是逐条修改; 预先设定好id、class,再设置元素的className。 3、为元素添加动画时将元素CSS样式设为position:fixed或position:absolute,元素脱离文档流后不会引起回流。 4、在调整窗口大小、输入框输入、页面滚动等场景时使用节流函数(上面已提到过)。 HTTP 浏览器缓存 合理设置浏览器缓存是网页优化的重要手段之一。 Expires 和 Cache-Control Expires出自HTTP1.0,Cache-Control出自HTTP1.1,同时设置两者时,Cache-Control 会覆盖 Expires。 Expires指定的是实际过期日期而不是秒数。但Expires存在一些问题,如服务器时间不同步或不准确。所以最好使用剩余秒数而不是绝对时间来表达过期时间。 Cache-Control可设置max-age值,单位秒,指定缓存过期时间。如:Cache-Control: max-age=3600。 ETag 和 Last-Modified ETag 和 Last-Modified都由服务器返回在response headers中,其中ETag的优先级比Last-Modified高,也就是说服务器会优先判断ETag的值。 (编辑:焦作站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |