【问题标题】:How should I think about my JavaScript application namespaces?我应该如何看待我的 JavaScript 应用程序命名空间?
【发布时间】:2011-11-08 09:43:07
【问题描述】:

我正在构建一个具有单个全局命名空间的应用,如下所示:

var myApp = {};

然后我有一堆不同的可重用“模块”,由模型、视图和控制器组成。

//Bar chart module code
org.example.chart.bar.module
org.example.chart.bar.model
org.example.chart.bar.view
org.example.chart.bar.controller

我还有一个大数据源单例和一个数据管理器,用于将数据加载到数据源:

org.example.data.dataSource
org.example.data.dataManager //populates the dataSource with CSV data

最后是应该在整个应用程序中可用的翻译字符串和设置:

org.example.static.translations
org.example.static.settings

您将如何(重新)组织它,以便我可以轻松访问应用程序级别的单例(例如 dataSource、dataManager、翻译等),并且可以轻松地实例化在当前应用程序范围内的可重用模块实例?

(例如,您是否会从一开始就为您的“类”和您的应用程序使用相同的命名空间?或者您可能会像这样引用:myApp.translations = org.example.static.translations?)

【问题讨论】:

  • 唷,I 会迫使你停止思考 Java,而开始思考 JavaScript。我觉得这太夸张了。
  • 哈哈 :) 好的,那我从哪里开始呢?我应该把我所有的类都放在同一个命名空间下吗?我有点想拥有像 myApp.translations 这样的简单端点,但同时能够轻松实例化模块 myApp.registeredModules["bar"] = new org.example.chart.bar.module ... 如何找到正确的平衡?
  • 您应该看一下用于在模块中构建 javascript 和管理依赖项的模块模式:adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

标签: javascript namespaces code-organization


【解决方案1】:

不,我们没有命名空间。我们编写模块化代码并使用模块加载器。

模块加载器的示例是 require.jsbrowserifyseajs

示例模块如下:

(function () {
  var jQuery = require("jQuery");
  var chart = require("chart"); 

  ...

  define("moduleName", moduleObject);
})();

【讨论】:

  • 谢谢@Raynos。我的应用级单例的模块是什么样的?加载后我将如何引用它们?
  • @dani 你定义模块然后加载它们。模块只是对象。加载模块只是加载对象。
  • 我们没有命名空间,因为我们不会为了做一个简单的动画而添加 20 个充满杂乱无章的库。
  • @Raynos,我同意你的看法。对于 Java 或 C#,您通常会在类的顶部添加一堆 import/using 语句,以便您可以使用每个导入库中的功能。 libA 可能包含class Foo,而libB 也可能包含class Foo。为了防止发生冲突,您使用命名空间。在 JavaScript 中,您只添加您需要的内容,因此对命名空间的需求较少。
【解决方案2】:

没有什么能阻止你为班级添加另一个名字。例如。

 org.ds = org.example.data.dataSource;

那你就可以打电话了

 org.ds.getDatasource();

而不是

 org.example.data.dataSource.getDatasource();

但两者仍然有效。

编辑:您还可以创建其他更简单的函数,将其从 oo 结构中取出

 var dataSource = function () { return org.example.data.dataSource.getDatasource(); };

【讨论】:

  • 好的,所以您没有发现快捷方式引用或实例化对象与应用程序位于同一命名空间下的问题?谢谢。
  • 不,使用命名空间结构的全部原因是为了避免与其他代码库冲突,但如果是“org.”是你的根命名空间,没有其他人使用它,那么唯一不这样做的原因是如果你不记得它在那里,或者你有其他东西已经在使用它。即便如此,您也可以编写条件逻辑来对此进行测试。
【解决方案3】:

【讨论】:

    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多