【问题标题】:How to not compile certain code in goog.closure ADVANCED_OPTIMIZATIONS如何在 goog.closure ADVANCED_OPTIMIZATIONS 中不编译某些代码
【发布时间】:2014-03-25 16:08:45
【问题描述】:

当我在闭包中使用 ADVANCED_OPTIMIZATIONS 时,我可以添加到 web.config 属性,例如:

<compilation debug="false">

我什么时候写我的代码:

if (goog.DEBUG) { code }

在高级模式下,我不会在 .js 文件中看到此脚本。

我想对自己的属性做同样的事情 - 我创建了一个 define.js 文件:

定义.js:

goog.scope(function() {
    define.IS_SHOW_CODE = false;
}

并编写代码: if (!define.IS_SHOW_CODE) { 代码 }

我仍然可以在编译后的 .js 文件中找到这个 if 及其内容!

如何防止闭包在高级模式下编译脚本?

【问题讨论】:

标签: javascript compilation google-closure-compiler google-closure


【解决方案1】:

如果“goog”有效,您可能缺少“define”声明。

它应该看起来像这样:

var define = {};  // goog.provide('define') would also work here.

/** @define {boolean} */
define.IS_SHOW_CODE = true;

【讨论】:

  • 解释:@define 使 compile-time 常量,即闭包从一开始就知道这个变量的值并强制它不能改变。所以如果它看到if (define.IS_SHOW_CODE) { ... }并且知道该值必须是false,它就知道它可以消除整个块。
  • 我认为你没有理解我的意思。我是说在外部命名空间上声明的 @define 不会按预期工作。如果未声明“define”命名空间,则假定它是外部的且未内联,但值会在编译时被替换。
【解决方案2】:

好的,我找到了方法 - 我必须使用前缀 goog.[xxx] 来告诉编译器删除里面的脚本。 使用“定义”而不是删除脚本。

所以我将define.IS_SHOW_CODE 更改为goog.IS_SHOW_CODE

【讨论】:

  • goog.* 仅用于作为 Closure 一部分的代码。编译器的死代码消除应该对 goog.* 或 define.* 或其他任何东西起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多