Javascript 使用require.js,避免重复更新对象

Javascript 使用require.js,避免重复更新对象,javascript,requirejs,amd,Javascript,Requirejs,Amd,如果不使用Require.js之类的东西,我会在应用程序加载到用户的web浏览器时实例化应用程序客户端控制器之类的东西。这样,在浏览器中应用程序的生命周期内,内存中会保留每个控制器的单个实例 当引入Require.js时,实现相同目标的惯用方法是什么 我建议导出AMD模块中的类,而不是实例。例如 // controllers/some_controller.js define(function (require) { function SomeController() {}; SomeC

如果不使用Require.js之类的东西,我会在应用程序加载到用户的web浏览器时实例化应用程序客户端控制器之类的东西。这样,在浏览器中应用程序的生命周期内,内存中会保留每个控制器的单个实例


当引入Require.js时,实现相同目标的惯用方法是什么

我建议导出AMD模块中的类,而不是实例。例如

// controllers/some_controller.js
define(function (require) {
  function SomeController() {};
  SomeController.prototype.foo = function () {};
  return SomeController;
});
然后在其他地方管理对象的生命周期,可能在app.js中执行类似的操作

// app.js
define(function (require) {

  var SomeController = require("./controllers/some_controller");

  var activeController;

  ...

  router.on("/foo", function () {
    if (activeController) {
      activeController.destroy();
    }
    activeController = new SomeController();
  });
});
或者,如果你想让控制器成为单例,就像你说的,你可以这样做

// app.js
define(function (require) {

  var controllers = {
    "some": require("./controllers/some_controller")
  };
  var controllerCache;

  function getController(name) {
    if (!controllerCache[name]) {
      controllerCache[name] = new controllers[name]();
    }
    return controllerCache[name];
  }

  var activeController;

  ...

  router.on("/foo", function () {
    if (activeController) {
      activeController.exit();
    }
    activeController = getController("some");
  });
});
无论如何,这些都是非常复杂的例子,但我的主要观点是,我建议导出模块中的类——而不是实例——这样,您可以控制如何管理这些对象及其生命周期,这也有助于可测试性,因为您可以要求类、存根类、提供模拟依赖项等。(有关使用容器查找各种对象实例的更高级示例,请查看。他甚至给出了一个如何在AMD模块中使用容器的示例)

希望这能有所帮助

更新
当然,您也可以导出函数或带有函数的对象以及其他合适的东西,但很可能您不想在模块的顶层实例化或执行东西-最好将其作为应用程序流的一部分,而不是作为require.js拉入模块流的一部分来执行。

RequireJs模块无论如何都是单例的,一个不是吗?所以,我可以将我的导出封装在控制实例化的函数中,在它们存在的地方重用现有实例?你是说导出一个工厂函数,你可以调用它来获取某个实例,而工厂函数会缓存该实例?当然,我的意思是,你可以做任何事情,真的,我认为没有惯用的方法“Require.js”的方式,它只是一种软件工程。我倾向于在现有的框架/库中寻找灵感-例如,看看人们如何使用Require()等。