`

web前端优化之dom篇(转)

 
阅读更多
很多人讨论js一些算法和使用习惯对执行效率的影响。
但是本人认为随着浏览器的优化,单纯js代码本身的优化对这个应用的影响微不足道(因为我们的js代码一般构不成一定的数量级,但是对字符串的操作是一个特例),更多的要考虑的应该是资源文件的大小和对dom操作的优化上。
比起资源下载的耗时和dom的耗时,js执行时间是微乎其微,可优化的空间的很小,js的结构应该是以可读性和可维护行为先,如果为了百分之一秒不到的时间,牺牲了可读性就得不偿失了。

dom操作篇

dom最常见的操作就是创建、添加、查找、和修改(删除)元素,下面就来比较几种添加方式的效率。
先举个例子:
    for(var i=0; i<1000; i++){
        var p = document.createElement("p");
        document.body.appendChild(p);
    }
在ie9下的执行结果20ms,在ff下的执行结果93ms,这难道就是传说中的ie9的神速吗?
不急,接着往下看,把它稍加改造。
    for(var i=0; i<1000; i++){
        var p = document.createElement("p");
        p.innerHTML = "this is p";
        document.body.appendChild(p);
    }
运行结果 ie9 153ms,ff 135ms。
原来页面只append空的p,ie是不进行渲染的,因此是“神速的”。
append一个堆空元素,对我们来说意义不大,下面的例子更符合实际,让我们开始优化之旅。
我还在此实验了把document和body的局部化,但是提升很小,也证明了我开始说明的问题。

优化1,使用DocumentFragment
    var fm = document.createDocumentFragment();
    for(var i=0; i<1000; i++){
        var p = document.createElement("p");
        p.innerHTML = "this is p<br>this is p";
        //p.innerHTML += "<br>this is p";
        fm.appendChild(p);
    }
    document.body.appendChild(fm);
运行结果 ie9 159ms,ff 94ms。
可以看出在ie下并没有减少,但是在ff下的效果还是明显的,因为我们每append一个元素到dom中,页面都会进行一次重绘,而使用 DocumentFragment,我们先将元素都添加到一个临时的dom结构片段中,此时页面并没有变化节约了重绘的时间,然后将整个fragment 一次插入dom中,整个过程只进行了一下重绘。
如果我们要添加的结构只有一个跟节点,可以用这个根节点代替DocumentFragment,直接把所有子节点append到根节点最后后把根节点插入到dom结构中。
如:var rootEl = document.createElement("div");
    ...
    document.body.appendChild(rootEl);
在ff中时间可以减少到43ms

优化2,使用innerHTML
如果不是必需使用到每个节点的引用,我们可以用innerHTML让浏览器自己解析文档结构。
    var rootDiv = document.createElement("div");
    var html = "";
    for(var i=0; i<1000; i++){
        html += "<p>this is p<br>this is p</p>";
    }
    rootDiv.innerHTML = html;
    document.body.appendChild(rootDiv);
运行结果  ie9 21ms,ff 16ms。
果然时间减少了很多,ie9一直居高不下的时间也一下回到了解放前,看来这才是对ie9浏览器的杀手锏。
我对此优化的推断是,直接赋值innerhHTML最大的减少了js引擎和浏览器渲染引擎之间的交互,看来js引擎和浏览器渲染引擎的交互次数才是最大的杀手。
此处还可以用数组来操作字符串的拼接。
    var rootDiv = document.createElement("div");
    var html = [];
    for(var i=0; i<1000; i++){
        html.push("<p>this is p<br>this is p</p>");
    }
    rootDiv.innerHTML = html.join('');
    document.body.appendChild(rootDiv);
ie9的平均时间可以达到17ms,ff没有什么变化,据说部分浏览器在字符串拼接上已经进行了优化,也许ff已经优化过来。
同时也反映了我开始的观点,js本身的操作对性能的影响是很小的。

总结一下dom方面的优化就是,尽量减少页面的重绘次数和js与dom的交互次数。
分享到:
评论

相关推荐

    Web前端优化

    Web前端优化 1. 尽量减少HTTP请求 (Make Fewer HTTP Requests) 2. 减少 DNS 查找 (Reduce DNS Lookups) 3. 避免重定向 (Avoid Redirects) 4. 使得 Ajax 可缓存 (Make Ajax Cacheable) 5. 延迟载入组件 (Post-load ...

    前端性能优化.pptx

    代码级别的优化,例如 Javascript中的DOM 操作优化、CSS选择符优化、图片优化以及 HTML结构优化等等来讲述前端性能优化的多个方式。 目录结构如下: 一、WEB性能优化相关理论 二、前端性能优化的目的 三、前端性能...

    jQery性能优化(前端脚本优化)

    经典总结web前端开发中使用jQuery/js值得注意的一些地方,如DOM操作等额可以显著提升页面加载效率。

    移动WEB前端高级开发项目实战_移动Web常用开发方式_编程案例实例详解课程教程.pdf

    移动Web技术随着设备和网络的优化迭代,包含更多、更复杂的应用功能,不再是大家所认识的简单交互、单纯展示的页面而已。如今移动Web开发者早期基于DOM的开发方式,逐渐向 MVC/MVVM类库框架迁移,比较有代表性的框架有 ...

    DOM性能瓶颈与Javascript性能优化

    DOM性能瓶颈与Javascript性能优化

    web前端react框架

    是前端很火的框架,包含jsx使用规则,严格模式,函数组件,类组件的区别,super是否添加参数问题,setState进行异步修改状态,以及状态提升,类组件生命周期(废弃掉的),组件之间的优化,受控和非受控之间的区别,...

    前端面试常见问题,大厂必备

    一个包含各种前端面试题的文字文件,其中包括了HTML、CSS、JavaScript、jQuery以及其他相关的前端技术的面试题,以及前端开发的基础知识和方法。...文件中还可能会包含关于Web性能优化、安全性、兼容性等方面的问题。

    前端开发面试题.html

    主流MVVM框架(React\Vue\Angular)、Hybrid App\React Native\Weex、TypeScript、RESTFul、WEB安全、前端工程化、依赖管理、性能优化、 重构、团队协作、可维护、易用性、SEO、UED、前端技术选型、快速学习能力等;

    前端开发笔记.docx

    前端开发是指构建和开发Web应用程序的过程,主要涉及创建用户界面、实现交互功能以及优化用户体验。前端开发人员使用各种技术和工具来设计和构建Web页面,使其在不同的设备和浏览器上都能良好运行。 在前端开发的...

    浅谈CSS在前端优化中一些值得注意的关键点

    在Web前端开发中,性能是一个非常重要的需要考虑的点。本文将介绍一些开发原则和性能准则,这些都是提高Web前端性能的基础。 1. 开发原则 1.1 编写符合当代浏览器性能的代码如果想提高前端性能,就必须理解浏览器的...

    探索前端技术:构建现代化网络体验的关键.docx

    渐进式Web应用(PWA):PWA 结合了网页和原生应用的优点,具有离线访问、推送通知等特性,能够提供更接近原生应用的体验,是未来前端开发的趋势之一。 前端框架的流行:诸如React、Vue.js和Angular等前端框架的出现...

    【前端素材】模板-多种实用事件优化.zip

    JavaScript 动画:通过 JavaScript 操作 DOM 元素的样式属性,实现更复杂、交互性更强的动画效果。常见的库包括 jQuery、Anime.js、GreenSock(GSAP)等,它们提供了丰富的动画函数和效果,使动画开发更加高效。 ...

    前端框架、模板和手册

    基本的Web前端开发技术,其中包括:CSS、HTML、SEO、DOM、BOM、Ajax、JavaScript等,以及在不同浏览器上的兼容情况、渲染原理和存在的Bug。 网站性能优化、SEO和服务器端的基础知识。 各种工具进行辅助开发。 技术...

    web性能优化之javascript性能调优

    JavaScript 是一个比较完善的前端开发语言,在现今的 web 开发中应用非常广泛,尤其是对 Web 2.0 的应用。随着 Web 2.0 越来越流行的今天,我们会发现:在我们的 web 应用项目中,会有大量的 JavaScript 代码,并且...

    front-end-notes:前端笔记

    ReactHybrid总结md-4:CSS 必备知识介绍HTML 基础CSS 基础CSS 布局CSS 效果CSS 动画CSS 预处理器BootstrapCSS 工程化框架中的 CSS总结md-5:Web 前端性能优化web 前端性能优化资源的合并与压缩图片相关的优化css 和 ...

    关于编写性能高效的javascript事件的技术

    几年前雅虎里牛逼的前端工程师们出了一本关于提升web前端性能的书籍,轰动了整个web开发技术界,让神秘的web前端优化问题成为了大街的白菜,web前端优化变成了菜鸟和大牛都能回答的简单问题,当整个业界都知道了惊天...

    每个前端工程师都应该懂的前端性能优化总结:

    文章目录采用css雪碧图(css sprite/css图片精灵)技术在项目中,我们最好把css或者js文件进行合并或者压缩,尤其是在移动端开发的时候,如果css或者j s内容不是很多,我们可以采用内嵌式,以此减少http的请求次数,...

    CSS前端页面渲染优化属性will-change的具体使用

    而CSS属性will-change为web开发者提供了一种告知浏览器该元素会有哪些变化的方法,这样浏览器就可以在元素属性真正发生变化之前提前做好对应的优化准备工作。这种优化可以将一部分复杂的计算工作提前准备好,使页

    JS学习资料

    网上有人分享经验,说到学习前端开发技术JavaScript很实用的一些书籍,从入门到高级,一一列举,很不错。整理了一下发上来。 名称: JavaScript+DOM编程艺术.pdf 概述: “本书理应奉为经典。文笔清晰,采用了优秀...

Global site tag (gtag.js) - Google Analytics