2010-09-27 16 views
7

Greetings Rails y Javascript Gurus!Rails compresión/minificación de JavaScript en respuesta a Javascript respuesta?

Tengo un proyecto en el que estoy devolviendo un archivo JavaScript grande en un bloque de

respond_to do |format| 
    format.js 
end 

.

Estoy tratando de averiguar cómo puedo minimizar o comprimir la respuesta .js ya que la vista .js.erb está llena de comentarios y varía en tamaño en función de los resultados del controlador.

¿Alguien tiene alguna idea?

Respuesta

5

bueno, tal vez tienen una solución:

respond_to do |format| 
    format.js { self.response_body = minify(render_to_string) } 
end 

Esto funciona perfectamente. Por supuesto que la clave es minify método. Encontrará una gran cantidad de minificadores de JS. Por ejemplo, puede usar este (si la licencia lo permite): http://github.com/thumblemonks/smurf/raw/master/lib/smurf/javascript.rb - se basa en jsmin.c de Crockford.

Si coloca este archivo en su lib, lo requieran, su método de Minify puede tener este aspecto:

def minify(content) 
    min = Smurf::Javascript.new(content) 
    min.minified 
end 

la esperanza de que eso le sirvió.

Si planea hacer la minimización automáticamente, entonces probablemente debería comprar una pieza de middleware. Sorprendentemente no pude encontrar ninguno (hay muchos dirigidos a CSS/JS pero se trata de activos estáticos, no de contenido dinámico) pero no sería un problema escribirlo.

+0

Gracias pawien! Esto me da algo de qué pensar con seguridad. :) Pasar el resultado a un bloque y procesarlo con un minificador parece ser una buena solución. Entonces solo necesito descubrir cómo almacenar en caché el resultado. Jugaré con esto hoy y mañana ... Puedo molestarte. : D –

+2

¿Hay alguna manera de hacer esto en Rails3.2, solo usando sus propias características incorporadas de la canalización de activos? –

+0

gracias radek! buena solución. nazar, agregó mis rieles 3 bits modificados a continuación – djburdick

3

Para carriles 3 con el construido en el método Uglifier (el valor por defecto para el gasoducto activos) Código

Sede de Radek arriba y sólo cambio esto en

def minify(content) 
    Uglifier.new.compile(content) 
    end 
12

para los carriles 4:.

render js: Uglifier.new.compile(render_to_string) 
Cuestiones relacionadas