前文
CMD表示Common Module Definition
通用模块定义
该规范由国内发展而来
由玉伯提出
其浏览器实现为Sea.js
批注
Sea.js说实话是我见过最疯狂最黑科技的库了
每次看到相关的文章都感觉头皮发麻
使用
参考
https://seajs.github.io/seajs/docs/#quick-start
入口执行
seajs.config({
base: "../sea-modules/",
alias: {
"jquery": "jquery/jquery/1.10.1/jquery.js"
}
})
// 加载入口模块
seajs.use("../static/hello/src/main")
使用seajs.config进行配置
然后使用seajs.use调用入口模块
声明模块也与amd类似
如果没有配置则默认为同目录文件名
// 所有模块都通过 define 来定义
define(function(require, exports, module) {
// 通过 require 引入依赖
var $ = require('jquery');
var Spinning = require('./spinning');
// 通过 exports 对外提供接口
exports.doSomething = ...
// 或者通过 module.exports 提供整个接口
module.exports = ...
});
有一个require引入依赖,export用来导出依赖,也可以通过module.exports导出模块
加载异步模块
使用require.async
加载完毕后使用回调函数
define(function(require, exports, module) {
require.async(['./a', './b'], function(a, b) {
});
});
使用方式还是很简单的,如果你看懂了说明你已经学会了本节
关于更多可以参考
https://www.zhangxinxu.com/sp/seajs/docs/zh-cn/module-definition.html#require-async
https://seajs.github.io/seajs/docs/
如果你仍然学有余力
那让我们进入加强篇
加强篇-十全大补丸
你可能很好奇
require('jquery')这句话
为什么就可以同步执行并且拿到对应的数据
我们查阅一下资料可以找到
https://www.zhihu.com/question/20342350/answer/32484869
实际上原理是通过Function.tostring匹配出来对应的模块
然后解析模块路径,反复执行该过程
最后解析到最里层模块
然后还是执行我们一开始的调用函数
其实现过程堪称疯狂
而竟然是2013年的库
关于该部分在
https://github.com/seajs/seajs/issues/259
也有一些影子
要求必须使用require、不能二次赋值require、必须使用常量等
我只能说太他妈酷了
(确实如知乎的卢勃大佬所言、官方没顺口提到这个问题还是挺蛋疼的,第一眼看的时候懵了好久...但是真的很惊艳于想出这种想法)
引用
https://www.cnblogs.com/xiaohuochai/p/6879432.html
https://seajs.github.io/seajs/docs/#quick-start
https://www.zhihu.com/question/20342350/answer/32484869