Closure Compiler Advanced和服务器端注入的Javascript

时间:2013-12-10 08:44:54

标签: javascript google-closure-compiler

myVariable = "<%=myVar%>"
if ( myVariable == "Y" )  doSomething;
else doSoemthingElse;

我正在修改代码以便在高级模式下编译。使用JSP / ASP / PHP / etc修改Javascript以注入变量是相当普遍的。 我能想到的解决这个问题的方法包括使用:

全局变量

myVariable = window["myVariable"];

EVAL

myVariable = eval('"<%=myVar%>"');

使用预处理/后处理脚本替换

作为函数变量传递

function exposedFunction(myVariable){/* stuff */}

或传递对象并按名称访问属性

如果有一些方法可以将变量注释为未知变量,即使它被定义为字符串,或者欺骗编译器这样做,也会很棒。

也许更好的方法是为嵌入式Javascript创建一个处理所有这些东西的前/后处理脚本?

编辑: 搜索内联变量甚至更复杂的&lt; %%&gt;可能会很繁琐。嵌入在内联脚本中的片段和html标记中的onclick事件。

最佳推荐方法是什么?
我希望能够内联&lt;%= myVar%&gt;字符串,如果可能的话,输出变为

if("<%=myVar%>"=="Y")doSomething;else doSoemthingElse

但是如果不可能的话,是否建议创建一个pre / post-build工具,只使用全局变量,使用函数,或者只是将其视为情境?

谷歌自己似乎将内联变量注入其内联Javascript的某些地方。 也许他们有一个前/后构建工具?

在选择方法时,我应该考虑哪些主要考虑因素?我只能想到投入时间/精力。 这只是一个尝试太难以优化的情况;我应该提取&lt; %%&gt;事情并把它们放在全局变量中?

1 个答案:

答案 0 :(得分:0)

如果直接在字符串&lt;%...%&gt;中使用,则必须担心编译器是否会将它们视为常量:

“&LT;%X%&gt;” 中===“&lt;%Y%&gt;”

将在编译时进行评估。类似地,“if('&lt;%Foo%&gt;')......”等同于“if(true)...”,因此通常直接使用它们是不明智的。

预处理代码以便以编译安全的方式替换它们,这似乎是合理的:

“”+ eval('“&lt;%X%&gt;”')+“”

但是如果使用源地图则很棘手。