闭包编译器高级和服务器端注入的Javascript

Closure Compiler Advanced and Server-side injected Javascript

本文关键字:注入 Javascript 服务器端 编译器 高级 闭包      更新时间:2024-05-23
myVariable = "<%=myVar%>"
if ( myVariable == "Y" )  doSomething;
else doSoemthingElse;

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

全局变量

myVariable = window["myVariable"];

评估

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

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

作为函数变量传递

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

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

如果有某种方法可以将变量注释为未知变量,即使它被定义为字符串,或者欺骗编译器这样想,那就太好了。

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

编辑:搜索内联变量可能很乏味,甚至更糟的是,嵌入在内联脚本中的 <% %> 代码段和 html 标记中的 onclick 事件可能更复杂。

最好的推荐方法是什么?
如果可能的话,我希望能够内联 <%=myVar%> 字符串,以便输出变为

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

但是,如果不可能,是否建议创建一个构建前/后工具,只使用全局变量,使用函数,或者只是将其视为情境?

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

在选择方法时,我应该考虑哪些主要考虑因素? 我只能想到时间/精力投资。这只是一个过于努力优化的情况吗?我应该只提取 <%%> 的东西并将它们放在全局变量中吗?

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

"<%X%>" === "<%Y%>">

将在编译时计算。类似地,"如果('<%Foo%>'(..."等价于"if (true( ...",因此通常直接使用替换是不明智的。

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

" +

eval('"<%X%>"'( + ">

但是,如果您使用源映射,则很棘手。