2016-12-07 1 views
0

comme je l'ai découvert uglifyJS ignore les doubles guillemets échappés dans une seule chaîne de guillemets.N'échappez pas aux guillemets doubles

'test \" + foo + \"' 

résultats dans

'test " + foo + "' 

Ceci est juste un mauvais comportement.

J'ai un .js que je veux minifier et ces données doivent aller dans un JSON. Mais l'API JSON doit être comme ça.

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

pas

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

est-il un moyen de configurer uglifyJS qu'il ne négligez pas \"

Au moment où j'enlaidir mon javascript et remplacer tout mon \" avec des espaces réservés. Après cela, je fais une chaîne remplacer avec tous les espaces réservés pour le faire fonctionner. Mais alors mes tests ne fonctionnent pas.

EDIT: La version enlaidir de mon Javascript doit être valide et valable JSONJavascript ainsi.

EDIT: Comme demandé, une partie de l'exemple réel. Ce code doit être minimisé et ensuite mis dans un JSON.

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

La version enlaidir serait

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

Cela ne fonctionnerait pas.

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

« Cette est juste un mauvais comportement "- Il ne l'est pas. En JavaScript, dans ce contexte, les deux énoncés signifient exactement la même chose. Votre problème est que vous dépendez de la mise en forme spécifique de JS afin de pouvoir en compiler JSON en écrasant les chaînes. Utilisez une bibliothèque JSON appropriée à la place. – Quentin

+1

'JSON.stringify ({chaîne: 'test' + foo + ''})' – coyotte508

+0

Ce n'est pas le problème. Je crée dynamiquement un '.js' que je veux envoyer à mon backend. L'API de mon backend ne prend que JSON. Donc j'envoie un JSON valide avec le '.js' comme une chaîne. Mais dans cette chaîne '.js' j'ai besoin de doubles guillemets échappés sinon, ça ne marche pas. – DK1990

Répondre

0

Il existe un format de citation github issue.

La solution donnée dans le lien ci-dessus est de dire enlaidir de conserver le format de citation originale:

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

Ou avec gulp, donnent ce qui suit comme paramètre à la fonction uglify.minify():

{ output: { quote_style: 3 } } 

Pour votre problème spécifique, comme je ne suis pas sûr qu'il gardera les caractères d'échappement inutiles (en javascript), une solution serait:

  • supprimer tous les guillemets simples du javascript en changeant tout pour les guillemets doubles et les échapper au besoin
  • enlaidir le code avec l'option ci-dessus
  • faire {string: JSON.stringify(code)}

Si votre code javascript doit avoir des guillemets simples pour une raison quelconque, vous pouvez remplacer les guillemets doubles dans le code html généré dans le code javascript par &#34; ou &quot;.

Notez que je ne pense pas que quelque chose comme var a = 'abc \" def'; est javascript valide en premier lieu. Une autre chose à examiner serait comment vous incluez le fichier (ce n'est pas mentionné), peut-être qu'il y a une meilleure façon de charger le fichier directement dans une chaîne, sur laquelle vous pouvez ensuite appeler JSON.stringify().

Modifier

Si vous utilisez un moteur récent javascript, vous pouvez également utiliser backquotes (`) dans votre code et remplacer des guillemets doubles ou simples par eux.

Ou, s'il n'y a pas $ ni backquotes dans votre code javascript, vous pouvez simplement faire:

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