【问题标题】:Don't escape double quotes不要转义双引号
【发布时间】:2017-04-22 14:05:47
【问题描述】:

我发现 uglifyJS 会忽略单引号字符串中的转义双引号。

'test \" + foo + \"'

结果

'test " + foo + "'

这只是一种错误的行为。

我有一个要缩小的.js,并且这些数据必须进入 JSON。但是 JSON API 必须是这样的。

{
    string: "test \" + foo + \""
}

不是

{
    string: "test " + foo + ""
}

有没有办法配置不忽略\"的uglifyJS

目前我 uglify 我的 javascript 并将我所有的 \" 替换为占位符。在此之后,我使用所有占位符进行字符串替换以使其正常工作。 但后来我的测试不起作用。

编辑:我的Javascript 的丑化版本必须是有效的JSON 和有效的Javascript

编辑:根据要求,真实示例的一部分。此代码必须被丑化,然后放入 JSON。

var privacylink = '#privacyButtonURL#';
link = '<a href=\"' + privacylink + '\" target=\"_blank\" style=\"color:#4398b5; text-decoration:underline;\">hear</a>';

丑化版本是

var a="#privacyButtonURL#", b='<a href="'+a+'" target="_blank" style="color:#4398b5; text-decoration:underline;">hear</a>'

这行不通。

JSON.stringify('var a="#privacyButtonURL#", b='<a href="'+a+'" target="_blank" style="color:#4398b5; text-decoration:underline;">hear</a>'')

【问题讨论】:

  • “这只是一个错误的行为”——它不是。在 JavaScript 中,在这种情况下,这两个语句的含义完全相同。您的问题是您依赖于 JS 的特定格式,以便您可以通过将字符串混合在一起来构建 JSON。请改用适当的 JSON 库。
  • JSON.stringify({string: 'test " + foo + "'})
  • 这不是问题。我动态创建了一个.js,我想将它发送到我的后端。我后端的 API 只需要 JSON。所以我用.js 作为字符串向它发送一个有效的JSON。但是在这个 .js 字符串中,我需要转义双引号,否则它不起作用。
  • @DK1990 我不明白,你能举一个简单、真实的例子,{string: JSON.stringify('test " + foo + "')} 不起作用吗?它会给出你想要的,将单引号转换成双引号并转义里面的双引号。无需手动添加多余/非法的转义字符。
  • 按要求。我添加了一个真实的例子。

标签: javascript json quotes double-quotes uglifyjs


【解决方案1】:

有一个关于报价格式的github issue

上面链接中给出的解决方案是告诉uglify保持原来的报价格式:

$ echo "console.log(\"foo\",'bar');" | uglifyjs --quotes=1
console.log('foo','bar');

$ echo "console.log(\"foo\",'bar');" | uglifyjs --quotes=2
console.log("foo","bar");

$ echo "console.log(\"foo\",'bar');" | uglifyjs --quotes=3
console.log("foo",'bar');

或者使用 gulp,将以下参数作为 uglify.minify() 函数的参数:

{ output: { quote_style: 3 } }

对于您的具体问题,由于我不确定它会保留不必要的转义字符(在 javascript 中),因此解决方案是:

  • 通过将所有内容切换为双引号并在必要时转义它们来从 javascript 中删除所有单引号
  • 使用上述选项丑化代码
  • {string: JSON.stringify(code)}

如果您的 javascript 代码由于某种原因必须使用单引号,您可以将 javascript 代码中生成的 html 中的双引号替换为 &amp;#34;&amp;quot;

请注意,我不认为像 var a = 'abc \" def'; 这样的东西首先是有效的 javascript。

要研究的另一件事是如何包含文件(未提及),也许有更好的方法可以将文件直接加载到字符串中,然后您可以在其上调用JSON.stringify()

编辑

如果您使用最近的 javascript 引擎,您还可以在代码中使用 backquotes (`) 并用它们替换双引号或单引号。

或者,如果您的 javascript 代码中没有 $ 或反引号,您可以这样做:

{
    string: JSON.stringify(`uglified javascript code`)
}

【讨论】:

    【解决方案2】:

    你想要:

    'test \\" + foo + \\"'
    

    参考: http://es5.github.io/#x7.8.4

    【讨论】:

    • 当你用这个 uglify javascript 时,它不再是有效的 javascript。
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2013-06-17
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多