任何依赖注入框架的一般工具是,你只需一种简单的方法来配置运行时将解析哪种依赖关系容器,并且它仅构建一次并在应用程序的生命周期中保持静态。这样做的特定原因是为了避免在应用程序的某个点上依赖关系发生变化。有这样一个概念,即你的一个或所有应用程序源可能需要在使用容器中的某些或任何依赖项之前请求许可,而不是直接使用容器。这是一个糟糕的想法,有很多缺点。主要缺点是你知道,在
accounts.all().each().withdraw(billing.MONTHLY_SERVICE_FEE).return()
中的任何引用都可能因没有明显的原因而在任何时候表现得不同。如果
Accounts
更改并且
new Accounts().all()
不返回任何帐户,或者如果
billing.MONTHLY_SERVICE_FEE
突然更改并且你收取一些帐户的X金额和其他帐户的Y金额,那就太糟糕了。
所以,简短的答案是否定的,你不能动态地配置RequireJS。RequireJS始终只会加载一次模块,因此回调返回值始终是静态对象,或者更确切地说,当你查看模块源时,你知道它的
define()
只会在文档的生命周期内评估一次。
有几种非常简单的方法来在运行时抽象特定对象的实现。你只需创建几个带回调的模块,这些回调返回具有相同公共接口但不同行为的对象,然后你可以静态或动态地解析要返回的对象。
define(function() {
var static;
var base = {
_log: undefined,
create: function(name) {},
}
return base;
});
define(function(['core/logging/base'], function(base) {
var client = extend(base, {_log: console.log});
return client;
});
define(['core/logging/server', 'core/logging/client', 'core/conf/settings'],
function(server, client, environment) {
if(settings.LOGGER === 'server') {
return server;
} else {
return client;
}
};
define(['core/logging'], function(logging) {
var log = logging.createLog('foo');
log.info('bar');
}
如何设计这样的支持有几种方法,但是这个方法以它的简单性和它适用于您特定情况的优点而吸引人。一般来说,您可以静态地在模块中执行此解析,也可以通过getter函数动态地在任何块中执行,模块回调本身还可以返回构造函数或函数,而不仅仅是对象。
if
会发生什么?只要在任何依赖项被引入之前完成您的require配置,就可以在运行时像这样配置requireJS。 - EMMERICH