项目中一直在使用requirejs,鉴于requirejs和seajs经常被用来做比较,本篇文章就简单介绍下requirejs和seajs和它们之间的一些区别,后续会阅读两者的源码深入了解(挖坑中。。。)
<script src="require.js">script>
此处再引入requirejs时,没有通过data-main设置主入口文件,因此,基础路径即为引入requirejs文件所在的文件的路径;如果设置了主入口文件,那么主入口文件的路径即基本路径
require.config({
// 设置的基本路径
"baseUrl": "/static/",
// 为文件或文件夹设置一个映射关系
"paths": {
"jquery" : "https://cdn.staticfile.org/jquery/3.3.1/jquery",
"lib" : "/js/lib" // 因为设置了baseUrl,所以这里的位置实际上是/static/js/lib
// 为模块设置配置信息,在模块内可通过module.config()获取
"config": {
"lib/moduleA": {
"label" : "moduleA"
}
}
});
static/js/lib/moduleA.js
require(function(require, exports, module){
// CommonJs形式的模块定义
var label = module.config().label; // -->moduleA
});
static/js/lib/moduleB.js
define(["jquery"], function($){
// 有依赖关系的模块定义
});
require([lib/moduleA, "lib/moduleB"], function(A, B){
...
});
<script src="seajs">script>
seajs.config({
// 设置路径,方便跨目录调用
paths: {
'arale': 'https://a.alipayobjects.com/arale',
'jquery': 'https://a.alipayobjects.com/jquery'
},
// 设置别名,方便调用
alias: {
'class': 'arale/class/1.0.0/class',
'jquery': 'jquery/jquery/1.10.1/jquery'
}
// 变量配置
vars: {
'locale': 'zh-cn'
}
// 提前加载并初始化好指定模块,等到use时才用到
preload: "a"
});
define(function(require, exports, module){
/**
* require用来获取指定模块
* exports用来在模块内部对外提供接口,也可以通过return对外提供接口
* module.exports同exports类似,用来在模块内部对外提供接口
*/
});
加载一个模块:seajs.use("./a")
加载一个模块,在加载完成时,执行回调:
seajs.use("./a", function(a){
});
加载多个模块,在加载完成时,执行回调:
seajs.use(["./a", "./b"], function(a, b){
});
举例一:
AMD(CommonJs形式定义模块)
define(function(require, exports, module){
var a = require(moduleA);
a.dosomething();
var b = require(moduelB);
b.dosomething();
});
等价于
define([moduleA, moduleB],function(a, b, require, exports, module){
a.dosomething();
b.dosomething();
});
因为AMD是提前执行的,因此当moduleB有报错时,a.dosomething()和b.dosomething()都不能执行,AMD在依赖模块都正常加载的情况下才能执行后续操作。
CMD
define(function(require, exports, module){
var a = require(moduleA);
a.dosomething();
var b = require(moduleB);
b.dosomethig();
});
因为CMD是延迟执行的,因此当moduleB有报错时,a.dosomethig()仍然可以正常执行
举例二:
module1.js
define(function(require, exports, module){
require("./moduleA");
document.getElementById("btn").onclick = function(){
require("./moduleB");
}
});
moduleA.js
define(function(require, exports, module){
console.log("moduleA");
});
moduleB.js
define(function(require, exports, module){
console.log("moduleB");
});
使用requirejs引入module1:
require(["./module1"], function(){});
因为requirejs是提前执行,所以此时会打印:
moduleA
moduleB
使用seajs引入module1:
seajs.use("./module1");
因为seajs是延迟执行,因此,引入module1时,只会打印moduleA,只有当点击页面btn时,才会执行moduleB,即这时候才会打印moduleB