9
votes

Suppression du code de débogage de l'intérieur d'une fonction à l'aide d'optimisations simples du compilateur de fermeture


3 commentaires

Les optimisations simples du compilateur de fermeture ne suppriment pas le code inutilisé, il suffit de le minimiser. Il fait correctement la minécution - le compilateur ne sait pas que cette variable est un drapeau immuable. Vous devrez utiliser les optimisations avancées si vous voulez dépasser le code inutilisé.


Salut @Ancanananian, conformément aux deux premiers exemples, les optimisations simples supprimeront toujours-false si blocs au niveau du script. J'essaie de comprendre pourquoi cette approche ne fonctionne pas d'un niveau dans une fonction.


Oh, je vois - il semble que vous devez utiliser le drapeau de goog.debug spécifique pour une optimisation simple pour le prendre en compte.


6 Réponses :


0
votes

Suppression var debug = true; à partir de votre code et convertissez toutes vos conditions qui vérifient si (débogage) à si (goog.debug) . Modifiez votre option de compilateur pour lire - Définir Goog.Debug = False . La variable goog est intégrée à l'API de la bibliothèque de fermeture pour fournir des options et des indicateurs pour le compilateur.


6 commentaires

Je l'ai donné d'essayer de recevoir cet avertissement: Avertissement - inconnu @define variable goog.debug . Le code n'a pas été dépouillé.


Pour l'enregistrement, j'ai exécuté java -jar compiler.jar --js = test.js -d goog.debug = false avec compiler.jar version 20120430.


Cela vous obligera à inclure le Bibliothèque de fermeture . Si vous n'utilisez pas cela, les paramètres d'optimisation avancés du compilateur sont la voie à suivre.


J'ai traversé le processus et ça marche, mais Je voulais vraiment éviter les optimisations avancées et apporter une nouvelle bibliothèque. C'est un prix vraiment élevé à payer pour supprimer un bloc de code.


Cela dit, c'est vraiment cool comment le constructeur et le compilateur peuvent prendre une énorme bibliothèque et le distiller à la poignée de composants nécessaires à l'exécution.


Hmm ... il ressemble à goog.debug n'est pas magique non plus. Cela ne fonctionne que grâce à la bibliothèque de fermeture, il n'ya donc aucun besoin réel de l'inclure pour cette tâche.



1
votes

Votre Débogou La variable est actuellement globale. GCC ne supprimera ni renommer des variables globales en mode d'optimisation simple, de sorte qu'ils resteront disponibles pour tout code dans d'autres scripts pouvant éventuellement vouloir y accéder. Essayez de joindre votre code dans la fonction anonyme.


0 commentaires

3
votes

Une construction personnalisée du compilateur vous permettrait de le faire. Vous voulez essentiellement "des variables constantes en ligne":

options.setInlineconsantvars (true);

Vous pouvez l'ajouter ici, dans ApplysAfecompilationOptions: http://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/javascript/jscomp/compilationLel.java?r=706

ou vous pouvez utiliser l'API Java et ajouter l'option (sans modifier le code du compilateur). Michael Bolin a donné un exemple de comment faire ici:

http://blog.bolinfest.com/ 2009/11 / Calling-fermeture-compilateur-de-java.html


2 commentaires

Frais. Je vais devoir donner la partie API un coup de feu demain. Je voudrais éventuellement décharger le travail sur un plug-in Maven afin qu'il soit raisonnable d'écrire un coureur de compilateur personnalisé.


J'ai mis à jour ci-dessus. Il semble que options.setinlineVariables (compiléroption.reach.all) est requis. Malheureusement, il y a beaucoup de mises en garde et je ne peux que penser à une solution vraiment piraquine pour le faire fonctionner.



2
votes

C'est une ancienne réponse, mais j'ai trouvé une façon qui n'est pas mentionnée ici. XXX PRE>

avec Advanced_Optimizations Cette compile à ceci: P>

foo();


0 commentaires

1
votes

La façon dont j'ai résolu le problème de "Supprimer les fonctions de débogage de la fermeture compilée JavaScript à l'aide de Simple_Optimization" consistait à combiner une méthode similaire à ce que @john propose ainsi que de la mise à jour de @brian Nichols. Je ne pouvais que récupérer le compilateur de supprimer les lignes en plaçant une portée globale de mon fichier JS principal et en effectuant une compilation personnalisée (à l'aide de plusieurs fichiers .js qui les avez toujours supprimés) xxx

et Ensuite, la compilation du compilateur de fermeture Java avec ANT pour inclure cette option Options.SetinLlineVariables (compiléroption.reach.all); Sous la fonction ApplysAfecompilationOptions sur le fichier compilationLevel.java comme @john suggère. Cela a fonctionné pour moi et n'a pas brisé mon codebase comme avancé ...


0 commentaires

4
votes

Utiliser @define Annotation:

@define {boolean}


0 commentaires