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


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 对象、函数和继承
Jul 07 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
使用js显示当前时间示例
Mar 02 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
May 08 Javascript
Javascript 绘制 sin 曲线过程附图
Aug 21 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
Mar 04 Javascript
JS实现的打字机效果完整实例
Jun 20 Javascript
JavaScript每天必学之基础知识
Sep 17 Javascript
vue绑定设置属性的多种方式(5)
Aug 16 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
Oct 23 Javascript
JS制作简易计算器的实例代码
Jul 04 Javascript
微信小程序使用前置摄像头拍照
Oct 22 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
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
浅谈PHP中的那些魔术常量
2020/12/02 PHP
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
python发布模块的步骤分享
2014/02/21 Python
python实现图片素描效果
2020/09/26 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
C语言笔试集
2012/07/24 面试题
家长评语大全
2014/01/22 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
酒会开场白大全
2015/06/01 职场文书
法律意见书范文
2015/06/04 职场文书
欠款证明
2015/06/24 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL
Redis基本数据类型Set常用操作命令
2022/06/01 Redis