初识 SeaJS

2011-09-15 04:08

初识 SeaJS

by

at 2011-09-14 20:08:50

original http://ghsky.com/2011/05/seajs-first-view.html

最近NodeJSCommonJS真是好火啊,前端真的不再如从前那么“单纯”了,从此需要学习掌握更多的传统软件开发的知识和技能,也就是从前后端开发做的很多工作会逐渐前移到前端工程师。这里为什么要把NodeJSCommonJS放在一起说呢,主要是我对里面的模块机制十分感兴趣,正好NodeJS中的模块实现方式也遵循CommonJS中的相关规范。

神奇的 require

首先还是看一段代码吧:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

这是NodeJS首页上的一段代码,我们注意看一下require这个函数的用法,这里的代码需要http这个模块,因此就var http = require('http');但是令我比较疑惑的就是明明require函数是个异步的调用,因为http的模块文件不可能同步在这里堵塞加载执行(当然可能有人会说使用同步的AJAX请求,但是我们同样需要支持跨域问题),虽然这段代码是NodeJS的代码,其主要是运行在服务器端,使用V8引擎驱动,可以使用一些手段让requrie的模块同步加载执行,但是对于一个Web应用看到这样的代码一定会疑惑为什么这里不需要一个回调函数~好吧,就此认为这就是NodeJS在服务器端的神奇之处~~~那么继续看下面一段代码:

define(function(require, exports, module) {

    // 获取依赖的模块:
    var $ = require('jquery');

    // 向外提供接口:
    exports.someMethod = someFunction;

});

这段代码是来自SeaJS首页的一段代码(额,我们的主角终于现身了~)这里再次出现了var $ = require('jquery');这样一段 require 函数,这里同样会有刚刚上述的问题,明明是个异步的需求怎么在这里可以使用同步的写法呢?一种假设是 require 函数在这里已经事先准备好了 jquery 的对象(加载和执行 jquery.js ),但是这有什么策略么?不可能所有支持的模块都必须这样提前å