-->

没有任何理由不提供在不同的源文件相同的模块?(Is there any reason not to

2019-09-21 15:55发布

例如:

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

这是为了提供一个可扩展的命令集的一个很好的方式,或者是有什么,可以使这个复杂的,我不是想什么呢?

Answer 1:

没有任何理由,你不能或不应该在不同的源文件中提供相同的模块。 如果是有意义的源代码组织方案,那么它是一个完全正常的事情。 其中之一,我们已经主要原因goog.provide()是如此,同样的符号可在几个不同的地方使用,但在任何一个文件,会出现先运行定义。

如果我的理解goog.provide()正确的,它的作用是确保一个对象被声明。 所以,goog.provide('mypackage.commands ) makes sure that mypackage.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



Answer 2:

使用goog.provide()定义在多个文件中相同的命名空间将不会覆盖命名空间,因为命名空间的每一级都检查是否存在由左到右。 然而, 封库遵循每个命名空间只在一个文件中提供的惯例。

封闭权威指南第49页:

Closure库中的每个JavaScript文件与至少一个电话开始goog.provide(). 设置添加到命名空间的所有元素都在该文件中添加。 Java一样,文件住在平行的命名空间的目录结构,尽管这并不需要关闭,因为它是Java。 本公约不使它更容易找到但是负责给定命名空间中的文件。 建议您按照使用封闭自己的JavaScript项目本公约。

此外,在使用的时候关闭生成器来管理依赖关系,当同一个命名空间是由多个文件提供生成以下错误。

depstree.MultipleProvideError:命名空间“your.namespace”的来源提供一次以上

但是,如果您仍想提供在多个文件中相同的命名空间,您可以管理使用依赖关闭编译标志--only_closure_dependencies没有错误。



文章来源: Is there any reason not to provide the same module in different source files?