大多数模块依赖加载器/管理器本质上都是将这种模块定义封装进一个友好的API。
代码的核心是:
modules[name] = impl.apply(impl, deps)
为了模块的定义引用了包装函数(可以传入任何依赖项),并且将返回值,也就是模块的API,存储进一个根据模块名称来管理的模块列表中。
var MyModules = (function () {
var modules = {}
function define(name, deps, impl) {
for (let i = 0, len = deps.length; i < len; i++) {
deps[i] = modules[deps[i]]
}
modules[name] = impl.apply(impl, deps)
}
function get(name) {
return modules[name]
}
return {
define,
get
}
})()
MyModules.define("bar", [], function () {
function hello(who) {
return "Let me introduce:" + who
}
return {
hello
}
})
MyModules.define("foo", ["bar"], function (bar) {
var hungry = "hippo"
function awesome() {
console.log(bar.hello(hungry).toUpperCase());
}
return {
awesome
}
})
var bar = MyModules.get("bar")
var foo = MyModules.get("foo")
console.log(bar.hello("hzm"));
foo.awesome()