2

例如:

// 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);
}

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

4

2 回答 2

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

于 2012-08-25T01:53:20.147 回答
1

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

关闭:权威指南第 49 页:

Every JavaScript file in the Closure Library starts with at least one call to goog.provide(). All elements added to the namespace being provided are added in that file. Like Java, files live in a directory structure that parallels the namespace, though this is not required for Closure as it is for Java. This convention does make it easier to find the file responsible for a given namespace, however. It is recommended that you follow this convention in your own JavaScript projects that use Closure.

In addition, when using Closure Builder to manage dependencies, the following error is generated when the same namespace is provided by multiple files.

depstree.MultipleProvideError: Namespace "your.namespace" provided more than once in sources

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

于 2012-08-25T19:01:55.333 回答