标签:
要想了解Sea.js的运作机制,就不得不先了解其CMD规范。
Sea.js采用了和Node相似的CMD规范,我觉得它们应该是一样的。使用require、exports和module来组织模块。但Sea.js比起Node的不同点在于,前者的运行环境是在浏览器中,这就导致A依赖的B模块不能同步地读取过来,所以Sea.js比起Node,除了运行之外,还提供了两个额外的东西:
即Sea.js必须分为模块加载期和执行期。加载期需要将执行期所有用到的模块从服务端同步过来,在再执行期按照代码的逻辑顺序解析执行模块。本身执行期与node的运行期没什么区别。
所以Sea.js需要三个接口:
并不太喜欢Sea.js的use API,因为其回调函数并没有使用与Define一样的参数列表。
模块id的标准参考Module Identifiers,简单说来就是作为一个模块的唯一标识。
出于学习的目的,我将它们翻译引用在这里:
顾名思义,factory就是工厂,一个可以产生模块的工厂。node中的工厂就是新的运行时,而在Sea.js中(Tea.js中也同样),factory就是一个函数。这个函数接受三个参数。
function (require, exports, module) {
// here is module body
}
在整个运行时中只有模块,即只有factory。
依赖就是一个id的数组,即模块所依赖模块的标识。
require
想要解释这个问题,我们还是从Node模块说起,node于Ruby类似,用我们之前使用过的一个模块作为例子:
// File: usegreet.js
var greet = require("./greet");
greet.helloJavaScript();
当我们使用node usegreet.js
来运行这个模块时,实际上node会构建一个运行的上下文,在这个上下文中运行这个模块。运行到require(‘./greet‘)
这句话时,会通过注入的API,在新的上下文中解析greet.js这个模块,然后通过注入的exports
或module
这两个关键字获取该模块的接口,将接口暴露出来给usegreet.js使用,即通过greet
这个对象来引用这些接口。例如,helloJavaScript
这个函数。详细细节可以参看node源码中的module.js。
node的模块方案的特点如下:
实际上node如果通过fs异步的读取文件的话,require也可以是异步的,所以曾经node中有require.async这个API。
标签:
原文地址:http://www.cnblogs.com/8minutes/p/4865678.html