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


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 相关文章推荐
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
Dec 29 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
Jul 31 Javascript
javascript中处理时间戳为日期格式的方法
Jan 02 Javascript
JavaScript中的无阻塞加载性能优化方案
Oct 10 Javascript
jQuery中hover与mouseover和mouseout的区别分析
Dec 24 Javascript
js获取所有checkbox的值的简单实例
May 30 Javascript
微信小程序 数组中的push与concat的区别
Jan 05 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
Apr 21 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
Aug 23 Javascript
微信小程序如何像vue一样在动态绑定类名
Apr 17 Javascript
Vue中的循环及修改差值表达式的方法
Aug 29 Javascript
Javascript前端下载后台传来的文件流代码实例
Aug 18 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
php 获取全局变量的代码
2011/04/21 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
详解Nuxt.js 实战集锦
2019/11/19 Javascript
Python基于twisted实现简单的web服务器
2014/09/29 Python
python os.path模块常用方法实例详解
2018/09/16 Python
Python while循环使用else语句代码实例
2020/02/07 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
.NET常见笔试题集
2012/12/01 面试题
应届生体育教师自荐信
2013/10/03 职场文书
工作总结与自我评价
2014/09/18 职场文书
出差报告格式模板
2014/11/06 职场文书
奔腾年代观后感
2015/06/09 职场文书
升学宴祝酒词
2015/08/11 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
MySQL慢查询优化解决问题
2022/03/17 MySQL
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫