代码之家  ›  专栏  ›  技术社区  ›  Sven Hecht

Google闭包编译器100%键入

  •  10
  • Sven Hecht  · 技术社区  · 15 年前

    如何让我的应用程序在google闭包编译器方面达到100%的类型?

    我已经用jsdoc注释标记了所有内容。有可能得到100吗?我是64.6%

    4 回复  |  直到 15 年前
        1
  •  15
  •   Chad Killingsworth    13 年前

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

    1. 下载当前源:

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

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

    3. 只需调用 ant 在根目录中。修改后的compiler.jar现在位于build目录中。

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

        2
  •  9
  •   Cristian    12 年前

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

    --jscomp_warning=reportUnknownTypes
    

    您还需要提高警告级别。

    --warning_level=VERBOSE
    
        3
  •  5
  •   Jan    15 年前

    我试着编译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不是静态类型的语言。闭包试图将静态类型语言的一些好处引入到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%。只需根据需要尽可能多地输入代码,就可以轻松地使用自己的代码。

        4
  •  0
  •   Mad Echet    13 年前

    所有的学分都归@kayahr,但时间一天天过去了。我想提供一个更新的答案,这是基于一个旧版本的编译器。

    您需要在强制执行类型检查的情况下重新编译源。为此:

    1. 下载源代码 git clone https://code.google.com/p/closure-compiler/ 然后去 closure-compiler

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

    3. 通过运行 ant

    不过要小心, tightenTypes 是实验性的,而且很破碎。

    推荐文章