La documentation du compilateur Closure indique clairement : "N'utilisez pas d'Externs au lieu d'Exports". Parce que les Externs sont très pratiques à utiliser, j'ai rencontré un problème :
function Lib(){
//some initialization
}
Lib.prototype = {
invoke : function(str){
//this function is called from outside to invoke some of Lib's events
}
}
Lorsque vous utilisez Closure Compiler avec OPTIMISATIONS AVANCÉES L'invocation de la fonction est supprimée de la source. Cela peut être évité de deux façons : En ajoutant la ligne après la définition du prototype :
Lib.prototype['invoke'] = Lib.prototype.invoke;
Mais cela ajoute une vilaine paix de code à la fin du code de sortie :
Lib.prototype.invoke = Lib.prototype.g;
J'ai réussi à m'en débarrasser en ajoutant cette ligne au constructeur :
this.invoke = this.invoke;
Et cette ligne dans le fichier externs :
/**
* @param {String} str
*/
Lib.prototype.invoke = function(str){};
De cette façon, Closure Compiler ne peut pas supprimer la fonction invoke du code de sortie, car elle est assignée par elle-même dans le constructeur, et aussi, il ne peut pas la renommer, car elle est définie dans le fichier externs. Alors quelle méthode est la meilleure ?