【问题标题】:Pre-compiled Closure Templates - "Variable referenced before declaration" Warning in Closure Compiler预编译的闭包模板 - 闭包编译器中的“声明前引用的变量”警告
【发布时间】:2014-01-10 23:11:11
【问题描述】:
java -jar SoyToJsSrcCompiler.jar --shouldGenerateJsdoc --outputPathFormat 
           simple.js --srcs simple.soy

SoyToJsSrcCompiler 生成一个 js 文件,如下所示:

if (typeof templates == 'undefined') { var templates = {}; }
if (typeof templates.simple == 'undefined') { templates.simple = {}; }

/**
 * @param {Object.<string, *>=} opt_data
 * @param {(null|undefined)=} opt_ignored
 * @return {string}
 * @notypecheck
 */

 templates.simple.tinyButton = function(opt_data, opt_ignored) {
     .....
 };

我正在使用带有--warning_level=VERBOSE--compilation_level ADVANCED_OPTIMIZATIONS 的闭包编译器

我收到了这个警告:

simple.js:1: WARNING - Variable referenced before declaration: templates
if (typeof templates == 'undefined') { var templates = {}; }

如何清除此警告?

【问题讨论】:

  • 试试:var templates=templates||{};templates.simple=templates.simple||{};
  • @elclanrs 此代码由 SoyToJsSrcCompiler 生成。每次模板更改时,我都必须对其进行编辑

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


【解决方案1】:

一种解决方法是在 externs 文件中声明变量:

/** @suppress {duplicate} */
var template;

但是 Soy 编译器应该是固定的。我希望人们不会看到这一点,因为您通常将它与 Closure Library 一起使用,并且在这种模式下,Soy 编译器应该生成:

goog.provide('template.simple')

【讨论】:

  • 您也应该能够在您的来源中包含此定义,只要它列在模板来源之前。
【解决方案2】:

如果您在 Soy 中使用 Closure 编译器,您应该传递 --shouldProvideRequireJsFunctions--shouldProvideRequireJsFunctions。否则,它假定您不会使用编译器并生成浏览器可以理解的代码,但在其他方面有点不确定。

(来源:我帮助维护 Soy 编译器。我们通常不会在没有通过其中任何一个标志的情况下测试它们的编译器。将这些标志中的至少一个设为强制性可能是有意义的,因为没有它们它真的无法正常工作。 )

【讨论】:

  • 您的意思是:“...--shouldProvideRequireJsFunctions--shouldProvideRequireSoyNamespaces ...”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多