32 votes

Comment forcer le compilateur de closure de google à garder "use strict" ; dans le code js compilé ?

Si vous utilisez le modèle de module et avez quelque chose comme ceci :

(function () {
   "use strict";
   // this function is strict...
}());

et de compiler le code à l'aide du compilateur Google Closure, le "use strict"; ne se retrouvera pas dans le fichier compilé.

Alors comment empêcher le compilateur Closure de supprimer la directive ES5/strict ?

(Notez que je ne veux pas utiliser l'autre mode d'application du mode ES5/strict, qui consiste à ajouter simplement le "use strict" ; à la première ligne du fichier compilé. Je veux utiliser le modèle de module tel que décrit aquí .)

53voto

Ben Challenor Points 1902

Mise à jour : le mode strict est maintenant supporté dans le compilateur.

Il suffit d'utiliser --language_in=ECMASCRIPT5_STRICT .

Références :

http://code.google.com/p/closure-compiler/issues/detail?id=69

http://code.google.com/p/closure-compiler/source/detail?r=873

http://code.google.com/p/closure-compiler/source/detail?r=1114

0 votes

Y a-t-il une annotation pour cela ?

0 votes

D'après les premières recherches, il semble que le compilateur de fermeture ne supprimera pas les instructions "use strict" ; inutiles des fichiers concaténés dans ce mode... Il faut savoir que

0 votes

Il semble également qu'il ajoutera 'use strict'; en haut de la page si elle n'y est pas déjà. Super !

10voto

joelhardi Points 6538

Ce n'est pas la meilleure réponse, mais pour autant que je sache, c'est un problème connu ou une "fonctionnalité" (selon votre point de vue) du compilateur de fermeture. Voici un exemple explication partielle de certains des problèmes qui se posent. Il n'y a aucun moyen de préserver les déclarations de mode strict au niveau du fichier lorsque plusieurs fichiers sont combinés, et la fonction d'inlining de fonction du compilateur romprait la portée des déclarations de mode strict au niveau de la fonction. Étant donné que le comportement des déclarations "use strict" serait imprévisible/incorrect dans le code compilé (ce qui pourrait briser les programmes lorsque le mode strict est mal appliqué à du code non strict), le compilateur les supprime comme tout autre code mort.

Il semble qu'il y ait eu une idée d'implémenter complètement les contrôles du mode strict de l'ECMAScript 5 dans le compilateur (auquel cas il n'y aurait aucun inconvénient à le supprimer du code compilé), mais ce n'est pas encore le cas.

Compilation en SIMPLE_OPTIMIZATIONS au lieu du mode ADVANCED_OPTIMIZATIONS désactivera la suppression des codes morts, mais je suppose que vous le savez déjà.

3 votes

Mise à jour : la réponse de Ben Challenor ci-dessous semble être la nouvelle réponse "correcte".

8voto

Stephen Chung Points 9467

Dangerous . Closure Compiler en mode avancé est no compatible en mode strict, ce qui signifie que le compilateur réécrira le code en fonction de ECMAScript 262 rev 3 règles. Certaines règles sont modifiées pour le mode strict (par exemple, la liaison "this" dans les fonctions anonymes, la résolution de la portée, etc.) qui causera une rupture de code si Closure Compiler réécrit le code de manière incorrecte en raison d'hypothèses de langage erronées.

La réponse courte (et la réponse officielle du compilateur de fermetures) est : ne le faites pas.

Si vous voulez vraiment y glisser un "usage strict", essayez :

eval('"use strict";');

1voto

John Points 149

Vous pouvez utiliser le wrapper de sortie du compilateur pour créer le wrapper du module et y inclure la directive "use strict".

0voto

eBusiness Points 2533

Le mode strict est utile pour le débogage, et pas grand-chose d'autre tant qu'il n'est pas adopté par tous les principaux navigateurs. Le temps que Closure Compiler supprime la balise, sa durée d'utilité est de toute façon terminée. Je suis sûr qu'ils mettront à jour le compilateur pour permettre la préservation de la balise bien avant que cette fonctionnalité ne soit réellement utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X