SlideShare una empresa de Scribd logo
1 de 6
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 操作。

Más contenido relacionado

La actualidad más candente

Presta shop 1.6 图文安装教程
Presta shop 1.6 图文安装教程Presta shop 1.6 图文安装教程
Presta shop 1.6 图文安装教程YUCHENG HU
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡cachowu
 
Presta shop 1.6 如何安装简体中文语言文件
Presta shop 1.6 如何安装简体中文语言文件Presta shop 1.6 如何安装简体中文语言文件
Presta shop 1.6 如何安装简体中文语言文件YUCHENG HU
 
使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版pigso
 
Presta shop 1.6 如何安装简体中文语言文件
Presta shop 1.6 如何安装简体中文语言文件Presta shop 1.6 如何安装简体中文语言文件
Presta shop 1.6 如何安装简体中文语言文件YUCHENG HU
 
8, lamp
8, lamp8, lamp
8, lampted-xu
 
Php及drupal性能优化系列(二)
Php及drupal性能优化系列(二)Php及drupal性能优化系列(二)
Php及drupal性能优化系列(二)Robbin Zhao
 
Php Webservers
Php WebserversPhp Webservers
Php Webserverssamon127
 
Wamp环境下安装 wordpress
Wamp环境下安装 wordpressWamp环境下安装 wordpress
Wamp环境下安装 wordpressstrugglesmen
 
Nodejs api server_implement
Nodejs api server_implementNodejs api server_implement
Nodejs api server_implementChi-wen Sun
 
Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹My own sweet home!
 
第十二章解答
第十二章解答第十二章解答
第十二章解答jiannrong
 
超。光速 網站最佳化實戰 -twMVC#8
超。光速 網站最佳化實戰 -twMVC#8超。光速 網站最佳化實戰 -twMVC#8
超。光速 網站最佳化實戰 -twMVC#8twMVC
 
使用Rpm&yum进行基础软件管理
使用Rpm&yum进行基础软件管理使用Rpm&yum进行基础软件管理
使用Rpm&yum进行基础软件管理haiyuan ning
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程Simon Su
 
使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率Zhen Li
 
Javascript stacktrace
Javascript stacktraceJavascript stacktrace
Javascript stacktracecazhfe
 
PHP 應用之一 socket funion : 偽 WEB Server
PHP 應用之一 socket funion : 偽 WEB ServerPHP 應用之一 socket funion : 偽 WEB Server
PHP 應用之一 socket funion : 偽 WEB Server志賢 黃
 

La actualidad más candente (19)

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

Destacado

Slideshare
SlideshareSlideshare
Slidesharemmehtala
 
I like this bag
I like this bagI like this bag
I like this bagechimeg
 
Herelegdehvvn word
Herelegdehvvn wordHerelegdehvvn word
Herelegdehvvn wordechimeg
 
谈谈模块化
谈谈模块化谈谈模块化
谈谈模块化衡锋 阳
 
Halloween 2011
Halloween 2011Halloween 2011
Halloween 2011jimmypolk
 
Hereglegdehvvn
HereglegdehvvnHereglegdehvvn
Hereglegdehvvnechimeg
 
I like this bag
I like this bagI like this bag
I like this bagechimeg
 

Destacado (9)

Slideshare
SlideshareSlideshare
Slideshare
 
Tangramgrid
TangramgridTangramgrid
Tangramgrid
 
I like this bag
I like this bagI like this bag
I like this bag
 
Herelegdehvvn word
Herelegdehvvn wordHerelegdehvvn word
Herelegdehvvn word
 
谈谈模块化
谈谈模块化谈谈模块化
谈谈模块化
 
Halloween 2011
Halloween 2011Halloween 2011
Halloween 2011
 
Web绘图
Web绘图Web绘图
Web绘图
 
Hereglegdehvvn
HereglegdehvvnHereglegdehvvn
Hereglegdehvvn
 
I like this bag
I like this bagI like this bag
I like this bag
 

Similar a Javascript加载总结

PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServHt Wang
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践longhao
 
客户端存储与计算
客户端存储与计算客户端存储与计算
客户端存储与计算xiaotao ning
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践self study
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践rewinx
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践Frank Cai
 
那些年,我们一起跨过域
那些年,我们一起跨过域那些年,我们一起跨过域
那些年,我们一起跨过域ksky521
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5 Tony Deng
 
Web开发基础
Web开发基础Web开发基础
Web开发基础dynaturtle
 
51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundryHong Cai
 
如何使用 Xhprof 分析網站效能 (真實案例)
如何使用 Xhprof 分析網站效能 (真實案例)如何使用 Xhprof 分析網站效能 (真實案例)
如何使用 Xhprof 分析網站效能 (真實案例)Cyril Wang
 
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)Will Huang
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型裕波 周
 
钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具taobao.com
 
Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Gelis Wu
 

Similar a Javascript加载总结 (20)

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