查看dojo源码过程中,发现这三个模块名并不以dojo、dijit、dojox开头,在dojo加载器中属于特殊模块名。

  

  

  require

  这是一个上下文智能的加载器。

  我们通过dojoConfig配置了一个package:myApp,现在对myApp目录下的文件可以使用如下方式请求:

// this is "myApp/topLevelHandlers"
define(["dojo"], function(dojo){
dojo.connect(dojo.byId("debugButton"), "click", function(){
require(["myApp/perspectives/debug"], function(perspective){
perspective.open();
});
});
});

  通过全局的require函数请求一个myApp包下的文件仍然用“包名+文件路径”的形式。如果我们希望像define那样使用相对路径加载模块:reqiure(['./perspectives/debug'], function(){debug});而require是无法找到“./perspectives/debug”这个module的。这时就轮到这个上下文智能的require模块上场了。

// this is "myApp/topLevelHandlers"
define(["dojo", "require"], function(dojo, require){
dojo.connect(dojo.byId("debugButton"), "click", function(){
require(["./perspectives/debug"], function(perspective){
perspective.open();
});
});
});

  通过引用reqire模块代替全局require函数,我们可以使用相对路径来加载模块,这就是上下文智能。

exports

  exports这个模块的作用与node.js中exports的作用类似,用于导出当前模块的方法或者变量。在node中它是唯一导出的出口,但是在dojo中我们可以直接在模块中返回一个对象字面量。

define([], function(){
return {
someProperty:"hello",
someOtherProperty:"world"
};
}); define(["exports"], function(exports){
exports.someProperty = "hello";
exports.someOtherProperty = "world";
});

  一般情况下,这两种写法都相同,但是在发生循环依赖情况下,使用exports dojo的加载器可以判断出模块是否加载完毕,而不是出于死锁状态。

module

  

  module引用module模块会返回一个对象,该对象有三个参数:
  • id:一个唯一的模块id,在程序中唯一标识一个模块;require([module.id], function(m){}); m代表了该id所对应的模块;这个属性在一些需要需要根据模块id与一个计数器拼接起来的功能时常用到,比如dojo/request/script中callback参数

  • uri:代表该模块的绝对url路径
  • exports:该属性同上文exports模块作用类似。稍有区别就是我们可以通过该属性让exports指向一个新的对象(通常是一个函数)。类似node中改变模块中exports引用。
define(“myModule”,["module"], function(module){
module.exports = dojo.declare(/*...*/);
});

  原来的exports属性是一个对象,现在是一个类。下次引用该模块时就可以用来实例化对象。

define(["myModule"], function(MyModule){
var m = new MyModule();
});

  

  这三个特殊的module是dojo用来兼容其他CommonJs类库时使用。比如将dojo集成进node,这是另一篇文章要将的。

require、module、exports dojo中的三个特殊模块标识的更多相关文章

  1. 探讨ES6的import export default 和CommonJS的require module.exports

    今天来扒一扒在node和ES6中的module,主要是为了区分node和ES6中的不同意义,避免概念上的混淆,同时也分享一下,自己在这个坑里获得的心得. 在ES6之前 模块的概念是在ES6发布之前就出 ...

  2. Node.js中exports与module.exports的区别

    原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html 你肯定对Node.js模块中用来创建函数的exports对象很 ...

  3. Node.js中的exports与module.exports的区分

    1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 3. exports.a = xxx 会将修改更新到mod ...

  4. module.exports,exports,export和export default,import与require区别与联系【原创】

    还在为module.exports.exports.export和export default,import和require区别与联系发愁吗,这一篇基本就够了! 一.首先搞清楚一个基本问题: modu ...

  5. module.exports小程序模块化,require

    小程序模块化 可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块.模块只有通过 module.exports 或者 exports 才能对外暴露接口. tips:exports 是 mo ...

  6. nodejs 中 module.exports 和 exports 的区别

    1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 3. exports.a = xxx 会将修改更新到mod ...

  7. module.exports,exports,export和export default,import与require区别与联系

    还在为module.exports.exports.export和export default,import和require区别与联系发愁吗,这一篇基本就够了! 一.首先搞清楚一个基本问题: modu ...

  8. export,export default,module.exports,import,require之间的区别和关联

    module.exports Node 应用由模块组成,采用 CommonJS 模块规范.根据这个规范,每个文件就是一个模块,有自己的作用域.在这些文件里面定义的变量.函数.类,都是私有的,对外不可见 ...

  9. CommonJS 规范中的 module、module.exports 区别

    CommonJS 规范中的 module.module.exports 区别 CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的exports属性(即mod ...

随机推荐

  1. Linux系统调用

    在前面,我们接触到了很多函数能够实现系统相关的功能,比如解析命令行参数.控制进程以及映射内存等等.实际上,这些函数能够分为两大类: 库函数--这些函数就像普通函数一样,参数放置在寄存器或者栈里,运行时 ...

  2. [front]有效开展一个前端项目

    今天的前端如果没有用到 npm,效率是比较低的:所以要从使用的工具来讲. 1. 一切都依赖于 nodejs: 下载一个 linux 的源码包就可以开始安装了. $ wget https://nodej ...

  3. iis 500.19错误解决过程记录

    前段时间一直在纠结C#中,dll的管理问题.最后选择使用nugetgallery进行公共库管理.项目地址:https://github.com/NuGet/NuGetGallery.这是一个nuget ...

  4. 全面总结Java泛型

    本文对Java泛型进行了全面的总结.文章内容包括普通泛型.通配符.受限泛型.泛型接口.泛型方法.返回泛型类型实例等等. 虽然Scala创始人Martin Odersky说当年正是因为Java泛型的丑陋 ...

  5. <转>浅析长度为0的数组

    前面在看Xen的源码时,遇到了一段代码,如下所示: 注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?……这篇文章主要针对该 ...

  6. 4580: [Usaco2016 Open]248

    Description Bessie likes downloading games to play on her cell phone, even though she does find the ...

  7. Git 源代码管理工具

    Git 源代码管理工具 Git基本信息 Git :Git是一个“分布式”的版本控制工具 Git的作者是Linux之父 Linus Benedict Torvolds,当初开发Git仅仅是为了辅助Lin ...

  8. Linux 忘记root登录密码解决方法

    很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如下: 重启linux系统 3  ...

  9. 关于libsvm工具箱在64位matlab下的安装说明

    LIBSVM工具箱的安装 基本方法: 1.在网上下载LIBSVM工具箱. http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 2.将LIBSVM工具箱所在目录添加到MA ...

  10. sharepoint 网站创建

    打开开始菜单,右键sharepoint管理中心以管理员身份打开 打开管理web应用程序菜单,并新建web应用程序 新建web应用程序配置,大多数采用默认配置. 建议自定义端口号,URL的端口号和设置的 ...