2010-10-27 24 views
1

J'aime le fait que le compilateur Google Closure optimise les symboles dans le code. Cependant, je n'ai pas trouvé un bon moyen de définir des fonctions exportées publiques qui prennent en paramètre des objets de configuration. Considérez cet extrait de code:Meilleure façon de définir un objet de configuration à l'aide de Google Closure

goog.provide('foo'); 
goog.require('goog.dom'); 

/** @typedef {{ 
*    id : string, 
*    clazz : string 
*   }} 
*/ 
foo.config; 

/** 
* Does some neat stuff 
* @param {foo.config} config 
*/  
foo.myFoo = function(config) { 
    var el = goog.dom.getElement(config.id); 
    goog.dom.classes.add(el, config.clazz); 
} 
goog.exportSymbol('foo.myFoo', foo.myFoo); 

Supposons maintenant on charge ce script, et que vous voulez appeler myFoo comme suit:

<script type="text/javascript"> 
foo.myFoo({ 
    id: 'unique-id', 
    clazz: 'pretty' 
}); 
</script> 

Si compilé, ce échouerait parce que les propriétés id et clazz ont été compressés.

Est-ce que quelqu'un connaît une façon élégante de mettre en œuvre et d'exporter des objets de configuration à l'aide du compilateur Google Closure?

Répondre

1

Ma suggestion serait d'annoter simplement le paramètre comme {Object} et citer les clés, comme ci-dessous:

foo.myFoo({ 
    'id': 'unique-id', 
    'clazz': 'pretty' 
}); 

... 

/** 
* Does some neat stuff 
* @param {Object} config 
*/  
foo.myFoo = function(config) { 
    var el = goog.dom.getElement(config['id']); 
    goog.dom.classes.add(el, config['clazz']); 
} 
+0

Merci! J'essayais de résoudre le même problème et cela a fonctionné. Mais je ne suis pas sûr de comprendre pourquoi le compilateur obscurcit les noms de propriété lorsque la notation par points est utilisée, mais pas lorsque la notation en crochet est utilisée. Je sais que la notation en carré autorise les variables, mais le compilateur ne les masquerait-il pas aussi? –

+0

Pourquoi changer le param à "Object"? Sa définition de type était correcte, tout ce qu'il avait à faire était de déclarer un extern ou d'utiliser un littéral de chaîne: 'config ['id']' au lieu de 'config.id'. Supprimer la définition de type correcte signifie que s'il a déjà appelé la fonction depuis son code compilé, il n'aurait aucune vérification de type. Défait le point, non? – EMMERICH

+0

Ma compréhension de l'annotation est qu'il est utilisé pour les humains afin de donner du sens à une méthode, tout comme une ligne de commentaire plus élégante. Plus important encore, il permet à Google de lancer des erreurs si cette méthode a été mal utilisée. –

1

En ce qui concerne les conflits de noms déchiquetés et propriété brute

Vous devez soit :

  • "extern" vos noms de propriété (afin qu'ils ne seront pas changé de nom)
  • utilisation "de la notation entre crochets" pour propertiies d'accès

En ce qui concerne les objets configuration

Selon les documents de fermeture du compilateur, actuellement vous ne pouvez pas le faire. Vous devez marquer le param comme objet.

Vous peut définir un type, mais il ne vous aidera pas parce qu'un type nécessite tous les propriétés d'exister, mais vous pouvez seulement définir quelques paramètres dans un objet de configuration.

La documentation du compilateur de fermeture vous recommande de marquer le paramètre en tant qu'objet, mais de documenter les champs dans les commentaires.