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


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创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
Jun 28 Javascript
禁用Tab键JS代码兼容Firefox和IE
Apr 18 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
Jun 06 Javascript
jquery动态加载js/css文件方法(自写小函数)
Oct 11 Javascript
Javascript 跨域知识详细介绍
Oct 30 Javascript
JavaScript 正则命名分组【推荐】
Jun 07 Javascript
JavaScript fetch接口案例解析
Aug 30 Javascript
webpack@v4升级踩坑(小结)
Oct 08 Javascript
基于layui框架响应式布局的一些使用详解
Sep 16 Javascript
详解vue-router的Import异步加载模块问题的解决方案
May 13 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 06 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
AUC计算方法与Python实现代码
2020/02/28 Python
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
建筑实习自我鉴定
2013/10/18 职场文书
教师自我反思材料
2014/02/14 职场文书
合作意向协议书范本
2014/03/31 职场文书
运动会标语
2014/06/21 职场文书
公司奖励通知
2015/04/21 职场文书
在职证明范本
2015/06/15 职场文书
六五普法心得体会2016
2016/01/21 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS