seaJs

2014年09月09日

之前使用过requireJs做模块化开发,用的不是很好。看看seaJs和requireJs有什么不同。

AMD(异步模块定义)和CMD(通用模块定义)规范的不同

区别:

1.对于依赖的模块,AMD是提前执行,CMD是延迟执行。CMD推崇as lazy as possible.

2.CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:

define(function(require, exports, module) {
	var a = require('./a');
	a.doSomething()
	// 此处略去 100 行
	var b = require('./b'); // 依赖可以就近书写
	b.doSomething()
	// ... 
}) 如:
	
define(function(require, exports, module) {
	var $ = require('jquery');
	var _ = require('underscore');
})

AMD 默认推荐的是

define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
	a.doSomething()
	// 此处略去 100 行
	b.doSomething()
	//...
})  如:
	
define(['jquery', 'underscore'], function($, _) {
	$.ajax();
	_.map();
})

3.AMD的API默认是一个当多个用,CMD的API严格区分,推崇职责单一。比如 AMD 里,require分全局require和局部require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD里每个API都简单纯粹。

玉伯: AMD和CMD表面上的区别是书写格式不同。 AMD下,默认推荐的模块格式是

define(['a','b'], function(a, b) {
 	 	// do sth
}) CMD里,默认推荐的是

define(function(require, exports, module) {
  		var a = require('a')
  		var b = require('b')
  		// do sth
 		 ...
}) 目前越来越意识到,默认推荐的模式书写格式表面上的不同,背后带来的差异越来越有意思。 其中一个核心差异是:就近原则 AMD 中的依赖通过函数参数传入,带来的好处是一个模块的依赖直接在头部一目了然,非常清晰。带来的不足是,AMD下其实默认推荐了var 在一起的写法,比如

var a = 1, b = 2,  long long ...
// do sth A
// do sth B

CMD 书写风格下,导向的是就近原则(变量在需要它的地方之前才定义):

var a = 1
// do sth A

var b = 2
// do sth B 还有一个核心差异也跟就近原则有关,是懒原则 在AMD里

define(['a', 'b'], function(a, b) {
   	//模块a和b在这里就都执行好并可用了
}) 在 CMD 里

define(function(require, exports) {
   	// ...
   	var a = require('a')  // 模块 a 运行到此处才执行
// ...
if (false) {
var b = require('b')   // 当某些条件为false时,模块b永远也不会执行
   	}
}) CMD 更懒。 个人觉得 AMD 和 CMD 的核心差异体现在 对自然的追求上。 何为自然?CMD 认为就近原则书写代码更自然,AMD则觉得提前都写好更自然。 何为自然?CMD 认为需要时才执行更自然,AMD觉得依赖就应该提前都执行好,这样才自然。

玉伯有句话-RequireJS是没有明显的bug,SeaJS是明显没有bug

有篇博文蛮有意思的访问

uglify

师傅说uglify对requireJs没有影响,但是对seaJs是致命的,因为seaJs用的是正则表达式,所以使用seaJs时,应该使用spmJs压缩。其中spmJs主要做了三件事:

①使seaJs可以压缩
②将js文件合并到一起去从而减少了http请求
③uglify减少请求的字节数。