闭包编译器修改字符串中的结束括号
Closure Compiler modifying end bracket in string
我尝试通过闭包编译器运行以下Javascript代码:
var firstRun = eval("<?--#exec cmd_argument='command'-->");
结果为:
var a=eval(" <?--#exec cmd_argument='command'--\x3e")
因为它是 SSI 命令,所以我需要不将 >
转换为 \x3e
。我尝试使用 --charset=utf-8
和 US-ascii
作为 Closure Compiler 的输入。我也试过在字符串中使用 \u003e
。无论我做什么,它都会输出 >
作为 \x3e
,这看起来很奇怪,因为它对 <.
不一样
我使用的闭包编译器的输入命令是:
java -jar compiler.jar --js file.js --js_output_file newfile.js
即使有一个编译器选项可以避免这种情况发生,我的观点是这不是一个好的做法,因为您依赖于编译器输出某些内容(即本例中的 SSI 字符串)的精确程度可以有许多不同的表示形式(如您所见,原始字符串已更改)。
编译器这样做是为了避免字符串 -->
结束 HTML 注释,以防它嵌入 HTML 代码中。过去通常的做法是将 JavaScript 包裹在 HTML 注释中,以避免在不支持 JavaScript.
的浏览器中出错
可能的解决方案:你能单独包含你的 SSI 字符串,这样它就不会通过编译过程吗?这样你就可以保证它不会受到编译器的影响。
这可以通过在另一个 uncompiled JS 文件中包含 SSI 字符串或在 uncompiled SSI 字符串前加上 编译JS输出。像这样:
var MY_GLOBAL_SSI_STRING = "<?--#exec cmd_argument='command'-->";
// compiled code follows...
然后您可以从您的(待编译的)代码中引用 MY_GLOBAL_SSI_STRING,如下所示:
var firstRun = eval(goog.global['MY_GLOBAL_SSI_STRING']);
希望对您有所帮助。
我尝试通过闭包编译器运行以下Javascript代码:
var firstRun = eval("<?--#exec cmd_argument='command'-->");
结果为:
var a=eval(" <?--#exec cmd_argument='command'--\x3e")
因为它是 SSI 命令,所以我需要不将 >
转换为 \x3e
。我尝试使用 --charset=utf-8
和 US-ascii
作为 Closure Compiler 的输入。我也试过在字符串中使用 \u003e
。无论我做什么,它都会输出 >
作为 \x3e
,这看起来很奇怪,因为它对 <.
我使用的闭包编译器的输入命令是:
java -jar compiler.jar --js file.js --js_output_file newfile.js
即使有一个编译器选项可以避免这种情况发生,我的观点是这不是一个好的做法,因为您依赖于编译器输出某些内容(即本例中的 SSI 字符串)的精确程度可以有许多不同的表示形式(如您所见,原始字符串已更改)。
编译器这样做是为了避免字符串 -->
结束 HTML 注释,以防它嵌入 HTML 代码中。过去通常的做法是将 JavaScript 包裹在 HTML 注释中,以避免在不支持 JavaScript.
可能的解决方案:你能单独包含你的 SSI 字符串,这样它就不会通过编译过程吗?这样你就可以保证它不会受到编译器的影响。
这可以通过在另一个 uncompiled JS 文件中包含 SSI 字符串或在 uncompiled SSI 字符串前加上 编译JS输出。像这样:
var MY_GLOBAL_SSI_STRING = "<?--#exec cmd_argument='command'-->";
// compiled code follows...
然后您可以从您的(待编译的)代码中引用 MY_GLOBAL_SSI_STRING,如下所示:
var firstRun = eval(goog.global['MY_GLOBAL_SSI_STRING']);
希望对您有所帮助。