Javascript,多文件模块和Require.Js

时间:2015-11-24 07:28:27

标签: javascript module requirejs

我正在使用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概念是一小部分代码?

1 个答案:

答案 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];
}

});

此模块导出foobar的所有内容。从某人导入它的角度来看,它看起来像一个单独的模块,即使涉及三个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的角度来看应该显示为单个模块,但是可以跨多个文件实现。