关于Javascript加载执行优化的研究报告


Posted in Javascript onDecember 16, 2014

本人做前端开发一年多了,对前端的见解还是多多少少有一点的,今天特拿出来跟大家分享分享。

做前端开发少不了各种利器。比如我习惯用的还是Google浏览器和重型武器Fiddller。

一: 原始情况

首先大家看看如下的代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="JsLoad.Default" %>
<!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.org/1999/xhtml">

<head id="head">

    <title></title>

    <link href="Styles/Site.css" rel="stylesheet" type="text/css" />

    <script src="jquery/jquery-1.4.1.js" type="text/javascript"></script>

    <script src="js/hello.js" type="text/javascript"></script>

    <script src="js/world.js" type="text/javascript"></script>

</head>

<body>

    <img src="1.jpg" width="200" height="300" />

</body>

</html>

估计90%的程序员都会把js文件放在head中,但是大家有没有深究过呢?很多浏览器都会使用单一的线程来做“界面UI的更新”和“JS脚本的处理“,

也就是当执行引擎遇到”<script>“的时候,此时页面的下载和渲染都必须等待<script>执行完毕。那么对用户而言就悲哀了,看着锁住的页面,

此时用户很可能就会给你关掉。

关于Javascript加载执行优化的研究报告

从上面的瀑布图中我们可以看出二点:

第一:

三个js文件并行下载,但是按我上面的理论中js应该是一个接一个的执行。然而在IE8,Firefox3.5和Chrome2都实现了js的并行下载,

这是相当不错的,但是他还是会阻碍一些其他资源的下载,比如说图片。

第二:

图片1.jpg的下载是在js执行完成后触发的,这也验证了上面所说的情况,阻止了image的加载。

二:第一步优化

既然js阻止了UI渲染,那么我们可以考虑将js放在</body>前,这样就可以让<script>前的html完美的呈现,不会让用户看到页面空白等待

而苦恼的情况,自然就提高了友好性。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="JsLoad.Default" %>
<!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.org/1999/xhtml">

<head id="head">

    <title></title>

    <link href="Styles/Site.css" rel="stylesheet" type="text/css" />

</head>

<body>

    <img src="1.jpg" width="200" height="300" />

    <script src="jquery/jquery-1.4.1.js" type="text/javascript"></script>

    <script src="js/hello.js" type="text/javascript"></script>

    <script src="js/world.js" type="text/javascript"></script>

</body>

</html>

下面的图也展示了1.jpg和三个js几乎并行下载和执行。时间由上面的“469ms+”缩小到“326ms”。

关于Javascript加载执行优化的研究报告

三:第二步优化

看上面的“瀑布图”,估计大家也看出来了,三个js文件进行了三次“Get”请求,大家都知道Get请求是需要带http头的,

所以说需要耗费时间,那么我们采取的方案自然就是减少Get请求。通常有两种方案。

第一:合并js文件,比如将上面的“hello.js"和“world.js“合并掉。

第二:利用第三方工具,比如php中的Minify。

关于第二种做法,taobao用的还是比较多的,看一下其中的一个script,应用了三个js文件。由3个Get请求变为了1个。

关于Javascript加载执行优化的研究报告

四:第三步优化

不管是把js文件放在脚尾,还是三个合并一个,其本质都是”阻塞模式“,就是说锁死浏览器,当web页面越来越复杂,js文件越来越多,还是

让我们头疼的,此时我们就提倡一种“无阻塞模式“加载js脚本,也就是页面全部呈现完再追加js,也就对应着window.onload事件触发后,我们才

追加js,这就是所谓的“无阻塞“,但是其中有一个非常要注意的地方就是我们对js的要求是否有严格的顺序。

第一:无顺序要求,比如我对”hello.js“和”world.js"没有顺序要求,那么我们完全可以用jquery来动态追加实现。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="JsLoad.Default" %>
<!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.org/1999/xhtml">

<head id="head">

    <title></title>

    <link href="Styles/Site.css" rel="stylesheet" type="text/css" />

</head>

<body>

    <img src="1.jpg" width="200" height="300" />

    <script src="jquery/jquery-1.4.1.js" type="text/javascript"></script>

    <script type="text/javascript">

        window.onload = function () {

            $("#head").append("<script src='js/hello.js' type='text/javascript'><\/script>")

            $("#head").append("<script src='js/world.js' type='text/javascript'><\/script>");

        }

    </script>

</body>

</html>

关于Javascript加载执行优化的研究报告

从图中可以看出,"hello.js"和“world.js"出现在蓝色线以后,也就说明这两个js是在DomContentLoad结束后再进行触发加载的,这样就不会造成页面的锁定

等待。

第二:有顺序要求

为什么一定要有顺序要求这个概念呢?对于上面的那个动态追加的“两个js”文件,在IE系列中,你不能保证hello.js一定会在world.js前执行,

他只会按照服务器端返回的顺序执行代码。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="JsLoad.Default" %>
<!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.org/1999/xhtml">

<head id="head">

    <title></title>

    <link href="Styles/Site.css" rel="stylesheet" type="text/css" />

</head>

<body>

    <img src="1.jpg" width="200" height="300" />

    <script type="text/javascript">

        function loadScript(url, callback) {

            var script = document.createElement("script");

            script.type = "text/javascript";
            //IE

            if (script.readyState) {

                script.onreadystatechange = function () {

                    if (script.readyState == "loaded" || script.readyState == "complete") {

                        script.onreadystatechange = null;

                        callback();

                    }

                }

            } else {

                //非IE

                script.onload = function () {

                    callback();

                }

            }

            script.src = url;

            document.getElementById("head").appendChild(script);

        }

        //第一步加载jquery类库

        loadScript("jquery/jquery-1.4.1.js", function () {

            //第二步加载hello.js

            loadScript("js/hello.js", function () {

                //第三步加载world.js

                loadScript("js/world.js", function () {
                });

            });

        });

    </script>

</body>

</html>

关于Javascript加载执行优化的研究报告

大家也能看到,页面完全Load的时间其实也就310ms左右,大大提高了网页的下载呈现和友好型。

同样也可以看看腾讯网,他也是这么干的。

关于Javascript加载执行优化的研究报告

是不是非常的有用呢,本人这里也是花了些时日来做这些研究测试,希望小伙伴们能看到心里去,毕竟这也是“麻花藤”公司的解决方案,大家参考下吧

Javascript 相关文章推荐
鼠标移动到一张图片时变为另一张图片
Dec 05 Javascript
给Function做的OOP扩展
May 07 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
Apr 02 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
网页中表单按回车就自动提交的问题的解决方案
Nov 03 Javascript
图解js图片轮播效果
Dec 20 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
javascript中json基础知识详解
Jan 19 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
Apr 03 jQuery
详解jQuery中关于Ajax的几个常用的函数
Jul 17 jQuery
JavaScript实现无刷新上传预览图片功能
Aug 02 Javascript
angular2 组件之间通过service互相传递的实例
Sep 30 Javascript
jQuery 重复加载错误以及修复方法
Dec 16 #Javascript
node.js中的fs.lstatSync方法使用说明
Dec 16 #Javascript
node.js中的fs.lstat方法使用说明
Dec 16 #Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
Dec 15 #Javascript
2014年50个程序员最适用的免费JQuery插件
Dec 15 #Javascript
javascript使用call调用微信API
Dec 15 #Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
Dec 15 #Javascript
You might like
虫族 Zerg 历史背景
2020/03/14 星际争霸
开源SNS系统-ThinkSNS
2008/05/18 PHP
php面向对象值单例模式
2016/05/03 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
基于jquery库的tab新形式使用
2012/11/16 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
Python base64编码解码实例
2015/06/21 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
python 回溯法模板详解
2020/02/26 Python
Python日志处理模块logging用法解析
2020/05/19 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
德国网上宠物店:Zoobio
2018/05/23 全球购物
英国绿色商店:Natural Collection
2019/05/03 全球购物
社区端午节活动方案
2014/01/28 职场文书
人事专员的职责
2014/02/26 职场文书
益达广告词
2014/03/14 职场文书
英文推荐信格式范文
2014/05/09 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
感谢师恩主题班会
2015/08/17 职场文书
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server