我正在使用Javascript设计一个重要的应用程序。
从我到目前为止所读到的,通常的做法是通过将所有内容定义为模块来避免混淆全局命名空间。
为了方便和代码清晰,可以使用module Augmentation pattern
将模块划分为单独的文件var MODULE = (function (my) {
// functions, objects, etc ...
return my;
}(MODULE || {}));
现在,当拥有许多模块和模块依赖项时, require.Js 似乎是一个很有前途的工具,可以添加顺序,解耦和清除命名空间。让所有模块异步加载并确保它们只在它们的依赖项准备就绪后运行。
define(["depenencyModule1", "depenencyModule2"],
function(depenencyModule1, depenencyModule2) {
// define MyModule
return MyModule;
}
);
然而,这个用法干扰了之前的模块扩充模式,起初看起来我使用它错了,但后来我经历了require.js documentation并发现了这个:
"鉴于模块名称到文件路径查找算法的性质,每个JavaScript文件只应定义一个模块。"
所以现在我很困惑,如果我将我的模块写入单个文件,它将是巨大的,可维护的,不会使require.js无用吗? 或者,与其他语言的模块相比,模块的Javascript概念是一小部分代码?
答案 0 :(得分:0)
RequireJS允许您拥有一个Facade模块,该模块是作为一组RequireJS模块实现的。例如,您可以:
define(function (require, exports, module) {
'use strict';
var foo = require("./foo");
var bar = require("./bar");
for(var prop in foo) {
exports[prop] = foo[prop];
}
for(var prop in bar) {
exports[prop] = bar[prop];
}
});
此模块导出foo
和bar
的所有内容。从某人导入它的角度来看,它看起来像一个单独的模块,即使涉及三个RequireJS模块(外观和它导入的两个模块)。
我所做的另一件事是在多个模块中声明一个单独的类。我可能有foo
模块导出类Foo
:
define(function (require, exports, module) {
'use strict';
var core = require("./foo_core");
require("./foo_init");
require("./foo_gui");
...
exports.Foo = core.Foo;
});
foo_core
模块实际上定义了类:
define(function (require, exports, module) {
'use strict';
function Foo () {
// ...
}
Foo.prototype.bar = function () { ... };
exports.Foo = Foo
});
其他模块添加到它。 foo_init
:
define(function (require, exports, module) {
'use strict';
var Foo = require("./foo_core").Foo;
Foo.prototype.init = function () { ... };
});
foo_gui
:
define(function (require, exports, module) {
'use strict';
var Foo = require("./foo_core").Foo;
Foo.prototype.render = function () { ... };
Foo.prototype.erase = function () { ... };
});
我已经使用上述两种方法来拆分代码,这些代码从API的角度来看应该显示为单个模块,但是可以跨多个文件实现。