论坛首页 Web前端技术论坛

dojo的包加载机制

浏览 13485 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-05-07  
dojo利用ajax技术,基本实现的按需要下载js文件,估计与国内jsvm有类似功能(jsvm好久没关注了,不好乱说)。
   a、类库开发人员可以在dojo基础上开发自己的javascript类库。(dojo提供的够多的了,并不断扩大) 
   b、可以按照每个页面的需要,加载有限的类库。
   c、提供了很好的package机制。与java不同,采用dojo的包机制有一定写法要求。见后面说明。
   d、急剧缩小了类库大小。以前写过篇 (乱评prototype.js)中提到过。其实dojo不象我们想的那么庞大,只需要bootstrap1.js  hostenv_browser.js  bootstrap2.js实现底层代码,其它功能代码按需下载。很担忧propotype.js的不断庞大啊。
   发表时间:2006-05-07  
包加载机制源码解读
   其实包加载机制只用到bootstrap1.js  hostenv_browser.js  bootstrap2.js这三个文件。 大家可以看我 例子中 lang.htm ,动态的取lang.js,然后调用函数。使用上也比较简单。 例子中我加了些注释,欢迎大家拍砖。以下我说下个文件作用,以及dojo.require("");函数调用流程。
   bootstrap1.js 启动dojo的第一段代码,定义了些全局变量和全局函数。主要定义了dojo.hostenv”接口“,分别由hostenv_*.js来实现。dojo并不只用在网页环境中。
   hostenv_browser.js,浏览器环境下实现dojo.hostenv的某些方法。根据navigator对象判断当前浏览器的版本,类型,支持的插件....(见dojo.render对象)。还给window.onload()方法注册了dojo的几个方法。
   bootstrap2.js  定义了几个面向类库使用者的几个方法。主要有  dojo.require  dojo.provide 等。这些方法其实调用bootstrap1.js中的方法。
   当我们调用
   dojo.require("dojo.lang");时,有以下几个流程。
   a、dojo.hostenv.loadModule方法,在bootstrap1.js中,根据传入的参数如dojo.lang,转化成文件名  src/lang.js文件。(当然对于失败流程,如cache检查,异常处理等,这不具体细诉了)
   b、dojo.hostenv.loadPath方法,得到javascript文件的url,用xmlhttp得到js文件的内容,eval(s)执行,相当于引入了该文件。
   c、写入cache,加标识等后续方法。告诉dojo,我们加载过这个模块了。
   d、关于dojo的根文件路径比较麻烦,请读 hostenv_browser.js 中设置djConfig["baseScriptUri"] 部分。xmlhttp中js的url是  getBaseScriptUri()+getModulePrefix+lang.js(''+'src'+'/lang.js')  组成。
   具体dojo流程还是比较复杂的,还支持dojo.lang.*等,复杂的处理。
0 请登录后投票
   发表时间:2006-05-07  
如何让dojo加载自己的类库
   我在附件中包括一个简单的例子(有中文问题)。有以下几个注意的地方。
   a、一定要引入bootstrap1.js  hostenv_browser.js  bootstrap2.js三个文件。dojo下载压缩包里的dojo.js包括了这三个文件,但也包括可许多你可能用不到的类库(lang io等)
   b、设置你的类库”包名“。如dojo.setModulePrefix('com.founder','javascript');说明com.founder包下文件都在javascript文件夹下建立。 你的类库必须放到javascript文件夹下面。
   c、你的类库文件。如javascript/myjs.js文件,必须首先声名 dojo.provide("com.founder.myjs");你的类库必须以com.founder.myjs开头。
   d、你的函数或变量必须定义为com.founder.myjs.fun。
   e、当你调用的时候,只需dojo.require("com.founder.myjs");。这样,myjs.js文件会下载到本地。可以直接应用了。

关于自己完成自己的类库,建议先多读读dojo的其他代码吧。这样才能更好的应用dojo包机制。应用了dojo,可能javascript的写法上与平时绝对不一样,但请注意,dojo千万别乱用,就google dojo中文文档很少,估计国内系统也没什么用的吧。
0 请登录后投票
   发表时间:2006-05-07  
a、javascript类库的文档实在不好弄,就dojo官方网站上转半天也找不到个系统的介绍,中文文档也很少。maillist到是挺活跃的。不看源代码能用好dojo我估计悬。
b、dojo野心极大,需要做的工作还很多。无形中加大dojo的应用难度。就象java中的spring,还好有EJB这个垫脚石。可dojo,推广难度不小啊。
c、下载包中压缩版dojo.js包括了../src/bootstrap1.js,../src/hostenv_browser.js,../src/bootstrap2.js,../src/lang.js,../src/string.js,../src/io.js,../src/dom.js,../src/io/BrowserIO.js,../src/event.js,../src/event/topic.js,../src/event/browser.js,../src/event/__package__.js,../src/alg/Alg.js,../src/alg/__package__.js,../src/uri/Uri.js,../src/math.js,../src/graphics/color.js,../src/style.js,../src/html.js,../src/math/curves.js,../src/animation/Animation.js,../src/animation/__package__.js,../src/fx/html.js,../src/fx/__package__.js,../src/graphics/htmlEffects.js,../src/graphics/__package__.js

这么多个文件,140k。其实也不大,但包括了很多模块。估计dojo的定位就是开发"One page One Application"吧。一般的web应用程序prototype.js就够了。
d、dojo上手相对较难,不象prototype.js。(虽然它们不是一类型的项目,但我喜欢拿一块比较,原因之一是它们没有服务器端的功能)。我相信dojo提供的功能能够覆盖prototype.js,或者我们可以自己把prototype.js移植到dojo.
0 请登录后投票
   发表时间:2006-05-07  
例子代码

http://www.blogjava.net/Files/zkjbeyond/myDojo.rar
0 请登录后投票
   发表时间:2006-05-10  
果然好东西,感谢lz贡献
0 请登录后投票
   发表时间:2006-05-22  
dojo很好用的,如果使用,最好订阅maiinglist。
dojo绝对超出了prototype的范围的。最新的dojo的文档还算可以了。我现在用它为基础做自己的ui组件,很爽的。
刚接触是有些难度,不过只要越过开始那道坎,后面还是一路顺风的。
纠正一个小错误:
d、你的函数或变量必须定义为com.founder.myjs.fun。
这个是不一定需要的,前提是你的包com.founder.myjs已经定义过了。


已经定义了包空间。
另外,如果js中使用了中文,那需要将js用utf8编码,
否则会乱码(当你使用dojo.require),除非apache设置defaultcharset。
0 请登录后投票
   发表时间:2006-06-04  
读取根目录下 dojo.js文件。 文件名必须是dojo.别的有问题。见hostenv_browser.js hostenv_browser.js 58行 if(((djConfig["baseScriptUri"] == "" ,dojo是关键字.要不手工配置baseScriptUri
DEBUG:  loadModule 方法开始。 参数:dojo.lang
DEBUG:  relpath:dojo/lang.js
DEBUG:  parentModule:dojo
DEBUG:  parentModulePath:mysrc
DEBUG:  syms:mysrc,lang
DEBUG:  nsyms:dojo,lang
DEBUG:  last:lang
DEBUG:  正式开始
DEBUG:  结尾不是*
DEBUG:  relpath:mysrc/lang.js
DEBUG:  modulename:dojo.lang
DEBUG:  failed loading  mysrc/lang.js  with error:  [TypeError: Access is denied.
]
DEBUG:  ok:false
DEBUG:  failed loading  mysrc.js  with error:  [TypeError: Access is denied.]
DEBUG:  failed loading  __package__.js  with error:  [TypeError: Access is denied.
]
FATAL: Could not load 'dojo.lang'; last tried '__package__.js'



以上是执行你的例子时的报错,但是这些程序在IE6中运行正常。请问我应该如何解决这个问题?哪个地方需要调整?
0 请登录后投票
   发表时间:2006-11-21  
好东西,感谢贡献者.
下载包中压缩版dojo.js包括了../src/bootstrap1.js,../src/hostenv_browser.js,../src/bootstrap2.js.可是我用<script type="text/javascript" src="../dojo/dojo.js"></script>
代替
<script type="text/javascript" src="mysrc/bootstrap1.js"></script>
<script type="text/javascript" src="mysrc/hostenv_browser.js"></script>
<script type="text/javascript" src="mysrc/bootstrap2.js"></script>
发现在引入自定义类(如你的com.founder.myjs)时有问题
这是为什么呢?
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics