`
qinya06
  • 浏览: 595446 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

减少 JavaScript 对性能的影响

 
阅读更多
减少 JavaScript 对性能的影响有以下几种方法:

1.将所有的<script>标签放到页面底部,也就是</body>闭合标签之前,这能确保在脚本执行前页面已经完成了渲染。
2.尽可能地合并脚本。页面中的<script>标签越少,加载也就越快,响应也越迅速。无论是外链脚本还是内嵌脚本都是如此。
3.采用无阻塞下载 JavaScript 脚本的方法:

4.使用动态创建的<script>元素来下载并执行代码;
5.使用 XHR 对象下载 JavaScript 代码并注入页面中。


---------------------------------------------------------
动态脚本元素
文档对象模型(DOM)允许您使用 JavaScript 动态创建 HTML 的几乎全部文档内容。<script>元素与页面其他元素一样,可以非常容易地通过标准 DOM 函数创建:

通过标准 DOM 函数创建<script>元素
var script = document.createElement ("script");
   script.type = "text/javascript";
   script.src = "script1.js";
   document.getElementsByTagName("head")[0].appendChild(script);

新的<script>元素加载 script1.js 源文件。此文件当元素添加到页面之后立刻开始下载。此技术的重点在于:无论在何处启动下载,文件的下载和运行都不会阻塞其他页面处理过程。您甚至可以将这些代码放在<head>部分而不会对其余部分的页面代码造成影响(除了用于下载文件的 HTTP 连接)。

当文件使用动态脚本节点下载时,返回的代码通常立即执行(除了 Firefox 和 Opera,他们将等待此前的所有动态脚本节点执行完毕)。当脚本是“自运行”类型时,这一机制运行正常,但是如果脚本只包含供页面其他脚本调用调用的接口,则会带来问题。这种情况下,您需要跟踪脚本下载完成并是否准备妥善。可以使用动态 <script> 节点发出事件得到相关信息。

Firefox、Opera, Chorme 和 Safari 3+会在<script>节点接收完成之后发出一个 onload 事件。您可以监听这一事件,以得到脚本准备好的通知:

通过监听 onload 事件加载 JavaScript 脚本
var xhr = new XMLHttpRequest();
xhr.open("get", "script1.js", true);
xhr.onreadystatechange = function(){
    if (xhr.readyState == 4){
        if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
            var script = document.createElement ("script");
            script.type = "text/javascript";
            script.text = xhr.responseText;
            document.body.appendChild(script);
        }
    }
};
xhr.send(null);

var script = document.createElement ("script")
script.type = "text/javascript";
//Firefox, Opera, Chrome, Safari 3+
script.onload = function(){
    alert("Script loaded!");
};
script.src = "script1.js";
document.getElementsByTagName("head")[0].appendChild(script);

Internet Explorer 支持另一种实现方式,它发出一个 readystatechange 事件。<script>元素有一个readyState 属性,它的值随着下载外部文件的过程而改变。readyState 有五种取值:
“uninitialized”:默认状态
“loading”:下载开始
“loaded”:下载完成
“interactive”:下载完成但尚不可用
“complete”:所有数据已经准备好

大多数情况下,您希望调用一个函数就可以实现JavaScript文件的动态加载。下面的函数封装了标准实现和 IE 实现所需的功能:

通过函数进行封装
function loadScript(url, callback){
    var script = document.createElement ("script")
    script.type = "text/javascript";
    if (script.readyState){ //IE
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" || script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else { //Others
        script.onload = function(){
            callback();
        };
    }
    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

您可以在页面中动态加载很多 JavaScript 文件,但要注意,浏览器不保证文件加载的顺序。所有主流浏览器之中,只有 Firefox 和 Opera 保证脚本按照您指定的顺序执行。其他浏览器将按照服务器返回它们的次序下载并运行不同的代码文件。您可以将下载操作串联在一起以保证他们的次序,如下:
loadScript("script1.js", function(){
    loadScript("script2.js", function(){
        loadScript("script3.js", function(){
            alert("All files are loaded!");
        });
    });
});


-------------------------------------------
使用XMLHttpRequest(XHR)对象

此技术首先创建一个 XHR 对象,然后下载 JavaScript 文件,接着用一个动态 <script> 元素将 JavaScript 代码注入页面。清单 12 是一个简单的例子:

通过 XHR 对象加载 JavaScript 脚本

var xhr = new XMLHttpRequest();
xhr.open("get", "script1.js", true);
xhr.onreadystatechange = function(){
    if (xhr.readyState == 4){
        if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
            var script = document.createElement ("script");
            script.type = "text/javascript";
            script.text = xhr.responseText;
            document.body.appendChild(script);
        }
    }
};
xhr.send(null);

此代码向服务器发送一个获取 script1.js 文件的 GET 请求。onreadystatechange 事件处理函数检查readyState 是不是 4,然后检查 HTTP 状态码是不是有效(2XX 表示有效的回应,304 表示一个缓存响应)。如果收到了一个有效的响应,那么就创建一个新的<script>元素,将它的文本属性设置为从服务器接收到的 responseText 字符串。这样做实际上会创建一个带有内联代码的<script>元素。一旦新<script>元素被添加到文档,代码将被执行,并准备使用。

这种方法的主要优点是,您可以下载不立即执行的 JavaScript 代码。由于代码返回在<script>标签之外(换句话说不受<script>标签约束),它下载后不会自动执行,这使得您可以推迟执行,直到一切都准备好了。另一个优点是,同样的代码在所有现代浏览器中都不会引发异常。

此方法最主要的限制是:JavaScript 文件必须与页面放置在同一个域内,不能从 CDN 下载(CDN 指”内容投递网络(Content Delivery Network)”,所以大型网页通常不采用 XHR 脚本注入技术。
分享到:
评论

相关推荐

    高性能JavaScript 2015

    这本书面向的是中级到高级的JavaScript开发者,旨在帮助他们理解并掌握提升JavaScript性能的关键技术与策略。 在JavaScript的世界里,性能是至关重要的,尤其在现代Web应用程序变得越来越复杂的情况下。本书涵盖了...

    JavaScript语言精粹(高清电子版)和高性能JavaScript 双语版

    本文将深入探讨标题和描述中提及的两本书籍《JavaScript语言精粹》和《高性能JavaScript》所涵盖的知识点。 首先,我们来关注《JavaScript语言精粹》。这本书主要侧重于JavaScript的核心概念和最佳实践,旨在帮助...

    High Performance JavaScript(高性能Javascript编程) 【中英文对版】

    2. **DOM操作优化**:JavaScript与DOM交互是Web开发中的常见任务,书里会介绍如何高效地选择、修改和操作DOM元素,减少DOM操作带来的性能开销。 3. **事件处理**:讨论如何正确使用事件监听器,避免事件冒泡和捕获...

    高性能JavaScript PDF

    **高性能JavaScript PDF**是关于利用JavaScript技术来优化和提升PDF文档处理性能的专业资源。JavaScript作为Web开发中的主要脚本语言,被广泛应用于交互式网页和动态应用。在PDF领域,JavaScript可以用来增强文档的...

    Javascript 性能优化的一点技巧

    ### JavaScript性能优化技巧详解 #### 引言 随着Web应用的日益复杂,JavaScript作为前端开发的核心语言之一,其运行效率直接影响着用户体验与整体性能。因此,掌握一定的JavaScript性能优化技巧对于提升应用程序...

    《高性能JavaScript》(尼古拉斯·泽卡斯).pdf

    总而言之,《高性能JavaScript》是一本全面讲解JavaScript性能优化的指南,无论你是初学者还是经验丰富的开发者,都能从中获益。通过学习书中的理论知识和实践技巧,你可以编写出运行更快、更稳定的JavaScript程序。

    JavaScript性能优化的小知识总结共23页.pdf

    3. **减少DOM操作**:DOM操作是JavaScript性能的瓶颈,尽量避免频繁修改DOM,可以使用文档碎片(DocumentFragment)或批量操作来提升性能。 4. **事件委托(Event Delegation)**:通过在父元素上绑定事件,利用...

    《高性能JavaScript编程》.Nicholas.C.Zakas著.英文版

    6. **JavaScript性能分析**:Zakas教授了如何使用开发者工具进行性能分析,识别性能瓶颈,并提供了改善代码性能的技巧,如避免阻塞渲染、减少HTTP请求等。 7. **JavaScript错误处理**:书中讨论了如何有效地捕获和...

    《高性能 JavaScript》

    在浏览器中的JavaScript性能无疑是开发者面临的关键可用性问题。由于JavaScript的阻塞性质,在执行JavaScript代码时,其他任何操作都无法进行。实际上,大多数浏览器都使用单一进程来处理用户界面(UI)更新和...

    高性能JavaScript.pdf

    - **JavaScript执行机制**:浏览器中的JavaScript执行过程及其对网页渲染的影响。 - **单进程模型**:大多数现代浏览器使用单一进程来处理用户界面更新和JavaScript执行,这意味着在任意时刻只能进行其中一种操作。 ...

    高性能JavaScript

    总的来说,《高性能JavaScript》是一本全面且深入的JavaScript性能优化指南,它不仅教会你如何写出高效的代码,还会引导你掌握分析和调试性能问题的技能。对于希望提升Web应用性能的前端开发者来说,这是一本不可或...

    [高性能JavaScript编程].(High.Performance.JavaScript).Nicholas.C.Zakas.文字版

    公司的高级前端工程师,他在书中分享了大量实战经验与技巧,帮助读者优化JavaScript性能,提升网页的加载速度和运行效率。 首先,书中讲述了JavaScript代码的加载与执行,这是性能优化的第一步。作者强调了脚本的...

    [高性能JavaScript编程].(High.Performance.JavaScript).Nicholas.C.Zakas.中英对照版.pdf

    3. **DOM操作**:DOM(文档对象模型)是JavaScript与HTML交互的关键,书中探讨了高效的DOM选择、遍历和修改策略,减少DOM操作对页面渲染的影响。 4. **事件处理**:解析事件冒泡、事件委托等概念,介绍如何优化事件...

    《高性能JavaScript_编程》 PDF

    7. **事件循环与异步编程**:JavaScript是非阻塞的,事件循环和回调函数、Promise、async/await等异步处理机制是JavaScript性能的关键。书中可能会介绍这些概念及其优化技巧。 8. **DOM操作**:DOM是JavaScript与...

    高性能JavaScript代码最佳实践.pdf

    本文总结了编写高性能JavaScript代码的最佳实践,讨论了JavaScript代码性能问题的几种设计模式对性能的影响,并提供了一些技巧来提高JavaScript代码的性能。 在研究JavaScript代码性能问题时,需要注意到设计模式对...

    Javascript 高性能程序开发(中文版)

    Zakas所著的一本关于如何提高JavaScript性能的书籍。本书通过对JavaScript的深入分析,以及对脚本加载、执行、作用域管理等方面的研究,提出了许多提高JavaScript代码运行效率的方法和技巧。书中探讨了在Web开发中...

    比较几个流行的JavaScript框架的性能

    Angular的性能受到其双向数据绑定的影响,虽然方便但可能在大型应用中导致性能下降。Angular 2+版本引入了更快的变更检测策略(如OnPush策略)和懒加载模块,以优化性能。 Vue.js是一个轻量级且易于学习的框架,它...

Global site tag (gtag.js) - Google Analytics