优化加载和执行提高javascript性能

来源:互联网 发布:unity3d 引擎 编辑:程序博客网 时间:2024/06/08 15:44

一、在HTML中使用javascript
1、<.script><./script>
script

<script type="text/javascript">/*必须只有type属性,可能还有defer*/            function sayHi(){                alert('Hi!');            };</script>

Js解析器在执行的时候是从上下依次执行,在所有js代码执行完之前,页面的其他部分是不允许下载,执行的。

引用外部的javascript

<script type="text/javascript" src="demo.js">/*必须只有type,src属性,可能还有defer,async*/        /*无任何代码*/</script>

Js解析器在加载和执行外部js文件的时候,和内嵌js执行一样,其他的部分不允许下载执行。
2、<.noscript><./noscript>

<noscript>        <p>Your browser does not support JavaScript!</p> </noscript>

只有在浏览器不支持脚本,或者浏览器支持脚本但是被禁止的情况下才显示noscript里面的内容,其他情况下,不显示。这个元素可以放在body元素中任意位置,但是不能放在script元素中。

二、提高javascript的性能
Javascript在加载执行时存在的问题?

 无论是内嵌的javascript还是外部引用的javascript,当js解析器执行到<.script>标签的时候,使得整个页面由于要加载和执行js代码而等待,图片等其他资源的加载被阻塞。这种等待或阻塞在某些情况下是必须的,比如通过document.write( )修改DOM树的结构时。

为什么javascript的加载和执行不能和css文档或者图片这些资源并行加载呢?

 当浏览器从服务器接收到了HTML文档,并把HTML在内存中转换成DOM树。在转换的过程中如果发现某个节点(node)上引用了CSS或者image,就会再发1个request去请求CSS或image,然后继续执行下面的转换,而不需要等request的返回,当request返回后,只需要把返回的内容放入到DOM树中对应的位置就OK。但当引用了JS的时候,浏览器发送1个js request就会一直等待该request的返回。因为浏览器需要1个稳定的DOM树结构,而JS中很有可能有代码直接改变了DOM树结构,比如document.write 或 appendChild,甚至是直接使用的location.href进行跳转,浏览器为了防止出现JS修改DOM树,需要重新构建DOM树的情况,所以就会阻塞其他的下载和呈现.

Js,css代码在html文档中的位置优化。
1、没有js只有css和资源

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>    <link rel="stylesheet" type="text/css" href="../7.21/index1.css"/>    </head>    <body>              <img src="img1.png"/>    </body></html>

这里写图片描述
开始html文档发出请求,得到响应之后开始下载html文档,下载完之后开始对html进行DOM树创建。橘红色这个方框出现一个空白,这个时间内正是执行DOM树创建的过程,DOMcontentLoaded(仅当DOM加载完成,不包括样式表,图片,flash。)在34ms完成。根据分析DOM树的过程中开始加载css文件和资源,css和资源在没有js中是可以并行加载的,等到这些资源加载完成之后执行DOMLoaded(页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成)
2、外部js文件在css文件前面和后面分析:

<!doctype html><html lang="en"><head>    <meta charset="UTF-8" />        <script type="text/javascript"  src='../../插件/html5shivr29min.js'></script>    <link rel="stylesheet" type="text/css" href="index1.css"/></head><body>    <img src="img1.png"/></body></html>

这里写图片描述

首先,在css文件之前加入外部js文件之后,DOMcontentLoaded时间变长,这是由于花费一段时间等待js文件加载这执行,但是没有影响css文件的并行,影响了图片的并行。
3将js文件放在head中css文件之后,影响了css的并行加载和body里面img的并行加载。
4内嵌js放在css前面

<!doctype html><html lang="en"><head>    <meta charset="UTF-8" />    <script type="text/javascript">    var sum = 0;        for(var i = 1;i<1000000; i++){            sum+=i;        }    </script>    <link rel="stylesheet" type="text/css" href="index1.css"/></head><body>    <img src="img1.png"/></body></html>

这里写图片描述
可以看出整体与没有js文件区别不大,也就是说css与资源还是并行加载,但是由于在html文档下载完之后要先执行js文件所以DOMcontentLoaded时间变长不少,相比外部js,节省了与服务器交互的时间,但是对时间提升上并不明显。

5、内嵌js放在css文件后面

<!doctype html><html lang="en"><head>    <meta charset="UTF-8" />    <link rel="stylesheet" type="text/css" href="index1.css"/>    <script type="text/javascript">    var sum = 0;        for(var i = 1;i<1000000; i++){            sum+=i;        }    </script></head><body>    <img src="img1.png"/></body></html>

这里写图片描述
可以看出,css与资源并不是并行加载,所以DOMcontentLoaded时间很长。
6、js放到body中内容的后面

<!doctype html><html lang="en"><head>    <meta charset="UTF-8" />    <link rel="stylesheet" type="text/css" href="index1.css"/></head><body>    <img src="img1.png"/>        <script type="text/javascript"  src='../../插件/html5shivr29min.js'></script></body></html>

5
可以看出,css和图片可以平行加载,缩短了DOMcontentLoaded时间,同时,放在head里面,由于浏览器发现head里面有javascript标签就会暂时停止其他渲染行为,等待javascript下载并执行完成才能接着往下渲染,而这个时候由于在head里面这个时候页面是白的,如果将javascript放在页面底部,renderTree已经完成大部分,所以此时页面有内容呈现,即使遇到javascript阻塞渲染,也不会有白屏出现。

综上所述,尽可能的不要再head中放入js,如果要放尽量在css文档之前
放入内嵌js,外部js放在body元素内容的后面。

0 0
原创粉丝点击