作者:zccst
在 CMD 规范中,一个模块就是一个文件。代码的书写格式如下:
define(factory);
define Function
define 是一个全局函数,用来定义模块。
define define(factory)
define 接受 factory 参数,factory 可以是一个函数,也可以是一个对象或字符串。
factory 为对象、字符串时,表示模块的接口就是该对象、字符串。比如可以如下定义一个 JSON 数据模块:
define({ "foo": "bar" });
也可以通过字符串定义模板模块:
define('I am a template. My name is {{name}}.');
factory 为函数时,表示是模块的构造方法。执行该构造方法,可以得到模块向外提供的接口。factory 方法在执行时,默认会传入三个参数:require、exports 和 module:
define(function(require, exports, module) {
// 模块代码
});
define define(id?, deps?, factory)
define 也可以接受两个以上参数。字符串 id 表示模块标识,数组 deps 是模块依赖。比如:
define('hello', ['jquery'], function(require, exports, module) {
// 模块代码
});
id 和 deps 参数可以省略。省略时,可以通过构建工具自动生成。
注意:带 id 和 deps 参数的 define 用法不属于 CMD 规范,而属于 Modules/Transport 规范。
define.cmd Object
一个空对象,可用来判定当前页面是否有 CMD 模块加载器:
if (typeof define === "function" && define.cmd) {
// 有 Sea.js 等 CMD 模块加载器存在
}
1,require
require(id);
require.async(id, callback);异步加载
require.resolve(id);不加载模块,仅仅将短串解析成完整路径
2,exports 是一对象,用来向外提供模块接口
define(function(require, exports){
exports.foo = "bar";
exports.doSomethin = function(){};
});
还可以通过return对外提供接口
define(function(require, exports){
return {
foo : "bar";
exports.doSomethin : function(){};
};
});
还可以写成module.exports
define(function(require, exports){
module.exports = {
foo : "bar";
exports.doSomethin : function(){};
};
});
提示:exports 仅仅是 module.exports 的一个引用。在 factory 内部给 exports 重新赋值时,并不会改变 module.exports 的值。因此给 exports 赋值是无效的,不能用来更改模块接口。
3,module 是一个对象,存储了与当前模块相关联的一些属性和方法
module.id String
模块的唯一标识。
define('id', [], function(require, exports, module) {
// 模块代码
});
上面代码中,define 的第一个参数就是模块标识。
module.uri String
根据模块系统的路径解析规则得到的模块绝对路径。
define(function(require, exports, module) {
console.log(module.uri);
// ==> http://example.com/path/to/this/file.js
});
一般情况下(没有在 define 中手写 id 参数时),module.id 的值就是 module.uri,两者完全相同。
module.dependencies Array
dependencies 是一个数组,表示当前模块的依赖。
module.exports Object
当前模块对外提供的接口。
传给 factory 构造方法的 exports 参数是 module.exports 对象的一个引用。只通过 exports 参数来提供接口,有时无法满足开发者的所有需求。 比如当模块的接口是某个类的实例时,需要通过 module.exports 来实现:
define(function(require, exports, module) {
// exports 是 module.exports 的一个引用
console.log(module.exports === exports); // true
// 重新给 module.exports 赋值
module.exports = new SomeClass();
// exports 不再等于 module.exports
console.log(module.exports === exports); // false
});
注意:对 module.exports 的赋值需要同步执行,不能放在回调函数里。下面这样是不行的:
// x.js
define(function(require, exports, module) {
// 错误用法
setTimeout(function() {
module.exports = { a: "hello" };
}, 0);
});
在 y.js 里有调用到上面的 x.js:
// y.js
define(function(require, exports, module) {
var x = require('./x');
// 无法立刻得到模块 x 的属性 a
console.log(x.a); // undefined
});
分享到:
相关推荐
JavaScript CMD规范整理
seajs常见配置解析和常见插件的使用。sea.js,seajs-css.js,seajs-debug.js,seajs-preload.js,seajs-log.js等
sea.js遵循CMD规范,用于实现js在浏览器端的模块化开发。 sea.js中只有局部require。
本篇文章给大家介绍js模块规范之AMD规范和CMD规范,模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式,对js amd cmd规范感兴趣的童鞋可以来本文学习
HaloJS 是一款基于ZeptoJS并采用 CMD 规范面向移动端提供各种实用工具的组件库
一个用于 fangfis(CMD) 模块合并工具的 gulp 插件,支持异步调用模块合并
NULL 博文链接:https://shuizhongyue.iteye.com/blog/2197210
CMD规范示例DEMO
同时还有CMD规范,为同步加载方案如seaJS。 ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。 ES6模块主要有两个功能:...
中国机车远程监测与诊断系统(CMD系统)总体暂行技术规范。cmd系统。总体技术规范。 中国机车远程监测与诊断系统(以下简称CMD系统)的基本原则、技术要求、车载子系统、数据传输子系统和地面综合应用子系统等。 本...
简单分页插件simplePagination改造为CMD规范模块 http://blog.csdn.net/qinshenxue/article/details/43561691
modJS是一个精简版的AMD/CMD规范,并不完全遵守AMD/CMD规范,目的在于希望给使用者提供一个类似nodeJS一样的开发体验,同时具备很好的线上性能。 使用define来定义一个模块: define (id, factory) 在平常开发中,...
JRaiser加载器基于CMD规范,提供了良好的模块封装、调用机制,在利于功能分解的同时,也让您在复杂的模块依赖关系中解脱。JRaiser自带的功能模块可以简化各种前端应用的构筑过程,您也可以基于这些模块,为独特的...
中国机车远程监测与诊断系统(CMD系统)地面综合应用子系统暂行技术规范(印发稿)DOC.pdf中国机车远程监测与诊断系统(CMD系统)地面综合应用子系统暂行技术规范(印发稿)DOC.pdf
3.CMD规范 通用模块定义 规范实现者: seaJS 服务端和浏览器通用 官方模块规范 1.ESM规范 就是ES6 Module 各浏览器和服务端 目前常用的就是浏览器端的RequireJS、NodeJS、以及ESM CommonJS语法分析 module....
现在js的module规范里面,很大一部分都是遵循AMD规范,但是还有很多一部分在使用seajs的CMD规范,以及阿里系的KISSY的module规范(我们对其简称KMD)。 那么,其实我们可以用遵循AMD规范的module,然后把它适配到能...
fis3 已经默认不自带模块化开发支持,那么如果需要采用 cmd 规范作为模块化开发,请使用此插件。 请配合 sea.js 一起使用。 注意:需要对目标文件设置 isMod 属性,说明这些文件是模块化代码。 fis.match('/modules/...
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结.docx
如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已。 现在就看看吧,这些规范到底是啥东西,干嘛的。