2016-12-07 201 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`) 
}