Je cherche un moyen de supprimer le code de débogage des fonctions afin de pouvoir ajouter des crochets de test aux fermetures. J'ai lu Google Closure Compiler avancé : supprimer les blocs de code au moment de la compilation et j'ai testé la suppression du code de débogage avec ce qui suit :
/** @define {boolean} */
var DEBUG = true;
if (DEBUG) {
console.log('remove me');
}
Optimisation simple avec --define='DEBUG=false'
réduit ce chiffre à var DEBUG=!1;
. Il en va de même pour le présent document :
/** @const */
var DEBUG = false;
if (DEBUG) {
console.log('remove me');
}
Là où je rencontre des difficultés, c'est lorsque j'utilise cette convention à l'intérieur d'une fonction :
/** @const */
var DEBUG = false;
function logMe() {
if (DEBUG) {
console.log('remove me');
}
}
Cela revient à dire ce qui suit :
var DEBUG=!1;function logMe(){DEBUG&&console.log("remove me")};
Je m'attendrais à ce qu'il soit encore réduit à :
var DEBUG=!1;function logMe(){};
Y a-t-il une raison pour que cela ne fonctionne pas comme prévu ? Je cherche juste un moyen propre de déboguer le code et je ne suis pas prêt à me lancer dans des optimisations avancées.
Mise à jour
Conformément à la réponse de @John, j'ai implémenté mon propre compilateur et j'ai constaté que la configuration suivante permet de supprimer if (DEBUG) {}
de l'intérieur et de l'extérieur du code dans le cas d'une @define
:
CompilerOptions options = new CompilerOptions();
CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(options);
//options.setInlineConstantVars(true);
options.setInlineVariables(CompilerOptions.Reach.ALL);
options.setDefineToBooleanLiteral("DEBUG", false);
Cela fonctionne assez bien pour un seul fichier avec les limitations suivantes :
- Pour ce faire, il faut
var DEBUG
doivent être définis dans chaque fichier, ce qui est une mauvaise pratique. - Lorsque vous combinez plusieurs fichiers, vous ne pouvez avoir qu'un seul
var DEBUG
ou le compilateur ne peut pas l'optimiser. Cela pourrait être évité en compilant chaque fichier individuellement et en les fusionnant. - La valeur étant définie au début du fichier, il n'est pas possible de recevoir la valeur à l'avance.
J'ai réfléchi à l'idée de supprimer toutes les var DEBUG
à partir des fichiers et de l'injecter dans le source ou extern avant l'exécution, mais j'ai rencontré deux problèmes :
- Le fait de le définir dans extern ne semble rien changer.
- Non défini
DEBUG
dans le code non compilé provoque une erreur de référence dans le navigateur.
L'idéal serait de tester window.DEBUG
ce qui ne provoque pas d'erreur de référence. Malheureusement, lors de l'injection de /** @const */ var window = {}; /** @const */ window.DEBUG = false;
fonctionne au plus haut niveau, en réduisant if (window.DEBUG) {}
l'optimisation est en fait annulée si elle est placée dans une fonction.
À moins qu'une autre option de compilateur ne fonctionne, la seule option qui aurait vraiment du sens serait d'opter pour window.DEBUG
et avant la compilation injecter /** @const */ var DEBUG = false;
et à un remplacement global de /\bwindow.DEBUG\b/
con DEBUG
. Existe-t-il une meilleure solution ?