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


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 相关文章推荐
基于jQuery的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
Aug 31 Javascript
jquery验证手机号是否正确实例讲解
Nov 17 Javascript
JavaScript的instanceof运算符学习教程
Jun 08 Javascript
vue.js初学入门教程(2)
Nov 07 Javascript
js代码实现下拉菜单【推荐】
Dec 15 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 Javascript
js实现抽奖效果
Mar 27 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
基于vue-upload-component封装一个图片上传组件的示例
Oct 16 Javascript
egg.js的基本使用和调用数据库的方法示例
May 18 Javascript
JQuery中的常用事件、对象属性与使用方法分析
Dec 23 jQuery
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
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
php GeoIP的使用教程
2011/03/09 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
javascript 写类方式之一
2009/07/05 Javascript
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
总结js函数相关知识点
2018/02/27 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
详解Python import方法引入模块的实例
2017/08/02 Python
详解python中的 is 操作符
2017/12/26 Python
python+opencv实现动态物体追踪
2018/01/09 Python
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
Python用字典构建多级菜单功能
2019/07/11 Python
Python是什么 Python的用处
2020/05/26 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
计算机应用应届生求职信
2014/07/12 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书