seajs 2.x 和 requirejs 2.x 的差异

时间:2021-10-08 08:58:55

写在前面的话:

现在web框架很多,相关的自动化解决方案也很多,这点我知道。

请不要问本人为啥还研究这个两个“工具”,我回答不了,如果觉得低级,直接忽略本文。

不比两个工具的好坏,就说说本人查看两个“工具”源代码感受到的差异。


差异

内部架构

requirejs里面是有“上下文-模块”的概念。

seajs里面只有“模块”的概念。

requirejs里面有使用事件defined来解耦


模块的差异

编写模块(即调用define函数)的时候,对require的机制是不一样的

seajs里面的define可以使用require的返回值来取得模块“导出的信息”,require是阻塞的。模块里面的require只针对模块。程序主入口使用 seajs.use(['depend1'],function(depend1){ ... });

requirejs里面的define不可以使用require的返回值来取得模块“导出的信息”,require是异步的,里面只能用回调的方式来使用。模块里面的require和程序的主入口中的require是一致的。程序的主入口:require(['depend1'],function(depend1){ ... });

requirejs里面require的用法

define(function(require,exports,module) {

require(["modules/module1/define"], function(module1) {
module1.console('modules/module1/define');
});
});

seajs里面require的用法

define(function(require,exports,module) {

var module2 = require('modules/module1/define');
module2.console('invoke module1...');
});

个人会养成的模块写法

requirejs模块的写法

全参数的写法( 此例子,只是说明define中可支持的全部依赖参数)

define(['modules/module3/define','require','exports','module'],function(module3,require,exports,module) {
console.log('loaded module 2 begain...');

console.log('bing module3 mehtod ...');
exports.console1 = module3.console;
exports.console2 = module3.console;
exports.console3 = module3.console;

console.log('loaded module 2 end...');
});

没有依赖的写法

define(function(require,exports,module) {
console.log('loaded module 3...');

module.exports = {
console : function(str){
console.log(str);
}
};
});

有依赖的写法(把依赖直接声明在第一个参数上,放弃掉require的引用,会立即加载依赖)

define(['modules/module3/define','exports','module'],function(module3,exports,module) {
console.log('loaded module 2 begain...');

console.log('bing module3 mehtod ...');
exports.console1 = module3.console;
exports.console2 = module3.console;
exports.console3 = module3.console;

console.log('loaded module 2 end...');
});

seajs模块的写法

没有声明依赖的写法(依赖在匿名函数内编写,会延迟加载依赖)

define(function(require,exports,mod) { 
var jquery = require('jquery');
return {
console : function(str){
console.log(str);
}
};
});

有声明依赖的写法(声明依赖,会立即加载依赖)

define(['jquery'],function(require,exports,mod) {  
return {
console : function(str){
console.log(str);
}
};
});

入口函数差异

requirejs的入口

require(["modules/module1/define"], function(module1) {
module1.console('modules/module1/define');
})

seajs的入口

seajs.use("modules/module1/define", function(module1) {
module1.console('modules/module1/define');
});

配置的差异

requirejs的配置

require.config({	
baseUrl: "http://www.domaintrade.com/requirejs/assets/",
paths: {
"jquery": "global/js/jquery-1.8.3",
}
});

seajs的配置

seajs.config({
base: "http://www.domaintrade.com/seajs/assets/",
alias: {
"jquery": "global/js/jquery-1.8.3.js",
}
});