dojo.require 详解
前端之家收集整理的这篇文章主要介绍了
dojo.require 详解,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Dojo 提供了一个非常强大的javascript控件库. 在使用dojo之前,用户基本上不需要具备任何基础知识. 你可以用script远程链接到dojo(dojo.js),也可以把dojo.js下载到本地并用script标签加载.
如果你不太了解dojo,可以参考一下如下资料:
大体上,dojo.js和jquery.js 或者 prototype js,里面有很多开发web应用的常用的特性: 包括:
- JavaScript Language Helpers
- Object 工具
- Array 工具
- DOM 操作
- 标准的事件机制
- Ajax & 跨域请
- JSON 工具
- 简单特效
- 浏览器兼容
不仅如此,dojo还有很多其他javascript库(jquery,ext等等)所不具有的功能. 其中一个很重要的功能就是模块化的机制 - 模块系统(dojo.require()
). JavaScript 和 浏览器本身以及其他的javascript库并不支持这种特性,dojo很好的解决了这种问题.
模块系统
dojo.require('my.module')
用于加载javascript文件,功能类似于script标签的作用.
假设你有一个本地的开发环境,目录结构如下:(http://localhost:8888
.)
index.html
是一个包含dojo.js 简单页面
.
<!DOCTYPE html>
<html lang=”en”>
<head>
<
Meta charset=”utf-8″ />
<title>Dojo</title>
</head>
<body>
<script src=”dojo/dojo.js”></script>
</body>
</html>
假设我们要用Flickr API获取数据,这时候,我们就要用到跨域请求,但是这些功能模块并不是在dojo base库里面,我们需要另外加载所需的dojo模块:
<!DOCTYPE html>
<html lang=”en”>
<head>
<Meta charset=”utf-8″ />
<title>Dojo</title>
</head>
<body>
<script src=”/dojo/dojo.js”></script>
<script src=”/dojo/io/script.js”></script>
</body>
</html>
这里我们可以用script
标签解决这种问题,同样还有另外一种方式,这种方式体现了模块系统的宗旨: 我们用
dojo.require()
加载
dojo.io.script
<!DOCTYPE html>
<html lang=”en”>
<head>
<Meta charset=”utf-8″ />
<title>Dojo</title>
</head>
<body>
<script src=”/dojo/dojo.js”></script>
<script>
dojo.require(”dojo.io.script”);
//Note: do not include the .js
</script>
</body>
</html>
通过
dojo.require()
我们获得了一个模块系统,它提供了一系列我们开发复杂web2.0页面所需要的组件. 接下来的内容我们会着重介绍模块系统的特性:
首先,dojo.require()会避免重复加载,如果script脚本被浏览器缓存了,dojo会调用缓存的资源从而避免不必要的http请求,事实上,你可以随便调用
dojo.require(),不管调用了多少
dojo.require(),dojo都会保证同样的模块只会被加载一次.
我们也可以创建自己的模块. 让我们回到Flickr API的例子,我们要开发一个用Flickr数据的大型web应用,我们需要能很好的组织和管理这些javascript代码. 归根结底,我们需要创建名为flickrApp的命名空间用于保存所有该应用的逻辑功能. 为了达到这个目的,我们更新原有的目录结构,创建一个flickrApp.js文件:
flickrApp.js看起来似乎仅仅是一个js文件,但如果你用dojo的眼光来看他,你会发现他其实应该是一个模块,为了让dojo识别他是这个模块,我们用
dojo.provide()
方法初始化这个js文件,将其变为一个dojo的模块. 我们加入如下代码到 flickrApp.js 文件中:
- dojo.provide(”flickrApp“);
dojo.provide()
创建了一个以你传入的字符串(flickrApp
)命名的对象结构(名字空间), 我们这里是创建了一个名为flickrApp的对象,该对象创建后,我们便可以像定义该对象的各个属性一样来定义该应用(
flickrApp
)
的各个方面,下面是 flickrApp.js 一个例子:
- dojo.provide(”flickrApp”);
-
- flickrApp.getData=function(){};
现在我们可以用
dojo.require()
来加载我们
自定义的模块到HTML
页面上:
<!DOCTYPE html>
<html lang=”en”>
<head>
<
Meta charset=”utf-8″ />
<title>Dojo</title>
</head>
<body>
<script src=”/dojo/dojo.js”></script>
<script>
dojo.require(”dojo.io.script”);
dojo.require(”flickrApp”);
</script>
</body>
</html>
问题来了, dojo是怎么知道flickrApp.js模块的文件系统中存放的位置的呢? 答案就是dojo的路径管理机制, dojo会根据你传入
dojo.provide()
的字符串来定位该模块的位置,基准点是dojo.js的上一级目录, 比如dojo.js在
http://localhost:8888/dojo/dojo.js,所以dojo会在
http://localhost:8888/这个目录级别(dojo.js的上一级)来定位所有的模块。 为了说明这个问题, 我们现在来再一次改变例子的文件结构,使其看起来
更加具有组织性,如下:
此时,所有的应用相关的代码都在flickrApp这个目录(名字空间)下,在这个目录下,我们可以更进一步将该应用切分成不同的模块。第一个模块就是data.js模块,包含获取
Flickr数据的逻辑功能,以及跨域,返回数据等等功能。基于这个改变,我们需要在data.js里面加入
dojo.provide()语句来告诉他新的目录结构的改变,如下(
data.js
):
copy