运行时配置RequireJS

3

是否有可能在运行时修改requirejs(或任何AMD加载器)配置?

举个例子,我有两个日志模块:一个简单地包装console.log,另一个将日志记录到服务器。我希望模块仅需要引用log(require(['log'], function(log) { ... });),而不关心使用哪个记录器。

我可以在require的主配置中将'log'设置为一个包,这样可以正常工作。但我更想根据一些条件在main.js中设置这个选项。类似于:

if( ... ) {
    require.config({
        packages: [
            { name: 'log', location: 'app/base/utils/consolelog' }
        ]
    });
}

但是似乎这样做不起作用。有没有办法可以实现呢,或者我是在将requirejs作为依赖注入框架进行过度使用了?祝好!

1
它到底为什么不起作用?如果删除if会发生什么?只要在任何依赖项被引入之前完成您的require配置,就可以在运行时像这样配置requireJS。 - EMMERICH
1个回答

4
任何依赖注入框架的一般工具是,你只需一种简单的方法来配置运行时将解析哪种依赖关系容器,并且它仅构建一次并在应用程序的生命周期中保持静态。这样做的特定原因是为了避免在应用程序的某个点上依赖关系发生变化。有这样一个概念,即你的一个或所有应用程序源可能需要在使用容器中的某些或任何依赖项之前请求许可,而不是直接使用容器。这是一个糟糕的想法,有很多缺点。主要缺点是你知道,在accounts.all().each().withdraw(billing.MONTHLY_SERVICE_FEE).return()中的任何引用都可能因没有明显的原因而在任何时候表现得不同。如果Accounts更改并且new Accounts().all()不返回任何帐户,或者如果billing.MONTHLY_SERVICE_FEE突然更改并且你收取一些帐户的X金额和其他帐户的Y金额,那就太糟糕了。
所以,简短的答案是否定的,你不能动态地配置RequireJS。RequireJS始终只会加载一次模块,因此回调返回值始终是静态对象,或者更确切地说,当你查看模块源时,你知道它的define()只会在文档的生命周期内评估一次。
有几种非常简单的方法来在运行时抽象特定对象的实现。你只需创建几个带回调的模块,这些回调返回具有相同公共接口但不同行为的对象,然后你可以静态或动态地解析要返回的对象。
// core/logging/base.js
define(function() {
  var static;
  var base =  {
      _log: undefined,
      create: function(name) {},
      // ..
  }

  return base;
});

// core/logging/client.js
define(function(['core/logging/base'], function(base) {
  var client = extend(base, {_log: console.log});
  return client;
});

// core/logging.js
define(['core/logging/server', 'core/logging/client', 'core/conf/settings'], 
  function(server, client, environment) {
  if(settings.LOGGER === 'server') {
    return server;
  } else {
    return client;
  }
};

// app/foo.js
define(['core/logging'], function(logging) {
  var log = logging.createLog('foo');
  log.info('bar');
  // > INFO foo: bar
  // or...
  // POST http://server/log {type: 2, name: 'foo', message: 'bar'}
}

如何设计这样的支持有几种方法,但是这个方法以它的简单性和它适用于您特定情况的优点而吸引人。一般来说,您可以静态地在模块中执行此解析,也可以通过getter函数动态地在任何块中执行,模块回调本身还可以返回构造函数或函数,而不仅仅是对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接