SlideShare a Scribd company logo
javascript 加载总结

加载 javascript 的 demo

http://labjs.com/test_suite/test-script-tags.php

Timeline:
IE8:




IE8 模拟 IE7:




FF7:




Chrome14:




问题:脚本加载会阻塞后续的页面内容加载,影响 web 性能。




内联脚本同样阻塞脚本并行下载,影响 web 性能。
原因:

浏览器并发即可以同时下载 CSS 文件和 JS 文件,在 http1.1 的协议多支持 2 个并发数,IE8、

firefox2 最多支持 6 个并发数,opera 和 safari 最多支持 8 个并发数,chrome 最多支持 4 个并

发数。




常规解决办法:


浏览器并发个数是指同一个域名同时可请求数量。浏览器的并发数是可以设置的。



使用多域名下载,使用 CDN 可以有效的提高并发数。



脚本放在页面底部。



脚本加载完毕即执行。



脚本的加载和执行

最理想的情况:无阻塞并行加载,并且能控制脚本加载顺序(解决文件间的依赖问题)。




脚本加载方式:

   XHR Eval
   XHR Inject
   Script Iframe
   Script DOM Element
   Script Defer
   document.write Script Tag
控制脚本的执行时机

http://labjs.com/test_suite/test-script-tags.php


假设依赖关系是 script2 依赖于 script1,script3 依赖于 script2。能达到理想的状况么?



默认脚本下载完即执行。非并行下载可以保证脚本的执行顺序。



   异步加载回调

   window onload

   定时器(Timer)

   Script Onload
   Degrade Script Tag
Script 标签的 defer 属性:

脚本加载完后并不立即执行,在 DOMReady 后执行。

延迟脚本执行,相当于将 script 标签放入页面 body 标签的底部。

IE,FF3.1+支持



HTML5 的 script 标签 async 属性

该脚本异步加载,下载完即执行,无视其他脚本的存在。




一些解决方案

YUILoader:前后端一起来解决这个问题,后端 combo 服务拼接好所需 js。减少 http 请求。



commonjs/seajs:换个角度看这个问题,不是解决脚本加载本身的问题。而是通过模块化的思

想重新组织脚本。



labjs/reqiurejs/headjs: 解决脚本加载问题。




labjs

http://labjs.com/test_suite/test-LABjs-preloading.php?which=16


IE8 模拟 IE7 Timeline:




FF7:
FF7 Debug 日志:




脚本的执行顺序是 script1,script2,script3,虽然下载完毕的时间不是 script1,script2,script3



labjs 原理:

http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order


要保证并行下载,而且按给定顺序执行,需要预加载 js 文件而不执行。



labjs 中预加载,执行的几种方式:



1.给 script 设置 src 属性但是并不把 dom 节点 append 到 head 中,实现预加载, dom 追加
                                                       当

到 head 中时脚本执行(IE 中使用该方法)。



2.相同 domain。使用 XHR 对象加载。然后使用 eval(xhr.responseText)来执行脚本。



3. 非 IE 浏 览 器 , 使 用 <script type=”text/cache”></script> 来 预 先 加 载 脚 本 。 然 后 将

type=”text/javascript”来执行脚本。

(类似的思路还可以使用(new Image().src=”xx.js” 来将脚本加载到缓存中,然后使用 DOM 操

作添加 script 节点)



4.使用 html5 中<script async ></script>来保证执行顺序
5.单个 js 加载直接使用 DOM 操作。

More Related Content

DOCX
推聊 3分钟可运行起来的开源 android手机聊天系统
PPTX
Node.js长连接开发实践
PDF
PHP/NodeJS/Redis项目实战
PDF
Presta shop 1.6 详细安装指南
PDF
Presta shop 1.6 的安装环境
PPT
使用Nginx轻松实现开源负载均衡
PPT
使用Nginx轻松实现开源负载均衡
PPT
Wordpress使用心得
推聊 3分钟可运行起来的开源 android手机聊天系统
Node.js长连接开发实践
PHP/NodeJS/Redis项目实战
Presta shop 1.6 详细安装指南
Presta shop 1.6 的安装环境
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
Wordpress使用心得

What's hot (19)

PDF
Presta shop 1.6 图文安装教程
PPT
使用Nginx轻松实现开源负载均衡
PDF
Presta shop 1.6 如何安装简体中文语言文件
PPT
使用Nginx轻松实现开源负载均衡——对外版
PDF
Presta shop 1.6 如何安装简体中文语言文件
PPTX
8, lamp
PDF
Php及drupal性能优化系列(二)
PPT
Php Webservers
PPTX
Maven & mongo & sring
PPT
Wamp环境下安装 wordpress
PPTX
Nodejs api server_implement
PPTX
Java API for WebSocket 實作介紹
PDF
第十二章解答
PDF
超。光速 網站最佳化實戰 -twMVC#8
PPTX
使用Rpm&yum进行基础软件管理
PDF
Node.js從無到有 基本課程
PPTX
使用Samba提升linux平台开发效率
PPT
Javascript stacktrace
PDF
PHP 應用之一 socket funion : 偽 WEB Server
Presta shop 1.6 图文安装教程
使用Nginx轻松实现开源负载均衡
Presta shop 1.6 如何安装简体中文语言文件
使用Nginx轻松实现开源负载均衡——对外版
Presta shop 1.6 如何安装简体中文语言文件
8, lamp
Php及drupal性能优化系列(二)
Php Webservers
Maven & mongo & sring
Wamp环境下安装 wordpress
Nodejs api server_implement
Java API for WebSocket 實作介紹
第十二章解答
超。光速 網站最佳化實戰 -twMVC#8
使用Rpm&yum进行基础软件管理
Node.js從無到有 基本課程
使用Samba提升linux平台开发效率
Javascript stacktrace
PHP 應用之一 socket funion : 偽 WEB Server
Ad

Viewers also liked (9)

PPTX
Slideshare
PPT
Tangramgrid
ODP
I like this bag
PDF
Herelegdehvvn word
PPTX
谈谈模块化
PPTX
Halloween 2011
PPT
Web绘图
PDF
Hereglegdehvvn
ODP
I like this bag
Slideshare
Tangramgrid
I like this bag
Herelegdehvvn word
谈谈模块化
Halloween 2011
Web绘图
Hereglegdehvvn
I like this bag
Ad

Similar to Javascript加载总结 (20)

PPT
PHP & AppServ
PDF
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
PPT
Html5
PPT
高性能网站最佳实践
PPT
客户端存储与计算
PPT
Real time web实时信息流推送
PPT
Real-Time Web实时信息流推送
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PPT
高性能Web服务器Nginx及相关新技术的应用实践
PPTX
那些年,我们一起跨过域
PPTX
非常靠谱 Html 5
PPTX
Web开发基础
PDF
51 cto下载 51cto信息图:openshift vs cloudfoundry
PPT
Paveo Tweak WordPress
PPTX
如何使用 Xhprof 分析網站效能 (真實案例)
PPTX
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
PPT
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
PDF
钱宝坤:多浏览器集成的JavaScript单元测试工具
PPTX
Asp.net 5 新功能與變革
PHP & AppServ
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
Html5
高性能网站最佳实践
客户端存储与计算
Real time web实时信息流推送
Real-Time Web实时信息流推送
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
那些年,我们一起跨过域
非常靠谱 Html 5
Web开发基础
51 cto下载 51cto信息图:openshift vs cloudfoundry
Paveo Tweak WordPress
如何使用 Xhprof 分析網站效能 (真實案例)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
钱宝坤:多浏览器集成的JavaScript单元测试工具
Asp.net 5 新功能與變革

Javascript加载总结

  • 1. javascript 加载总结 加载 javascript 的 demo http://labjs.com/test_suite/test-script-tags.php Timeline: IE8: IE8 模拟 IE7: FF7: Chrome14: 问题:脚本加载会阻塞后续的页面内容加载,影响 web 性能。 内联脚本同样阻塞脚本并行下载,影响 web 性能。
  • 2. 原因: 浏览器并发即可以同时下载 CSS 文件和 JS 文件,在 http1.1 的协议多支持 2 个并发数,IE8、 firefox2 最多支持 6 个并发数,opera 和 safari 最多支持 8 个并发数,chrome 最多支持 4 个并 发数。 常规解决办法: 浏览器并发个数是指同一个域名同时可请求数量。浏览器的并发数是可以设置的。 使用多域名下载,使用 CDN 可以有效的提高并发数。 脚本放在页面底部。 脚本加载完毕即执行。 脚本的加载和执行 最理想的情况:无阻塞并行加载,并且能控制脚本加载顺序(解决文件间的依赖问题)。 脚本加载方式:  XHR Eval  XHR Inject  Script Iframe  Script DOM Element  Script Defer  document.write Script Tag
  • 3. 控制脚本的执行时机 http://labjs.com/test_suite/test-script-tags.php 假设依赖关系是 script2 依赖于 script1,script3 依赖于 script2。能达到理想的状况么? 默认脚本下载完即执行。非并行下载可以保证脚本的执行顺序。  异步加载回调  window onload  定时器(Timer)  Script Onload  Degrade Script Tag
  • 4. Script 标签的 defer 属性: 脚本加载完后并不立即执行,在 DOMReady 后执行。 延迟脚本执行,相当于将 script 标签放入页面 body 标签的底部。 IE,FF3.1+支持 HTML5 的 script 标签 async 属性 该脚本异步加载,下载完即执行,无视其他脚本的存在。 一些解决方案 YUILoader:前后端一起来解决这个问题,后端 combo 服务拼接好所需 js。减少 http 请求。 commonjs/seajs:换个角度看这个问题,不是解决脚本加载本身的问题。而是通过模块化的思 想重新组织脚本。 labjs/reqiurejs/headjs: 解决脚本加载问题。 labjs http://labjs.com/test_suite/test-LABjs-preloading.php?which=16 IE8 模拟 IE7 Timeline: FF7:
  • 5. FF7 Debug 日志: 脚本的执行顺序是 script1,script2,script3,虽然下载完毕的时间不是 script1,script2,script3 labjs 原理: http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order 要保证并行下载,而且按给定顺序执行,需要预加载 js 文件而不执行。 labjs 中预加载,执行的几种方式: 1.给 script 设置 src 属性但是并不把 dom 节点 append 到 head 中,实现预加载, dom 追加 当 到 head 中时脚本执行(IE 中使用该方法)。 2.相同 domain。使用 XHR 对象加载。然后使用 eval(xhr.responseText)来执行脚本。 3. 非 IE 浏 览 器 , 使 用 <script type=”text/cache”></script> 来 预 先 加 载 脚 本 。 然 后 将 type=”text/javascript”来执行脚本。 (类似的思路还可以使用(new Image().src=”xx.js” 来将脚本加载到缓存中,然后使用 DOM 操 作添加 script 节点) 4.使用 html5 中<script async ></script>来保证执行顺序