javascript - 有什么理由不在不同的源文件中提供相同的模块吗?

标签 javascript module google-closure-library

例如:

// 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/

相关文章:

java - 如何在单独的线程/类加载器中隔离 java 模块执行?

python - __main__ 是否保证始终可导入?

javascript - 结构体和字典有什么区别?

javascript - 如何将 SVGPolyline 的点提取为二维数组

javascript - TensorflowJS:计算多个张量之间的距离或相似度的最佳方法?

python : imported packages with 'nested' modules

javascript - 我怎样才能知道用户是否可以使用 Google Closure 看到一个元素?

javascript - Google Closure 绑定(bind)/解决 this 关键字的问题

javascript - 在 Google Hangout API 中添加默认邀请

javascript - 如何使用 Flow 导出 Action 创建者返回值的类型?