例如:
// 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);
}
这是提供可扩展命令集的好方法,还是有什么东西可能会使这个过程变得复杂而我没有想到?
最佳答案
您没有理由不能或不应该在不同的源文件中提供相同的模块。如果这对您的源代码组织方案有意义,那么这是一件非常好的事情。我们使用 goog.provide()
的主要原因之一是可以在多个不同的地方使用相同的符号,但在最先运行的文件中定义。
如果我正确理解goog.provide()
,它所做的就是确保声明一个对象。因此,goog.provide('mypackage.commands) 确保在全局范围内声明
mypackage.commands`。
所以 goog.provide('mypackage.commands');
只是完成与此类似的事情:
window.mypackage = window.mypackage || {};
window.mypackage.commands = window.mypackage.commands || {};
仅当您计划向此源文件中的该对象添加内容时,才需要执行此操作。因此,如果多个源文件都将新项目添加到 mypackage.commands
上,那么每个源文件都会执行 goog.provide('mypackage.commands
)` 以确保声明了正确的全局变量结构。
这似乎就是您在代码示例中所做的事情,这是一件非常好的事情。这取决于您自己的代码组织意识,是否最好让多个源文件都贡献于同一个对象(就像您所做的那样),或者您是否应该组织源文件,以便与一个特定 namespace 相关的所有代码都在同一个中文件。这实际上取决于您以及您认为最好如何组织源代码 - 没有正确或错误的答案,除了它的组织方式背后应该有一些韵律和原因。
有用的引用文章:https://developers.google.com/closure/library/docs/tutorial
关于javascript - 有什么理由不在不同的源文件中提供相同的模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12118427/