【问题标题】:Is there any reason not to provide the same module in different source files?有什么理由不在不同的源文件中提供相同的模块吗?
【发布时间】:2012-08-25 01:21:35
【问题描述】:

例如:

// a.js
goog.provide('mypackage.a');
goog.provide('mypackage.commands');

mypackage.a.somevar = 1;

mypackage.commands.save = function(...) {...};

// b.js
goog.provide('mypackage.b');
goog.provide('mypackage.commands');

mypackage.b.somevar = 1;

mypackage.commands.read = function(...) {...};

// mypackage/commands.js
goog.provide('mypackage.commands');

mypackage.commands.runCommand = function(commandText, args) {
  return mypackage.commands[commandText](args);
}

这是提供一组可扩展命令的好方法,还是有什么东西可以让我没有想到的复杂?

【问题讨论】:

    标签: javascript module google-closure-library


    【解决方案1】:

    没有理由不能或不应该在不同的源文件中提供相同的模块。如果它对您的源代码组织方案有意义,那么这是一件非常好的事情。我们拥有goog.provide() 的主要原因之一是可以在多个不同的地方使用相同的符号,但可以在恰好首先运行的文件中定义。

    如果我正确理解goog.provide(),它所做的就是确保声明了一个对象。所以,goog.provide('mypackage.commands) makes sure thatmypackage.commands` 是在全局范围内声明的。

    所以goog.provide('mypackage.commands'); 只是完成了类似的事情:

    window.mypackage = window.mypackage || {};
    window.mypackage.commands = window.mypackage.commands || {};
    

    仅当您计划在此源文件中向该对象添加内容时,您才需要这样做。因此,如果多个源文件都在向mypackage.commands 添加新项目,那么每个源文件都会执行goog.provide('mypackage.commands)` 以确保声明了正确的全局变量结构。

    这似乎是您在代码示例中所做的事情,这是一件非常好的事情。这取决于您自己对代码组织的看法,是让多个源文件都贡献给同一个对象(就像您拥有的那样)更好,还是应该组织您的源文件,以便与一个特定命名空间有关的所有代码都在同一个文件。这完全取决于您以及您认为如何最好地组织源代码 - 没有正确或错误的答案,除了应该有一些押韵和组织背后的原因。

    有用的参考文章:https://developers.google.com/closure/library/docs/tutorial

    【讨论】:

      【解决方案2】:

      使用goog.provide() 在多个文件中定义相同的命名空间不会覆盖命名空间,因为命名空间的每一级都是从左到右检查是否存在。但是,Closure Library 遵循每个命名空间仅在一个文件中提供的约定。

      来自Closure: The Definitive Guide 第49页:

      闭包库中的每个 JavaScript 文件都以至少一个调用开始 goog.provide(). 添加到提供的命名空间的所有元素都添加到该文件中。 与 Java 一样,文件存在于与命名空间平行的目录结构中,尽管对于闭包来说这不是必需的,因为它对于 Java 来说是必需的.但是,此约定确实可以更轻松地找到负责给定名称空间的文件。建议您关注 在您自己的使用 Closure 的 JavaScript 项目中使用此约定。

      另外,使用Closure Builder管理依赖时,多个文件提供同一个命名空间时会产生如下错误。

      depstree.MultipleProvideError: 命名空间“your.namespace”在源中提供了不止一次

      但是,如果您仍想在多个文件中提供相同的命名空间,则可以使用 Closure Compiler 标志 --only_closure_dependencies 管理依赖关系而不会出错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-20
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        相关资源
        最近更新 更多