【问题标题】:Google Closure Compiler 100% typedGoogle Closure Compiler 100% 输入
【发布时间】:2011-05-12 22:24:30
【问题描述】:

关于 google 闭包编译器,我怎样才能让我的应用程序 100% 输入?

我已经用 jsdoc cmets 标记了所有内容。甚至有可能获得100?我是 64.6%

【问题讨论】:

  • 你试过编译闭包库本身吗?能达到 100% 吗?
  • 你如何确定“64,6%”?
  • 这是它在命令行中写的;)闭包编译器是如何确定的,我不知道......也许每个变量都有类型的变量?不过可能更复杂。
  • @huyz summary_detail_level 3,如果你想在输出中看到它

标签: javascript typing google-closure-compiler jsdoc


【解决方案1】:

我尝试编译 goog.net.XhrIo 作为测试:

goog.require('goog.Uri.QueryData');
goog.require('goog.debug.ErrorHandler');
goog.require('goog.net.XhrIo');

goog.net.XhrIo;

当我编译这个时,我得到了这个结果:

20-nov-2010 1:12:21 com.google.javascript.jscomp.LoggerErrorManager printSummary
WARNING: 0 error(s), 1 warning(s), 91,5% typed
JSC_USELESS_CODE. Suspicious code. This code lacks side-effects. Is there a bug? at test.js line 5 : 0

似乎闭包库本身不是 100% 类型的,我不认为目标是达到 100%。 Javascript 不是静态类型语言。 Closure 试图将静态类型语言的一些优点带入 javascript。哪个好。但这并不意味着您必须承担此类语言的负担。

编辑:

我尝试编译一个空文件,结果是90.4%。我认为这意味着具有所有原始函数的 base.js 不是 100% 类型化的。所以我做了更多的实验,发现当我也把类型信息放在我所有的局部变量上时,百分比上升了。我认为没有必要将类型信息放在所有局部变量上。我的意思是想象一下:

/** @type {number} */
var i = 0;
for(i = 0; i < 10; i++) {
  // do something
}

这不是使用闭包编译器进行编译的目标。编译 base.js 不会导致 100% 的事实证明了这一点。在我的开发过程中,我尽量将这个数字保持在 85% 到 95% 之间。根据您的时间、编程风格和您正在处理的应用程序,可能会有所不同。最好的指导方针是在整个应用程序开发过程中尽量保持百分比不变,无论是 60% 还是 90%。只需根据需要进行尽可能多的输入,以使您对自己的代码感到满意。

【讨论】:

  • 即使没有 @type 注释,您的示例也是 100% 输入的。编译器可以根据变量的使用情况来确定类型。因此,第一次将数字赋值给变量声明了类型为 {number} 的变量。如果您的编译器没有给您 100% 的结果,请尝试更新版本。
【解决方案2】:

有可能达到 100%。我自己的项目是 100% 打字的。闭包编译器可以输出有关未知类型表达式的警告。不幸的是,没有启用此功能的命令行选项。您必须修改源代码才能启用它:

  1. 下载当前资源:

    git clone https://code.google.com/p/closure-compiler/

  2. 编辑 src/com/google/javascript/jscomp/CompilerOptions.java 并将行 reportUnknownTypes = CheckLevel.OFF 更改为 reportUnknownTypes = CheckLevel.WARNING

  3. 只需调用根目录中的ant 即可编译闭包编译器。修改后的compiler.jar现在在build目录下。

当您在脚本上使用这个修改后的编译器时,它会针对编译器无法确定类型的所有表达式发出大量警告。当您在代码中修复所有这些警告时,它是 100% 输入的。

【讨论】:

  • 由于 Sven 没有对这个问题发表评论,我只想说 非常感谢,它有效! 哦,+1 :)
  • 谢谢!仅针对那些关注线程的人,编译器现在移至git。将步骤 1 替换为 git clone https://code.google.com/p/closure-compiler/
  • 今天可以通过命令行使用--jscomp_warning=reportUnknownTypes
  • 看起来第 2 步已更改。这对我有用:options.setWarningLevel(DiagnosticGroup.REPORT_UNKNOWN_TYPES, CheckLevel.WARNING)
【解决方案3】:

所有的学分都归@kayahr,但随着时间的流逝。我想为他的答案提供更新,该答案基于旧版本的编译器。

您需要重新编译源代码并强制执行类型检查。这样做:

  1. 下载源代码git clone https://code.google.com/p/closure-compiler/并转到closure-compiler

  2. 编辑src/com/google/javascript/jscomp/CompilerOptions.java 并将checkTypes 设置为true in。您还可以使用各种编译和优化变量。

  3. 运行ant编译代码

不过请注意,tightenTypes 是实验性的,而且很破旧。

【讨论】:

    【解决方案4】:

    编译器有一个标志,您可以设置它以使未知类型输出警告。

    --jscomp_warning=reportUnknownTypes
    

    您还需要提高警告级别。

    --warning_level=VERBOSE
    

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 1970-01-01
      • 2019-09-27
      • 2017-10-04
      • 2016-08-15
      • 1970-01-01
      • 2010-12-14
      • 2012-04-21
      • 1970-01-01
      相关资源
      最近更新 更多