脚本安需导入(装载)的三种模式的对比


Posted in Javascript onJune 24, 2007

何谓安需装载?
    脚本程序一般都是下载后执行,当脚本库非常庞大时,一次性下载起来非常费时,传统的解决方式是,按功能模块把脚本写在不同的文件中,页面上手动加入 script标签装载指定内容,但是这有一些缺点,类库的使用者需要知道没个脚本之间的关系,顺序要求等等,而不可能要求每个类库使用者都对其非常熟悉,出错的可能性很大。于是很多框架开始支持导入指令,想使用什么一个导入函数就完了,不必一堆堆的script文件,不用小心翼翼的关注着他们的依赖关系。

安需装载的困境:
      早期安需装载(即时同步按需装载)有一个致命的弱点,浏览器阻塞问题。当按需装载某些类库时,通常通过XMLHttpRequest同步装载脚本文件实现,这种情况下,在资源下载完成之前,浏览器将停止响应用户事件、停止页面重画操作。如果网速很慢,这段时间将非常让人讨厌,就像是死机似的。

      以前的解决办法是,将常用类库资源直接打包到框架文件中,而按需导入就成了一个宣传的幌子,没有太多实际的价值。

安需装载可分如下三种模式:

l 即时同步按需装载 (阻塞,JSI、JSVM、dojo)。

最简单的按需装载实现,通过XMLHttpRequest同步装载脚本文件实现。问题是,浏览器使用这种方式同步获取资源时将导致浏览器阻塞:停止响应用户事件、停止页面重画操作。所以,虽然编程最为简单,但是用户体验最差。

 

2 异步按需装载(无阻塞,JSI2.0+)。

异步导入,不必多做解释,用户体验好,但是因为其异步特征,处理起来比较麻烦。

 

3 延迟同步按需装载(无阻塞,JSI2.0+)。

JSI通过动态预装载功能实现的一种同步获取资源的方法,虽然也是同步,但没有阻塞,可以算时兼顾易用性和用户体验的解决方按。缺点时有一定延迟,当前脚本标签中不可用。

       

 

使用方法(JSI示例)
    以一个代码语法着色程序为例:

类库位置:org/xidea/example/code/code.js

页面位置:example/xxx.html

 

即时同步按需装载

import("org.xidea.example.code.Code"); 

var code1 = new Code(); 

code1.id = "libCode"; 

code1.decorate();

 

异步按需装载

$import("org.xidea.example.code.Code",function(Code){        

var code1 = new Code();        

code1.id = "libCode";        

code1.decorate();  

})    

延迟同步按需装载(无阻塞,JSI2.0+)。

<script>"../scripts/boot.js"></script>    

<script>    

$import("org.xidea.example.code.Code",true);    

</script>    

    

<script>    

var code1 = new Code();    

code1.id = "pageCode";    

code1.decorate();    

</script>    

测试示例: 
地址:

http://jsintegration.sourceforge.net/example/code.html

http://www.xidea.org/project/jsi/example/code.html 

    示例都是jsi的默认示例,可以下载到本地运行,下载后最好能放到一个能受到网速限制的服务器上,只有这样才能看到阻塞的问题。

参考:
JSI 导入函数: function $import(path, callbackOrLazyLoad, target ) 

 

JSI2 预览版下载:http://groups.google.com/group/jsier/files

Javascript 相关文章推荐
JavaScript对IE操作的经典代码(推荐)
Mar 10 Javascript
Area 区域实现post提交数据的js写法
Apr 22 Javascript
java、javascript实现附件下载示例
Aug 14 Javascript
JavaScript简单实现鼠标移动切换图片的方法
Feb 23 Javascript
JavaScript兼容浏览器FF/IE技巧
Aug 14 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
Oct 31 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
Nov 14 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
Sep 06 Javascript
JavaScript适配器模式原理与用法实例详解
Mar 09 Javascript
JavaScript实现网页tab栏效果制作
Nov 20 Javascript
Javascript注入技巧
Jun 22 #Javascript
Stop SQL Server
Jun 21 #Javascript
用jscript启动sqlserver
Jun 21 #Javascript
List all the Databases on a SQL Server
Jun 21 #Javascript
Display SQL Server Version Information
Jun 21 #Javascript
Display SQL Server Login Mode
Jun 21 #Javascript
List the Stored Procedures in a SQL Server database
Jun 20 #Javascript
You might like
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
javascript写的一个链表实现代码
2009/10/25 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
Python中if __name__ == &quot;__main__&quot;详细解释
2014/10/21 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
逻辑链路控制协议
2016/10/01 面试题
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
开工典礼策划方案
2014/05/23 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
个人工作保证书
2015/02/28 职场文书
红与黑读书笔记
2015/06/29 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS