关闭

提高js加载速度,实现js无阻塞加载方式,高性能的加载执行JavaScript

时间: 2017-11-01阅读: 5706标签: 性能

由于js的堵塞特性,当浏览器在加载JavaScript代码时,不能同时做其他任何事情,如果JavaScript执行时间越久,浏览器等待响应的时间就越久。所以为了解决防止先执行js代码,然后再继续页面的解析和渲染,我们一般采用调整js脚本的位置,通过采用将所有的<script>标签尽可能的放在<body>标签的底部,来减少对整个页面加载的影响。

如果js文件比较多,会产生大量的Http请求,我们都知道http请求是比较耗费性能的事情,例如你加载1个100kb的文件比加载10个10Kb的文件速度要快,因此我们会采用合并压缩js脚本来达到优化速度的效果,当然有许多出色的工具可以加快JavaScript装入的速度。比如Lab.js,使用它你就可以并行装入JavaScript文件,加快总的装入过程。你还可以为需要装入的脚本设置某个顺序,那样就能确保依赖关系的完整性。而且开发者声称其网站上的速度提升了2倍。

除了上述内容以外,这篇文章主要讲解如果延时加载js和动态加载js,达到页面无堵塞的效果。

js的延时加载

defer的使用 

defer是一个常用的优化方案,它表示脚本会被延迟到文档完全被解析和显示之后再执行,加载后续文档元素的过程将和js脚本的加载并行进行(异步),这样页面加载会更快。  

<script src="main.js" defer></script>


async的使用  

async是html5的属性,async 属性规定一旦脚本可用,则会异步执行。async不保证按照脚本出现的先后顺序执行,因此,确保两者之前互不依赖非常重要,指定async属性的目的是不让页面等待两个脚本的下载和执行,从而异步加载页面其他内容,异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。支持异步脚本的浏览器有Firefox 3.6、Safari 5 和Chrome。

<script async src="main.js"></script>


注意点

1、建议异步脚本不要在加载期间修改DOM,当js不需要改变DOM结构时推荐使用异步加载(比如一些统计代码,它与页面执行逻辑无关,也不会改变DOM结构)。

2、延迟脚本并不一定会按照顺序执行,因此,确保两者之前互不依赖非常重要。


js的动态加载


由于文档对象模型(DOM)允许您使用 JavaScript 动态创建 html 的几乎全部文档内容。  当然也就应许我们动态创建<script>元素,例如:
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);
}

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

loadScript("main.js", function(){
   console.log("File is loaded!");
});

如何需要在页面中动态加载很多 JavaScript 文件,我们可以在回调方法中多次调用即可。


js动态注入

创建一个XMLHttpRequest对象,然后下载 JavaScript 文件,接着用一个动态 <script> 元素将 JavaScript 代码注入页面。例如:

var xhr = new XMLHttpRequest();
xhr.open("get", "main.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);

向服务器发送一个GET 请求 ,去获取main.js文件,当状态成功,我们把获取的js文件动态加载到页面。采取了它的好处是:它下载后不会自动执行,这使得您可以推迟执行,直到一切都准备好了。另一个优点是,同样的代码在所有现代浏览器中都不会引发异常。需要注意的是,加载的js文件不能跨域获取,所以一般网站通常不采用 XHR 脚本注入技术


总结:

1. 尽可能的将<script>标签放到页面底部,也就是</body>闭合标签之前,这能确保在脚本执行前页面已经完成了渲染。

2.尽可能的合并js文件。减少http请求,加载速度也就越快。

3.尽可能的压缩js文件。减少文件体积,加快加载的速度。

4.<script>标签使用defer或async属性。异步加载js。

5.使用动态创建的<script>元素来下载并执行代码。

6.使用 XHR 对象下载 JavaScript 代码并注入页面中。



站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/44

关闭

window.performance_前端性能监控

HTML5提供的performance接口精确的告诉我们当访问一个网站页面时当前网页每个处理阶段的精确时间(timestamp),以方便我们进行前端分析

JS如何提高扩展运算符的性能?

当被扩展的数组位于数组的开头时,由于快速路径优化,您可以获得性能提升。它适用于V8引擎7.2版本(Chrome v72和NodeJS v12附带的特性)。通过此优化,性能测试显示[... array, item]的执行速度至少比[item, ...array]快两倍

用CSS开启硬件加速来提高网站性能

你知道我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能吗?现在大多数电脑的显卡都支持硬件加速。鉴于此,我们可以发挥GPU的力量,从而使我们的网站或应用表现的更为流畅。

前端开发工程师必须关注的几个性能指标

对于一个网站如果希望抓住用户,网站的速度以及稳定性是首当其冲的。从各式各样的前端监控平台中,你都可以获得页面很多的性能指标。本文将介绍几个几个比较关键的指标,并给出相应的优化思路。

怎样测试 JavaScript 的函数性能

通过衡量执行某个函数所花费的时间,以“证明”某些实现比另一些实现更高效始终是一个很好的主意。这也是确保性能在进行一些修改后不受影响并找出瓶颈的好方法。良好的性能有助于获得良好的用户体验。良好的用户体验能够留住用户

页面渲染性能控制-重绘与回流

页面的显示过程分为以下几个阶段:生成DOM树(包括display:none的节点),在DOM树的基础上根据节点的集合属性(margin,padding,width,height等)生成render树

高性能Javascript总结

Js高性能总结:加载和运行、数据访问、DOM编程、算法和流程控制、响应接口、Ajax 异步JavaScript和XML、编程实践...

Java与Node.js性能PK

如果你打开浏览器,搜索“Java与Node.js哪个更快”,你会发现大部分答案声称Node.js更快,也有一些人持相反意见。Java使用JIT编译器,其性能甚至可以超过C++。在这种情况下,为什么这么多人还是声称Node.js要比Java快呢?

JavaScript 对象迭代方法与性能比较

Object.entries返回对象所有可枚举的键值对,不会追寻原型链上的 key,Object.keys返回对象所有可枚举的键

JS如何提高展开运算符的性能?

展开运算符或三个点,接受一个数组数组或通常是可迭代的[... arrayOrIterable]并将数组元素分解,并使用这些分解部分构造一个新数组。展开运算符可以放在数组中的任何位置:

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!