【发布时间】:2014-01-14 05:41:34
【问题描述】:
我的新工作是使用 Google Closure 库编写面向组件的 JavaScript。我喜欢事件、组件、服务和模块。但这项工作非常艰巨,因为需要编写充满名称空间的代码。以下代码是典型的:
goog.provide(com.bin.slash.dot.closure.widget.SuperForm);
goog.require(com.bin.slash.dot.closure.widget.Avatar);
// ... ten require calls more...
com.bin.slash.dot.closure.widget.SuperForm = function() {
goog.base(this);
this._internal = new com.bin.slash.dot.closure.widget.Avatar(
com.bin.slash.dot.closure.widget.Avatar.SRC_PATH);
};
我不敢相信这是真的。我不害怕输入所有这些,但我只是觉得逻辑在这个符号地狱中溶解和混乱。扫描非常困难,因此需要更多时间来了解发生了什么。 我的老板说,不鼓励写这样的快捷方式:
var SF = com.bin.slash.dot.closure.widget.SuperForm = function(){};
因为它们在编译后都会绑定到全局命名空间(窗口),所以它们可以干扰其他东西。
问题是如何避免这个符号地狱?
更新:我对我的开发人员流程进行了改进,解决了符号地狱问题。 现在我编写了经过优化的 JavaScript,然后由 Grunt 使用 sweet.js 宏自动编译:
// For each file I define three macros which are replaced
// in the compile time with hell of a long paths.
macro dir { rule { $x } => { my.very.very.long.namespace $x } }
macro class { rule { $x } => { dir.NameOfMyClass $x } }
macro proto { rule { $x } => { class.prototype $x } }
dir.NameOfMyClass = function() {}; // yields: my.very.very.long.namespaceNameOfMyClass = function() {};
class.CONSTANT = "I don't know why we write constants into classes, not prototypes"; // yields: my.very.very.long.namespaceNameOfMyClass.CONSTANT = ...;
proto.method1 = function() {}; // yields my.very.very.long.namespaceNameOfMyClass.prototype.method1 = function(){};
所有由宏编译器产生的噪音都被优秀的shelljs去除了。
【问题讨论】:
-
我不确定我在这里看到你的问题。
-
只定义局部变量而不是全局变量?
-
至于:“我不知道为什么我们将常量写入类,而不是原型”——这样做的一个原因是编译器可以更有效地将其重命名为
a而不是 @987654325 @ 在高级模式下。可能还有更重要的原因。
标签: javascript google-closure-library