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


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帮助之CSS尺寸(五)outerHeight、outerWidth
Nov 14 Javascript
JS中获取函数调用链所有参数的方法
May 07 Javascript
javascript实现base64 md5 sha1 密码加密
Sep 09 Javascript
一不小心就做错的JS闭包面试题
Nov 25 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
May 27 Javascript
深入浅析JavaScript中的scrollTop
Jul 11 Javascript
JS通过调用微信API实现微信支付功能的方法示例
Jun 29 Javascript
JavaScript反弹动画效果的实现代码
Jul 13 Javascript
angular2中使用第三方js库的实例
Feb 26 Javascript
基于vue 动态菜单 刷新空白问题的解决
Aug 06 Javascript
详解如何在Javascript中使用Object.freeze()
Oct 18 Javascript
vue2实现provide inject传递响应式
May 21 Vue.js
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
三个类概括PHP的五种设计模式
2012/09/05 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
python tkinter界面居中显示的方法
2018/10/11 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
python Opencv计算图像相似度过程解析
2019/12/03 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
python学习笔记之多进程
2020/08/06 Python
Python利用命名空间解析XML文档
2020/08/10 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
个人素质的自我评价分享
2013/12/16 职场文书
个人自我评价分享
2013/12/20 职场文书
交通安全演讲稿
2014/01/07 职场文书
《掌声》教学反思
2014/02/23 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
2014年教师教学工作总结
2014/11/08 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
2016年春节问候语
2015/11/11 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python
 python中的元类metaclass详情
2022/05/30 Python