一、CMD(Common Module Definition)。CMD规范专门用于浏览器端,模块的加载是异步的,模块使用时才会加载执行。CMD规范整合了CommonJS和AMD规范的特点。在 Sea.js 中,所有 JavaScript 模块都遵循 CMD模块定义规范。

基本语法

一、定义暴露模块:define(function() { exports.xxx = value 或 module.exports = value}),

  1. //定义没有依赖的模块
  2. define(function(require, exports, module){
  3. exports.xxx = value
  4. module.exports = value
  5. })
//定义有依赖的模块
define(function(require, exports, module){
  //引入依赖模块(同步)
  var module2 = require('./module2')
  //引入依赖模块(异步)
  require.async('./module3', function (m3) {
  })
  //暴露模块
  exports.xxx = value
})

二、引入使用模块:require(xxx)

define(function (require) {
  var m1 = require('./module1')
  var m4 = require('./module4')
  m1.show()
  m4.show()
})

核心实现

// ajax
function myAjax(url, callback) {
    var xhr = new XMLHttpRequest()
  xhr.open('get', url)
  xhr.send()

  xhr.onreadystatechange = function () {
      if (request.readyState === 4) {
        if (request.status === 200) {
          return callback(request.responseText)
      } else {
          // ...
      }
    } else {
        // ...
    }
  }
}

function require(url) {
    myAjax(url, function (res) {
      // 此时res的对应JS的String形式
    // 解析 省略
    // 执行
    eval(res)
  })
}