2010-12-09 3 views
1

J'écris une extension de Google Chrome avec l'aide du compilateur de fermeture de Google. Je fais un usage intensif de l'API de message pour communiquer entre le code qui s'exécute sur différents processus. C'est pourquoi mes fichiers doivent être compilés séparément. Si j'utilise des optimisations avancées, je dois également accéder aux propriétés avec des chaînes entre guillemets dans les données que j'envoie avec ce message API. Cela fonctionne sans problème mais cela rend mon code laid. Mais j'aime la suppression du code mort qui vient avec des optimisations avancées.ADVANCED_OPTIMIZATION sans renommer

Je voudrais être en mesure de faire la suppression du code mort sans le changement de nom qui vient avec des optimisations avancées. Est-ce possible avec le compilateur de fermeture?

Répondre

0

Sans savoir combien vous voulez conserver, vous pouvez regarder dans la section "Export Symbols You Want To Keep" des docs.

+0

Il est dit clairement dans ma question que je suis déjà l'exportation (... propriétés d'accès aux chaînes entre guillemets ...) les propriétés de mes messages. Je suis spécifiquement à la recherche de la suppression du code mort sans le renommer. Comme je n'ai pas besoin de transférer la source sur le fil, je ne me soucie pas trop de la minification. Cependant, je me soucie du code résultant propre sans 10000 lignes de code mort. Je vais ajouter moi-même une réponse pour que je puisse garder ma réputation si personne ne peut trouver une réponse pertinente, à part «ça ne marche pas». – Jan

1

Oui, je suis d'accord. Il est moche d'avoir à utiliser obj["prop"] au lieu de obj.prop dans tout votre code qui traite des données transmises juste pour utiliser le compilateur de fermeture en mode avancé.

Un truc que j'ai développé est de construire un objet de mappage:

var mapping = { 
    field1: "field1", 
    field2: "field2" 
    : 
}; 

Cet objet, après avoir compilé par le compilateur de fermeture, aura des noms de champs mutilée (renommé) la cartographie à l'original, les noms non substantypés, par exemple :

var a = { 
    b: "field1", 
    c: "field2" 
     : 
}; 

Alors avant d'envoyer les données, je passe à travers une fonction qui permet de cloner l'ensemble de la structure de données, la conversion de chaque nom de champ mutilée dans la version non substantypés dans le nouvel objet avant de passer la nouvelle sortir l'objet:

function cloneData(obj) { 
    var newobj = {}; 
    foreach (var name in obj) { 
     if (!obj.hasOwnProperty(name)) continue; 
     var fullname = mapping[name] || name; 
     newobj[fullname] = obj[name]; 
    } 
    return newobj; 
} 

Pour les données reçues, faites l'inverse.

+0

Bon tour. J'ai fait quelque chose de similaire. Bien que, après un certain temps, j'ai décidé de laisser tomber Closure en faveur de javascript plaine ancienne. Je développais juste pour Chrome (https://chrome.google.com/webstore/detail/kfimchjilnmjmjpdgedcamjninpdkkpk) Et une bibliothèque javascript semblait un peu exagéré pour moi. – Jan