2009-08-31 16 views
9

¿Alguien sabe de una buena manera de ejecutar automáticamente ciertos tipos de archivos a través de un script de procesamiento al cargarlo? Intento lograr una CSS que minimice automáticamente y Javascript cuando los cargue en el servidor, manteniendo una versión agradable y legible para el ser humano en el lado local mientras mantengo una minima en el servidor. Actualmente estoy usando WinSCP en Windows, que es programable hasta cierto punto, pero puede no ser lo suficientemente script. Probablemente necesitaría algún tipo de solución improvisada, así que no tema sugerir algo con cinta adhesiva; sin embargo, sí tengo que hacer la minificación en mi computadora local y subir el archivo comprimido, ya que uso el alojamiento compartido y no puedo instalar basura en el servidor.Minería automática de CSS y Javascript en la carga

Gracias.

+3

Cygwin + scp + shell script. –

+0

Por cierto, votar una respuesta porque está mal es lo que se supone que debes hacer. Votar una pregunta porque no te gusta el póster es malicioso y grosero. –

+0

Creo que el tono de su comentario a la respuesta de jon y el hecho de que usó CAPS fue más malicioso que la de su pregunta. – redsquare

Respuesta

6

recomiendo crear un makefile para resolver este problema en particular, aquí hay un makefile rápida y sucia que estoy usando para un sitio de la mina:

PUBDIR=../../static/js/ 
OUTDIR=./build/ 
COMPRESSOR=../yui/build/yuicompressor-2.4.2.jar 
ARGS= 
VPATH=${OUTDIR} 
INST_TARGETS=${OUTDIR}jgblue.js 

jgblue.js: combined.js 
    java -jar ${COMPRESSOR} ${ARGS} ${OUTDIR}$< -o ${OUTDIR}[email protected] 

combined.js: main.js listview.js tabs.js 
    cat $^ > ${OUTDIR}[email protected] 

.PHONY: install 

install: 
    cp ${INST_TARGETS} ${PUBDIR} 

Entonces todo lo que tiene que escribir es:

make && make install 

Primero toma todos sus archivos de desarrollo y los concatena en un solo archivo, luego el archivo concatenario se comprime y copia en su directorio público. Estoy usando YUICompressor para la compresión, funciona bastante bien.

+0

Perrito caliente. Eso podría valer la pena con Cygwin para. –

+0

Lo que terminé haciendo (ya que estoy en Windows) es escribir un script de Powershell que mira el directorio para ver los cambios con el complemento PSEventing, luego lo ejecuta a través del minificador apropiado dependiendo de la extensión del archivo. –

5

Dado que está en alojamiento compartido, yo solo sugeriría usar el YUICompressor y ejecutar sus archivos css/js antes de cargarlos. Asegúrese de no perder sus archivos originales; podría ser un dolor hacer cambios en el futuro.

También podría colocar una secuencia de comandos en su servidor que volvería a escribir periódicamente sus archivos css/js, pasarlos a través de minify-process e invocar manualmente esta secuencia de comandos después de realizar una carga.

+0

Lea la pregunta. Pedí una forma de hacerlo en la carga. Sé QUÉ usar, solo necesito saber si hay una buena manera de automatizarlo. –

+0

Leí tu pregunta. Y te di lo que pensé que era la mejor alternativa, ya que no creo que tengas una opción para hacerlo automáticamente en la carga. – Sampson

+0

Bueno, tal vez alguien más lo supiera. Es por eso que pregunté en primer lugar. –

5

Bueno, minimizar CSS es solo un par de expresiones regulares.

// (PHP) but should be easily portable to any language 
function compressCSS($css) { 
    return 
     preg_replace(
      array('@\s\[email protected]','@(\w+:)\s*([\w\s,#]+;?)@'), 
      array(' ','$1$2'), 
      str_replace(
       array("\r","\n","\t",' {','} ',';}'), 
       array('','','','{','}','}'), 
       preg_replace('@/\*[^*]*\*+([^/][^*]*\*+)*/@', '', $css) 
      ) 
     ) 
    ; 
} 

Y empacador Javascript de Dean Edwards ha sido portado a PHP, Perl, .NET and WSH, por lo que si usted está usando alguna de esas tecnologías, que en realidad podría tener que se ejecuta en su propio servidor. ... ¡Solo recuerda guardar los resultados en el caché!

+0

Aparentemente, el OP nos está invalidando por no decirle cómo hacerlo automáticamente en la carga.Como creo que ofreciste una solución válida, compensaré su voto negativo con un voto a favor. – Sampson

+3

¡Cómo me atrevo a rechazar las respuestas que no responden a mi pregunta! –

+11

@Jarett Algunas veces nuestras preguntas se responden mejor con alternativas. – Sampson

2

Me gusta Minify. Es compatible con comprimir y recortar html, javascript y css sobre la marcha.

Es bastante flexible, y se puede integrar en aplicaciones existentes.

Algunas de las características más avanzadas de es combinar varios archivos de JavaScript en uno, lo mismo para css. Tiene múltiples formas de definir qué archivos combinar, lo cual es útil para fines de prueba. De esta manera, no tiene que modificar la configuración cada vez.

+0

Esto podría ser bueno. Parece más estúpido que la solución en la que estaba pensando. –

+0

Es realmente infalible. Agregué más información. – Dykam

1

Sugiero comprimir (por supuesto, de alguna manera automática) en su máquina de desarrollo y probarla allí antes de cargarla en su servidor en vivo. Fundamentalmente cambiar su JavaScript como la última etapa de su proceso de implementación es un riesgo obvio para la introducción de errores.

+0

Esa es una de las razones por las que quiero que se minimice automáticamente en la carga: así que siempre estoy probando con lo que será el archivo de producción real. –

1

Una solución realmente genial que hace que servir js y css sean automáticos como un sueño.

Comprobar: http://code.google.com/p/minify/

Características

  • cosechadoras y le resta CSS múltiple o archivos JavaScript en una sola descarga
    • usa un puerto mejorada de biblioteca y personalizados de Douglas Crockford clases JSMin a Minify CSS y HTML
    • Caché del lado del servidor (archivos/apc/memcache) para evitar hacer trabajos innecesarios
    • responde con un HTTP 304 (no modificado) de respuesta cuando el navegador tiene una copia caché actualizada
    • mayoría de los módulos son perezosos-cargados, según sea necesario (304 respuestas utilizan código mínimo)
    • reescribe automáticamente URIs relativos en archivos CSS combinados para apuntar a ubicaciones válidas
    • Con el almacenamiento en caché habilitado, Minify es capaz de manejar cientos de solicitudes por segundo en un servidor moderadamente poderoso.
    • Content-Encoding: gzip, en función de los encabezados de solicitud. ¡El almacenamiento en caché permite que sirva archivos comprimidos gzip más rápido que la opción mod_deflate de Apache!
    • casos de prueba para la mayoría de los componentes
    • fácil integración de minifiers 3 ª parte
    • clases de utilidad independiente para la codificación y control de caché HTTP enter code here
2

que acabo de escribir este guión minfier en Python. Al igual que la solución Bills, usa el compresor YUI, pero funcionará en un entorno sin igual. Supone que los archivos sin procesar (unminifie) estarán en/some/path/src/y que las versiones minificadas deben ir en/some/path /. También se supone que el archivo jar yuicompressor se encuentra en la carpeta actual:

import os, glob 
from subprocess import Popen,PIPE 

def RunCommand(cmd, show_output ): 
    p = Popen(cmd, shell=True,stdout=PIPE,stderr=PIPE) 
    for line in p.stdout: 
     if show_output: 
      print line 


    outerr = "\n".join(p.stderr.readlines()) 

    if len(outerr) > 0: 
     print "ERROR: " + outerr 
     sys.exit() 

    code = p.wait()   
    if (code > 0): 
     print ("ERROR CODE: %i" % code) 
     sys.exit() 



compresser = "yuicompressor-2.4.2.jar" 
dirs = [ "../wwwroot/css/", "../wwwroot/JavaScript/"] 

extensions = ["*.js", "*.css" ] 

for dir in dirs: 
    src = dir + "/src/" 
    for ext in extensions:  
     for path in glob.glob(os.path.join(src, ext)): 
      file = os.path.basename(path) 
      src_file = os.path.normpath(src + "/" + file) 
      dest_file = os.path.normpath(dir + "/" + file) 
      if not os.path.isfile(dest_file) or os.path.getmtime(src_file) > os.path.getmtime(dest_file): 
       print "minifying %s..." % (dest_file) 
       command = "java -jar %s %s -o %s" % (compresser, src_file, dest_file) 
       RunCommand(command, True) 
0

Hay una solución aún más claro para ambos (JS y CSS) para que pueda "minify sobre la marcha". Debería poder portarlo fácilmente a cualquier idioma (actualmente está en PHP). Es realmente un fragmento y una parte integral del Framework PHP Fat-Free. Sigue este enlace y echa un vistazo a mi código. Es solo una función. No busques campanas y silbatos como combinar archivos, codificación de base-X, acortamiento de variables o incluso codificación gzip (aunque eso se puede agregar fácilmente).

Fat-Free Minify

Cuestiones relacionadas