为学习某开源项目, 里面使用了 sea.js, 为此而学习, 网址是: http://seajs.org/docs/#docs
模块化的价值 (解决什么问题):
命名冲突问题. 命名空间可缓解冲突, 但太长难记忆. 如何优雅地解决?
烦琐的文件依赖: 当项目越来越复杂, 文件依赖也快速增长. 如何优雅地解决?
前端开发的两个经典问题: 命名冲突, 文件依赖.
== 使用 Sea.js 解决 ==
需要遵守 CMD(Common Module Definition)模块定义规范.
一个文件就是一个模块. 如:
define(function(require, exports) {
var other = require('path-to-other-js');
exports.func1 = function ... body;
exports.func2 = etc...
});
通过 require 获得(其它模块)通过 exports 暴露的接口. 可认为是扩展出了一个关键字(by sea.js).
通过 exports 对象向外提供接口.
通过 require (仿关键字) 类似于 c #include, java,python import 等.
例子2:
seajs.use('some-thing', function(A-object) {
A-object.foo(...);
}
需要做: 首先在页面引入 sea.js, 其它地方想使用某个模块, 则使用 seajs.use() 方法.
于是:
1. 通过 exports 暴露接口, 不需要依赖命名空间了.
2. 通过 require 引入依赖(模块), 开发者不用关心太多了...
其它好处:
1. 模块版本管理;
2. 提高可维护性: sea.js 提供 nocache, debug 等辅助插件
3. 前端性能优化: 模块是异步加载的. 还提供 combo, flush 等插件.
4. 跨环境共享模块: CMD 与 node.js 模块规范接近, 方便与server端 js 共享.
前端模块化构建两大类:
1. 大教堂模式. (Dojo,YUI3,KISSY...)
2. 集市模式. (jQuery,RequireJS,Sea.js ...)
长远来看, 小而美更具备宽容性和竞争力, 更能形成有活力的生态圈.