小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
引入具有id的模块
当一个模块没有id的时候可以直接引入
当一个模块有id,此时无法直接引入
第一步要在模块依赖集合中加载模块文件
第二步通过require方法指定id(require是异步方法)
comminjs规范不能加载具有id的模块
举例:
// 加载具有id的模块
define(["dom", "require"], function(dom, require) {
require(["myId"], function(dom) {
console.log(dom)
});
})
dom.js
define("myId", {
color: "red"
})
模块的覆盖关系
如果一个模块文件中有两个没有id的模块,前面的覆盖后面的模块
如果模块文件中有两个相同id的模块, 前面的覆盖后面的模块
如果一个模块文件中有两个不同id的模块,是可以同时存在的
// 两个没有id的模块
define({
a: 2
})
define({
a: 1
})
// 有两个相同id的模块
define("myId", {
a: 2
})
define("myId", {
a: 1
})
// 两个不同id的模块
define("myId1", {
a: 1
})
define("myId2", {
a: 2
})
接口定义
在seajs中定义接口的方式:
exports.接口
module.exports.接口
module.exports = 值类型
module.exports = 对象
module.exports = 函数
以上方式都是基于commonjs规范, requirejs同样适用
return 值类型
return 对象
return 函数
以上三种方式,是基于(module transports)规范的,因为不依赖于 require, exports, module
开发更灵活
define 可以接受值类型
不能接受字符串
除了以上十种方式,当模块函数中注入exports和module的时候,作用域是向外暴露功能的对象,
因为可以通过this向外暴露接口
// 定义模块
define(function(require, exports, module) {
// console.log(this);
// console.log(arguments);
// 这种方式绝对不允许
exports = {
}
})
// // commonjs
define(function(require, exports, module) {
// 第一种
exports.a = 1;
module.exports.a = 1;
module.exports = 123;
module.exports = {
a: 1,
b: 2
}
// 5
module.exports = function() {}
})
// module transports
define(function() {
return 123;
return {
a: 1,
b: 2
}
return function() {}
})
// 9
define(1);
define(true);
define("abc"); // 这种方式不允许
// 10
define({
a: 1,
b: 2
})
// this
define(function(require, exports, module) {
console.log(this);
console.log(arguments);
this.color = "red";
})