2010-11-28 4 views
6

Le compilateur de fermeture incorpore une fonction, mais la taille du code est plus petite si cette fonction n'est pas insérée (je me soucie uniquement de la taille du code - c'est pour JS1k). Puis-je dire au compilateur que je ne veux pas que cette fonction soit inline?Est-il possible de faire du compilateur Google Closure * pas * en ligne certaines fonctions?

Edit: Juste pour expliquer un peu mieux, voici ma fonction:

function lineTo(x,y) { 
    a.lineTo(x,y); 
} 

a dans le contexte de la toile. Parce qu'il y a tellement de a.lineTo s dans le code, avoir cette fonction utilisée en vaut la peine. Comme ceci, mon code est de 1019 octets (et tous les lineTo sont remplacés par a.lineTo). Si je change la fonction de:

function lineTo(x,y) { 
    a.lineTo(x,y); 
    console.log(); 
} 

la nouvelle ligne oblige en quelque sorte le compilateur de ne pas inline cette fonction, ce qui me donne 993 octets. Donc, si je pouvais me débarrasser de la console.log(); je voudrais enregistrer encore 14 octets.

+1

http://code.google.com/intl/fr/closure/compiler/docs/compilatio n_levels.html "Le compilateur n'introduit des fonctions que lorsqu'il détermine que l'inlining est sûr et économise de l'espace." ... peut-être que le doc est faux ou qu'il y a un bug dans le compilateur. – timdream

+0

@timdream Voir mon edit - il semble qu'il va automatiquement aligner une fonction d'une ligne même si l'inlining augmente la taille par rapport à la quitter. – Skilldrick

+0

J'ai compris! Merci. – timdream

Répondre

4

De the tutorial:

Si ... vous trouvez que la fermeture du compilateur supprime les fonctions que vous souhaitez conserver, il y a deux façons d'empêcher cela:
* Déplacez votre fonction appelle dans le code traité par Fermeture du compilateur.
* Exporte les symboles que vous souhaitez conserver.

Vous voulez sans doute la seconde, qui est discussed here, mais se résume à configurer explicitement comme une propriété window:

function foo() { 
} 
window['foo'] = foo; 

Pour votre soumission JS1k, vous seriez tout simplement laisser la dernière ligne de comme c'est inutile. Notez que Closure renommera toujours la fonction, mais comme il commence à renommer vos symboles avec le nom a et continue à partir de là, il est peu probable que vos noms soient plus longs plus long. Vous pouvez l'essayer avec le online compiler service. Si vous collez ceci dans:

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// ==/ClosureCompiler== 

// ADD YOUR CODE HERE 
function hello(name) { 
    alert('Hello, ' + name); 
} 
hello('New user'); 

... le résultat compilé est

alert("Hello, New user"); 

Mais si vous ajoutez

window['hello'] = hello; 

... à la fin, le résultat est compilé:

function a(b){alert("Hello, "+b)}a("New user");window.hello=a; 
+0

"enlève" la même chose que "inline?" –

+0

@Robert: Non, ils signifient également l'élimination du code mort. Mais cela empêche également l'inlining. –

+1

Ce genre de travaux.J'arrive à 995 octets comme ça, parce qu'il génère 'window.lineTo = n;' dans la sortie, ce qui est inutile. – Skilldrick

Questions connexes