RequireJs中的id模块和接口定义

149 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

引入具有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";
})