0

0

JavaScript无阻塞加载性能优化的示例代码分享

黄舟

黄舟

发布时间:2017-03-16 15:15:37

|

1505人浏览过

|

来源于php中文网

原创

javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题。

在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 。原因是,事实上,大多数浏览器使用单进程处理UI和更新Javascript运行等多个任务,而同一时间只能有一个任务被执行。Javascript运行了多长时间,那么在浏览器空闲下来响应用户交互之前的等待时间就有多长。

从基本层面说,这意味着

 1 
 2   
 3     Script Example
 4    
 5   
 6   
 7      

8 11

12 13

当浏览器遇到一个

立即学习Java免费学习笔记(深入)”;

因为脚本阻塞其他页面资源的下载过程,所以推荐的办法是:将所有

 1 
 2   
 3     Script Example
 4      
 5   
 6   
 7   
 8     

Hello world!

9 <-- Example of recommended script positioning --> 10 11 12 13 14

此代码展示了所推荐的

另外,Yahoo! 为他的“Yahoo! 用户接口(Yahoo! User Interface,YUI)”库创建一个“联合句柄”,这是通过他 们的“内容投递网络(Content Delivery Network,CDN)”实现的。任何一个网站可以使用一个“联合句柄”URL 指出包含 YUI 文件包中的哪些文件。例如,下面的 URL 包含两个文件:

这个defer属性指明元素中所包含的脚本不打算修改DOM,因此代码可以稍后执行。defer属性只被Internet Explorer 4+和Firefox 3.5+支持,它不是一个理想的跨浏览器解决方案。在其他浏览器上,defer属性将被忽略。所以,

一个带有defer属性的

可以使用下述代码测试浏览器是否支持defer属性:

 1 
 2   
 3     Script Defer Example
 4    
 5 
 6   
 7      
 8      
 9     
10    
11 

如果浏览器不支持defer,那么弹出的对话框的顺序是“defer”,“script”,“load”。

wordpress图片展示类主题
wordpress图片展示类主题

这是易秀购主题网分享的一款展示为图片类的类的wordpress主题,WP主题熟悉的朋友应该一眼能看出这是瀑布流修改优化而来。主题并且采用了Ajax加载技术,主题代码非常精简,加载速度非常快。这款图片类主题格式化了几个自定义栏目,分别是price(价格)、from(购买自…)、ob-url(单品url)、shop-url(店铺url)和banner(文章详细页面上部的图片,如果

下载

如果浏览器支持defer,那么弹出的对话框的顺序是“script”,“load”,“defer”。

Dynamic Script Elements 动态脚本元素

DOM允许我们JS0动态创建HTML的几乎所有文档内容,一个新的

1 var script = document.createElement ("script");
2 script.type = "text/javascript";
3 script.src = "file1.js"; 
4 document.body.appendChild(script);

新的

当文件使用动态脚本节点下载时,返回的代码通常立即执行(除了Firefox和Opera,它们将等待此前的所有动态脚本节点执行完毕)。

大多数情况下,我们希望调用一个函数就可以实现Javascript文件的动态下载。下面的函数封装实现了标准实现和IE实现:

 1  function loadScript(url, callback){
 2     var script = document.createElement ("script") ;
 3    script.type = "text/javascript";
 4      
 5     if (script.readyState){ //IE
 6        script.onreadystatechange = function(){
 7          if (script.readyState == "loaded" || script.readyState == "complete"){
 8            script.onreadystatechange = null;
 9            callback(); 
10           }
11        };
12      } 
13      else { //Others
14        script.onload = function(){ callback();
15      }; 
16    }
17    script.src = url;
18    document.getElementsByTagName("head")[0].appendChild(script); 
19  }
20 
21 loadScript("file1.js", function(){  //调用
22     alert("File is loaded!"); 
23 });

此函数接受两个参数:Javascript文件的Url和一个当Javascript接收完成时触发的JS1。属性检查用于决定监视哪种事件。最后一步src属性,并将javascript文件添加到head。

动态脚本加载是非阻塞Javascript下载中最常用的模式,因为它可以跨浏览器,而且简单易用。

JS2HttpRequest Script Injection XHR脚本注入

另一个以非阻塞方式获得脚本的方法是使用XMLHttpRequest(XHR)JS3将脚本注入到页面中。此技术首先创建一个XHR对象,然后下载Javascript文件,接着用一个动态

 1 var xhr = new XMLHttpRequest(); 
 2 xhr.open("get", "file1.js", true); 
 3 xhr.onreadystatechange = function(){
 4     if (xhr.readyState == 4){
 5       if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){ // 检查http状态码
 6         var script = document.createElement("script"); 
 7         script.type = "text/javascript";
 8         script.text = xhr.responseText;
 9         document.body.appendChild(script);
10       } 
11    }
12 }; 
13 xhr.send(null);

此代码向服务器发送一个获取file1.js的文件get请求。onreadystatechangeJS4函数检查readyState是不是4,然后检查HTTP状态码是不是有效(200表示确定客户端请求已成功,2xx表示有效回应,304表示一个JS5响应)。如果收到一个有效响应,那么就创建一个新的

此方法的优点是兼容性佳,且你可以下载不立即执行的Javascript代码。由于代码返回在

此方法的确定是受到浏览器同源限制,Javascript文件必须与页面放置在同一个域内,不能从CDN(内容分发网络Content Delivery Network)下载。正因为这个原因,大型网页通常不采用XHR脚本注入技术。

Recommended Noblocking Pattern 推荐的非阻塞模式

推荐的向页面加载大量Javascript的方法分为两个步骤:

  • 第一步,包含动态加载Javascript所需的代码,然后加载页面初始化所需的除了Javascript之外的部分。这部分代码尽量小,可能只包含loadScript()函数,它的下载和运行非常迅速,不会对页面造成很大干扰。

  • 第二步,当初始代码准备好之后,用它来加载其余的Javascript。

例如:

1  

将此代码放置在body的关闭标签

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

2

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

446

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

145

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

258

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

9

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

13

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

10

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

25

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

124

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号