2017-08-05 1 views
0

J'ai créé un fichier extern dans un fichier javascript et l'ai spécifié dans le cadre de l'option de ligne de commande Google Closure Compiler (GCC). Je compile avec le mode avancé. GCC prend la fonction dans mon extern et la place dans le code compilé. Je ne sais pas pourquoi ça ferait ça. GCC est supposé reconnaître que la fonction extern est dans un fichier séparé. Lorsque j'exporte l'objet, il renomme l'objet et laisse les noms de fonctions de l'objet seuls MAIS il crée une copie de la fonction extern entière dans le code compilé.Google Closure Compiler importe mes fonctions externes

J'ai essayé de nombreuses variantes (trop nombreuses ici pour les lister) pour voir comment empêcher GCC de le faire mais rien n'a fonctionné.

Mon extern:

var MyCustomResizer = { 
    "onResize": function (a, b) { 
    }, 
    "detach": function() { 
    } 
} 

J'exporté l'objet comme suit:

window["MyCustomResizer"] = MyCustomResizer; 

Mon application en utilisant la fonction "détacher":

MyCustomResizer.detach(); 

Mes paramètres du compilateur:

java -jar closure-compiler/compiler.jar \ 
    --compilation_level ADVANCED_OPTIMIZATIONS \ 
    --externs scripts/externs/resizer-extern.js \ 
    --js_output_file scripts/release/myapp.js \ 
    --warning_level VERBOSE \ 
    --language_out ECMASCRIPT5 \ 
    --language_in=ECMASCRIPT_2017 \ 
    --js scripts/base.js 

Et la sortie compilé généré contient ceci:

ha.detach(); 
... 
var ha = { 
    onResize: function() { 
    }, detach: function() { 
    } 
}; 
+0

Vous n'exportez pas d'externs. C'est inutile. –

+0

Je n'exporte pas d'externs. J'ai même laissé de côté la ligne de la fenêtre de code ["MyCustomResizer"] = MyCustomResizer; mais cela n'a rien fait. En laissant cela de côté, l'appel de fonction a été retiré de mon code. Maintenant c'est inutile. J'ai également suivi le modèle identique que j'utilise pour utiliser jQuery mais cela n'a pas aidé non plus. – AndroidDev

Répondre

0

Il se trouve que lorsque vous spécifiez les fichiers externat, vous devez utiliser l'option --extern devant chaque fichier extern. Je ne l'avais sur le premier:

incorrect:

java -jar closure-compiler/compiler.jar \ 
    --compilation_level ADVANCED_OPTIMIZATIONS \ 
    --externs scripts/externs/jQuery/jquery-1.9-externs.js \ 
       scripts/externs/third-party.js \ 
    --js_output_file scripts/release/servetus-min.js \ 

Correct:

java -jar closure-compiler/compiler.jar \ 
    --compilation_level ADVANCED_OPTIMIZATIONS \ 
    --externs scripts/externs/jQuery/jquery-1.9-externs.js \ 
    --externs scripts/externs/third-party.js \ 
    --js_output_file scripts/release/servetus-min.js \ 

Je trouve très étrange que le compilateur ignore que l'un sans l'--externs mais seulement va de toute façon et copie ses fonctions dans le code compilé. Cela ne devrait pas être autorisé et un avertissement devrait être émis. Cela a pris une journée entière à traquer.

+0

Tout chemin sans indicateur précédent est supposé être un fichier d'entrée JS. Ce style est assez standard par de nombreux outils CLI. –