2010-11-28 8 views
6

El compilador de cierre está entrando en una función, pero el tamaño del código es más pequeño si esa función no está en línea (solo me importa el tamaño del código, esto es para JS1k). ¿Puedo decirle al compilador que no quiero esa función en línea?¿Es posible hacer que el compilador de Google Closure * no * incorpore ciertas funciones?

Editar: Sólo para explicar un poco mejor, aquí está mi función:

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

donde a en el contexto de la lona. Debido a que hay tantos a.lineTo s en el código, vale la pena usar esta función. De esta manera, mi código es 1019 bytes (y todos los lineTo s son reemplazados por a.lineTo). Si cambio la función de:

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

la nueva línea de alguna manera obliga al compilador que no coloca en línea esta función, lo que me da 993 bytes. Entonces, si pudiera deshacerme del console.log();, ahorraría otros 14 bytes.

+1

http://code.google.com/intl/es/closure/compiler/docs/compilatio n_levels.html "El compilador solo agrega funciones cuando determina que la alineación es segura y ahorra espacio". ... tal vez el documento está equivocado o hay un error en el compilador. – timdream

+0

@timdream Ver mi edición - parece que alineará automáticamente una función de una línea, incluso si la línea aumenta el tamaño en comparación con dejarlo. – Skilldrick

+0

¡Entendido! Gracias. – timdream

Respuesta

4

De the tutorial:

Si ... a encontrar que el cierre del compilador es la eliminación de las funciones que desea conservar, hay dos maneras de prevenir esto:
* mover sus llamadas de función en el código procesado por Compilador de cierre
* Exporte los símbolos que desea conservar.

Probablemente quiere que el segundo, que es discussed here, pero básicamente se reduce a establecer explícitamente como un window propiedad:

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

Para su presentación JS1k, que acababa de salir de la última línea fuera ya que no es necesario. tenga en cuenta que Closure aún cambiará el nombre de la función, pero a medida que comienza a cambiar el nombre de sus símbolos con el nombre a y continúa desde allí, es poco probable que sus nombres sean más largos en general.

Puede probarlo con el online compiler service. Si pega esto en:

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

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

... el resultado es compilado

alert("Hello, New user"); 

Pero si se agrega

window['hello'] = hello; 

... al final, el resultado es compilado:

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

¿Está "eliminando" lo mismo que "enlining"? –

+0

@Robert: No, también significan eliminación de código muerto. Pero también evita la inflación. –

+1

Ese tipo de trabajo.Llego a 995 bytes así, porque genera 'window.lineTo = n;' en el resultado, que es innecesario. – Skilldrick

Cuestiones relacionadas