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


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 获取对象 定位子对象
May 31 Javascript
基于jquery的合并table相同单元格的插件(精简版)
Apr 05 Javascript
jquery队列函数用法实例
Dec 16 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
ECMAScript6中Set/WeakSet详解
Jun 12 Javascript
深入理解jQuery事件绑定
Jun 02 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
Aug 15 Javascript
js实现拖拽功能
Mar 01 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
Oct 24 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 jQuery
用原生JS实现爱奇艺首页导航栏代码实例
Sep 19 Javascript
浅谈Vue组件单元测试究竟测试什么
Feb 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
德劲1103的维修打理经验
2021/03/02 无线电
PHP安全配置
2006/12/06 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
2014/02/23 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
js style动态设置table高度
2014/10/21 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
pandas删除指定行详解
2019/04/04 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
创业融资计划书
2014/04/25 职场文书
难忘的一课教学反思
2014/04/30 职场文书
工厂搬迁方案
2014/05/11 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
高一语文教学反思
2016/02/16 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android