减少JS对页面加载性能影响的方法以及无阻塞脚本(javascript)模式

JS的阻塞特性:当<script>出现的时候,页面必须等待脚本文件的加载、解析、执行完毕后才能继续进行页面的渲染。不管脚本文件是以内联形式还是外部引入的形式出现在<script>中,页面的加载和渲染都必须停下来等待脚本文件的执行完成。因为在脚本文件中可能会修改页面的内容。这就会出现一个问题,当HTML文件中引入很多的外部脚本文件和内联脚本时,可能会导致页面的严重阻塞,影响页面的加载和渲染,用户体验特别的差。因而需要寻找适当的方法来减小脚本文件对页面加载带来的影响。

改善性能的几种方式:

1、 我们都知道脚本文件既可以存放在<head>标签中也可以存放在<body>标签中,并且是循序重复出现的如果将将本文件放在<head>中,如下:

    <!DOCTYPE html>
    <html >
    <head>
      <meta charset="utf-8">
      <title></title>
      <script src="script.js"></script>
          <script src="file1.js"></script>
 <script src="file2.js"></script>
 <script src="file3.js"></script>
<link rel="styleSheet" type="text/css" hhref="styles.css"></link>
    </head>
    <body >
    <p> swapCache方法示例</p>
    </body>
    </html>  

在上述代码在<head>中加载了四个JS文件,由于脚本阻塞页面的渲染,所以只有当脚本全部下载完并执行完毕后,页面才会开始渲染,在body标签之前是不会渲染任何部分的。同时在加载JS文件时,只有当前一个加载完毕并执行完毕后才会进行下一个JS文件的加载和执行,在早期的浏览器中都是不能进行JS文件的并行下载的,不过目前很多主流的浏览器都支持异步加载JS包,但是页面渲染的其他资源如图片等,仍然或因为JS的加载而阻塞,所以通常建议将JS文件尽量放在<body>标签中,以尽量减少对整个页面下载的影响。

2、由于每个<script>标签的初始下载时都会阻塞页面的渲染,所以尽量减少<script>标签的数量有助于改善页面阻塞情况。也就是说内联JS文件尽量合并,外部引入的文件如果可以合并最好不过,通常单个下载100KB文件比下载4个25KB文件更快。

3、无阻塞脚本的秘诀在于,在页面加载完毕后才加载javascript代码,也就是说当触发window对象的onload事件后再下载脚本。有如下几种方式实现这一效果:

(1)利用属性:async/defer

async:异步加载脚本同时在脚本加载的时执行脚本,不影响页面的加载和渲染

defer:异步加载脚本同时进行页面渲染,但脚本的执行需要等到页面加载完毕

  <!DOCTYPE html>
   <html >
   <head>
    <meta charset="utf-8">
    <title></title>
    <script defer>
       alert("defer");
    </script>
    <script >
       alert("script");
   </script>
   <script>
      window.onload=function(){
      alert("onload")
       }
  </script>
    <link rel="styleSheet" type="text/css" hhref="styles.css"></link>
    </head>
    <body >
    <p> swapCache方法示例</p>
    </body>
    </html>  

上述代码在不支持defer的浏览器弹出的顺序依次为:defer,script,load;在支持defer的浏览器中的弹出顺序为:script,defer,load。带有defer属性的标签是在onload的事件执行之前执行的,也即当页面加载完后执行带有defer属性的<script>中大JS代码。但是加载与页面加载异步执行的。

(2)利用动态脚本元素即通过document.createElement("script")动态生成脚本

   var script=document.craateElement("script");
   script.type="text/script"
  script.src="file.js";
   docuemnt.getElementsByTagName("head")[0].appendChild("script");

这种方法的优势在于无论什么时候启动加载,问价的下载和执行都不会阻塞页面的其他进程。该方法具有挂浏览器的兼容性和易用性优势,是最为通用的无阻塞加载的解决方法。

(3)XMLHttpRequest脚本注入的方法

利用XHR对象,借助它进行javascript脚本的下载,最后通过动态创建<script>元素将代码注入到页面当中

var xhr=new XMLHttpRequest();
xhr.open("get","file.js",true);
xhr.onreadystatechange=function(){
    if(xhr.state==4&&xhr.status==200)
     var script=docuemnt.createElement("script");
    script.type="text/script";
   script.text=xhr.reaponseText;
  document.body.appendChild(script);
}
时间: 2024-11-17 05:16:43

减少JS对页面加载性能影响的方法以及无阻塞脚本(javascript)模式的相关文章

页面加载性能优化

页面加载性能优化 在互联网网站百花齐放的今天,网站响应速度是用户体验的第一要素,其重要性不言而喻,这里有几个关于响应时间的重要条件: 用户在浏览网页时,不会注意到少于0.1秒的延迟: 少于1秒的延迟不会中断用户的正常思维, 但是一些延迟会被用户注意到: 延迟时间少于10秒,用户会继续等待响应: 延迟时间超过10秒后,用户将会放弃并开始其他操作: 因此大家都开始注重性能优化,很多厂商都开始做一些性能优化.比较有名的是雅虎军规,不过随着浏览器和协议等的发展,有一些已经逐渐被淘汰了.因此建议大家以历史

移动端网站提升页面加载性能的优化技巧

移动端网站提升页面加载性能的优化技巧 收藏到:1时间:2015-06-17   文章来源:马海祥博客   访问次数:2501 网页性能的优化一直是网站成功的关键,越来越多的研究证明,不管是小型电商,还是大型连锁企业,即使是页面加载时间方面的细微改善,都可以带来更多的业务,更多的广告收入,更多的用户粘性和更多的客户满意度. 在过去几年,Web开发者都是基于改善硬件或者提高带宽速度来优化用户体验,但是最近几年,爆炸式的移动Web浏览器的使用打破了这个途径,低带宽,高延迟,小内存,低处理器性能的移动设

JS判断页面加载完毕

//JS判断页面加载完毕,再隐藏加载效果层,一个简单的JS加载效果. document.onreadystatechange = function () { if (document.readyState == "complete") { var page = DF.URLHash.get("page"); if (typeof (page) != "undefined" && page != "page1.html&q

jQuery框架使用,jq选择器,jq操作页面内容, jq操作类名,jq操作全局属性,jq获取盒子信息,jq获取位置信息,js/jq页面加载完毕事件,jq事件

jq选择器 // 获取所有的页面元素jq对象 $('css3选择器语法'); var $box = $(".box:nth-child(1)"); 获取的是jq对象数组 // 拿到指定的页面元素jq对象 $('css3选择器语法').eq(index); var $box = $(".box").eq(1); 获取的是jq对象数组 // jq 转 js ( jq对像就是由数组包裹的js对象 ) box1 = $box[0] 从数组里取出来 box1 = $box.g

js jquery 页面加载初始化方法

一.js页面加载初始化方法 // 1.在body里面写初始化方法. <body onload='init()'> </body> <script type="text/javascript"> function init(){ // 初始化内容 } </script> // 2.window.onload=function(){} <script type="text/javascript"> window

JS实现页面加载完毕之前loading提示效果

1.获取浏览器页面可见高度和宽度 var _PageHeight = document.documentElement.clientHeight, _PageWidth = document.documentElement.clientWidth; 2.计算loading框距离顶部和左部的距离(loading框的宽度为215px,高度为61px) var _LoadingTop = _PageHeight > 61 ? (_PageHeight - 61) / 2 : 0, _LoadingLe

js中页面加载完成后执行的几种方式及执行顺序

在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$(document).ready(function(){});前两者本质上没有区别,第1种是第2种的简写方式.两个是document加载完成后就执行方法. 3:使用jQuery的$(window).load(function(){}); 4:使用window.onload = function(){

js 判断页面加载状态

//----判断当前页面是否加载状态 开始 ---- document.onreadystatechange = subSomething;//当页面加载状态改变的时候执行这个方法. function subSomething() { if (document.readyState != 'complete') //当页面加载状态 { //----显示遮罩 开始---- $(".overlay").css({ 'display': 'block', 'opacity': '0.8' }

关于 第三方接口支付的时候 采用post提交的方式,有两种 一种是通过 curl来进行,一种是通过js当页面加载完后跳转

这是第一种.通过javascript页面加载完后,对表单采用 post方式提交给 第三方接口----- echo <<<_END<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.