2016-12-07 111 views
0

因为我发现uglifyJS忽略单引号字符串中的转义双引号。不要逃避双引号

'test \" + foo + \"' 

结果

'test " + foo + "' 

这仅仅是一个错误的行为。

我有一个.js,我想缩小和这个数据必须进入JSON。但是JSON API必须是这样的。

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

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

是否有配置uglifyJS,它不要忽略\"

在我丑化我的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>'') 
+3

“这只是一种错误的行为“ - 事实并非如此。在JavaScript中,在这种情况下,这两种表述意味着完全相同的东西。你的问题是你依赖于特定的JS格式,所以你可以通过将字符串混合在一起来构建JSON。改用适当的JSON库。 – Quentin

+1

'JSON.stringify({string:'test'+ foo +''})' – coyotte508

+0

这不是问题所在。我动态创建了一个我想发送给后端的'.js'。我后端的API只接受JSON。所以我用'.js'作为字符串发送一个有效的JSON。但是在这个'.js'字符串中,我需要用双引号括起来,否则它不会起作用。 – DK1990

回答

0

有关于报价格式的github issue

在上面的链接中给出的解决方法是告诉丑化保持原有的报价格式:

$ 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'); 

或者与一饮而尽,给出以下作为参数传递给uglify.minify()功能:

{ output: { quote_style: 3 } } 

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

  • 通过切换一切以双引号去掉从JavaScript的所有单引号和逃避他们在必要时
  • 丑化代码与上面的选项
  • {string: JSON.stringify(code)}

如果你的JavaScript代码必须有单引号出于某种原因,您可以将生成的javascript代码中的双引号替换为&#34;&quot;

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

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

编辑

如果您使用最新的JavaScript引擎,你也可以backquotes(`)在代码中使用,并通过他们更换双或单引号。

或者,如果有一个在你的JavaScript代码中没有$也不反引号,你可以简单地做:

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