2011-02-11 7 views
10

Es obvio que tienen las técnicas básicas Minify y Packer ...buenos consejos y trucos para "racionalizar" su Javascript y jQuery

pero me preguntaba si hay algún técnicas poco de Javascript de código más pequeño (como las declaraciones alternativa si con ? y : etc. en ellos).

Luego, una vez que tengo código aerodinámico agradable (...) Voy a minify/empacar

+2

Los trucos son agradables, pero ¿qué tal la facilidad de mantenimiento y legibilidad? estos deben tenerse en cuenta también. los grandes proyectos de JS web pueden ser muy difíciles de mantener y entregar sin ellos. – kjy112

Respuesta

13

Una técnica muy buena para ayudar a minifiers, es para pasar variables en una función de auto invocación:

(function(window, document, $, undefined) { 
     // all of your application logic goes in here 
}(window, window.document, jQuery)); 

Un minificador creará accesos directos para los argumentos, como a, b, c, d.

(function(a, b, c, d) { 
}(window, window.document, jQuery)); 

Ahora, window, document y jQuery (si se usa) y el undefined value se accede a menudo normalmente. Esto ayudará a disminuir el tamaño del archivo aún más.

Algunos buenos atajos de JavaScript se describen en this article.

Por ejemplo, use ~~ en lugar de Math.floor().

var floored = Math.floor(55.2115); // = 55 

var floored = ~~(55.2115); // = 55 

Otra cosa muy interesante es, que casi todos los intérpretes de JavaScript convertir números para usted. Por ejemplo, queremos tener un setTimeout que se dispara después de 3 minutos. En lugar de hacerlo como

setTimeout(function() { 
}, 180000); 

o 60 * 3 * 1000, sólo podemos llamar:

setTimeout(function() { 
}, 18e4); 

Lo que probablemente tiene mucho más sentido, en números mucho más grandes, pero de todos modos :-)

+0

¡También me gusta esto! Ty –

+2

+1 De lo contrario, los objetos globales no pueden renombrarse. –

+0

¡Ama el Math.floor() también! –

3

Nada vale la pena la molestia - con minificación y gzip, guardando un personaje aquí y dos definitivamente hay una microoptimización innecesaria. Puede guardar algunos bytes, sí, tal vez incluso cien o dos, pero a expensas de su tiempo de desarrollo, cuando podría estar haciendo algo increíble.

+0

Estoy de acuerdo contigo, pero al final del día, el código más pequeño es más rápido ... Generalmente ... –

+2

@Neurofluxation: [citation-needed]. Ejemplo tonto: puede comprimir el código y luego ejecutar un descompresor sobre él; será más pequeño * y * más lento, debido a la sobrecarga de descompresión. De todos modos, si está programando un proyecto para divertirse, de todos modos, dedique tiempo al legendario 97% de las microoptimizaciones; será una experiencia de aprendizaje, pero no se engañe pensando que es una característica importante. Si estoy codificando para otra persona, me sería difícil justificar el tiempo invertido de esa manera (a menos que el objetivo sea de hecho la optimización: Google puede reducir 2 bytes de su página principal, debido a su tráfico). – Piskvor

+0

Entendido - buena discusión :) ¡Me gusta la optimización! * + 1 * –

10

Lo que me gusta es

for(var i = arr.length;i--;) 

no ahorra mucho código, pero tiene dos ventajas:

  • acceso .length sola vez
  • "más rápido" que una tradicional for bucle

Pero solo funciona si el procesamiento el orden de la matriz no importa.


Creo que lo que probablemente todo el mundo sabe es cómo establecer los valores por defecto, utilizando lógica OR:

function(must, option) { 
    option = option || "defaultValue"; 
} 

Si option no está establecido, es undefined que evalúa a false. JavaScript devuelve el valor de la variable que cumple la expresión (o el valor de la última si las expresiones no se cumplen, creo). Por supuesto, depende de qué valores puede tener option, es decir, esto no funcionaría si un posible valor es false.


Una manera rápida de convertir las cadenas de números para los números es anteponiendo +. No es necesario usar, p. parseInt:

var n = +"123"; 
// instead of `var n = parseInt("123", 10)` 
+0

Nice^_^- ¡Este es exactamente el tipo de consejos que estoy buscando! –

+0

Pensé que era solo más rápido porque no consulta '.length' en cada iteración, ya que la diferencia de incremento/decremento será efectivamente 0 en JavaScript? – Piskvor

+0

Supongo que un ciclo while invertido es el ciclo más rápido que puede crear. – jAndy

1

me acaba de escribir el código de un modo claro y entendible a continuación, utilizar el cierre de Google o similar a optimizar y comprimirlo.

http://code.google.com/closure/

Cita del sitio de Cierre:

El Closure Compiler compila en código JavaScript compacto y de alto rendimiento. El compilador elimina el código muerto y reescribe y minimiza lo que queda para que se descargue y se ejecuta rápidamente. También comprueba la sintaxis, las referencias de variables y los tipos, y advierte sobre errores comunes de JavaScript.

+0

Sí, he usado esto, pero prefiero evitar la compresión, quiero que mi código sea legible, ya que es una experiencia de aprendizaje –

+1

@Neurofluxation: Entonces haz lo que hace jQuery: IIRC, puedes elegir entre jquery.js y jquery. min.js: conserve el código normal, y también tenga el código comprimido/minificado para casos donde el tamaño importa. – Piskvor

+1

Ese es exactamente el punto. Haga que el código que escribe y mantenga legible sea legible, luego deje que Closure lo optimice al máximo. Probablemente no debería haber dicho "comprimir" porque eso no es realmente lo que está pasando ... El cierre inspecciona el código y aplica las optimizaciones que lo hacen rápido y pequeño. En cuanto a la compresión, deja que gzip haga eso en tu servidor. – scunliffe

1
if (conditional && conditional) { 
    doSomething(); 
} 

puede convertirse en:

conditional && conditional && doSomething(); 
+0

@Neuro: seguro (http://jsfiddle.net/Sxv6E/), la clave es la final "&&" – Matt

+0

¡Ámela! - maldito límite de caracteres –

1

Esta es una idea admirable. Pero creo que es más importante que el código sea legible, comprensible y mantenible, que optimizado para el tamaño. La totalidad de la versión minimizada de jQuery 1.5 tiene solo un tamaño de 85 KB. Esto es más pequeño que muchas imágenes en muchos sitios web.

Mucha gente escribir código como:

$('a#click_me').bind('click', function(){ 
    $(this).children('img').hide(); 
    ... etc... 
    $(this).parent().addClass('xyz'); 
}); 
$('a#click_me').css('width', '10px'); 
$('a#click_me').css('height', '10px'); 

en lugar de:

$('a#clickme').css({width: '10px', height: '10px'}).click(function(){ 
    var $this = $(this), href=this.href; 
    $('img', this).hide(); 
    ... etc ... 
    $this.parent().addclass('xyz'); 
}); 

es decir, utilizar los mapas de ({a: b, c: d}) cuando sea posible (por ejemplo, en css() arriba).

Use el encadenamiento $(selector).method1().method2().

Usar p. Ej. $('img', this) en lugar de $this.children('img');

No utilice continuamente el mismo selector, almacene el resultado en una variable (por ejemplo, $this).

En su caso, utilice el elemento de JavaScript, en lugar de jQuery uno, p.

href = this.href; rather than href = $(this).attr('href'); 
+0

Mantengo constantemente copias de mi código descomprimido :) –

Cuestiones relacionadas