2015-11-24 95 views
0

我正在用Javascript设计一个不平凡的应用程序。Javascript,多文件模块和Require.Js

从我目前阅读的常见做法是通过将所有内容定义为模块来避免混淆全局命名空间。

而且为了方便和清晰的代码模块可以有许多模块和模块依赖关系时,使用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

目前尚不清楚“干扰之前的模块增强模式”的含义。什么模式?什么? – DFriend

回答

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模块(Facade和它导入的两个模块),它看起来就像是一个单一模块。

我做的另一件事是在多个模块中声明一个类。我可能有一个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的观点出发应显示为单个模块,但在多个文件实现。