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


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 相关文章推荐
js使浏览器窗口最大化实现代码(适用于IE)
Aug 07 Javascript
js 采用delete实现继承示例代码
May 20 Javascript
微信支付如何实现内置浏览器的H5页面支付
Sep 25 Javascript
javascript编程异常处理实例小结
Nov 30 Javascript
JavaScript中的时间处理小结
Feb 24 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
深入理解JavaScript中的对象复制(Object Clone)
May 18 Javascript
JavaScript中apply方法的应用技巧小结
Sep 29 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
Apr 08 jQuery
为你的微信小程序体积瘦身详解
May 20 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
Jul 21 Javascript
jQuery实现的电子时钟效果完整示例
Apr 28 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
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
为什么JavaScript没有块级作用域
2016/05/22 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
2017/06/12 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
vue中的计算属性和侦听属性
2020/11/06 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
用python编写第一个IDA插件的实例
2018/05/29 Python
python学生管理系统
2019/01/30 Python
Python转换时间的图文方法
2019/07/01 Python
python迭代器常见用法实例分析
2019/11/22 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
数控专业大学生的自我鉴定
2013/11/13 职场文书
辅导员评语
2014/05/04 职场文书
十八大演讲稿
2014/05/22 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
图神经网络GNN算法
2022/05/11 Python
详解CSS3浏览器兼容
2022/12/24 HTML / CSS