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


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 相关文章推荐
基于Web标准的UI组件 — 树状菜单(2)
Sep 18 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
Aug 25 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
Nov 13 Javascript
javascript在子页面中函数无法调试问题解决方法
Jan 17 Javascript
JavaScript中的Web worker多线程API研究
Dec 06 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
Aug 15 Javascript
javascript每日必学之继承
Feb 23 Javascript
JavaScript实现Java中Map容器的方法
Oct 09 Javascript
详解使用webpack打包编写一个vue-toast插件
Nov 08 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
Dec 26 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
Apr 12 jQuery
vuejs数据超出单行显示更多,点击展开剩余数据实例
May 05 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
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
TensorFlow高效读取数据的方法示例
2018/02/06 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
python logging添加filter教程
2019/12/24 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
keras导入weights方式
2020/06/12 Python
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
课堂教学改革实施方案
2014/03/17 职场文书
青春无悔演讲稿
2014/05/08 职场文书
建筑管理专业求职信
2014/07/28 职场文书
2014年大学生工作总结
2014/11/20 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
院系推荐意见
2015/06/05 职场文书
勇敢的心观后感
2015/06/09 职场文书
经销商会议开幕词
2016/03/04 职场文书
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL