Pregunta

La aplicación Rails predeterminada instalada por rails new posee config.assets.compile = false en producción.

Y la forma ordinaria de hacer las cosas es correr rake assets:precompile Antes de implementar su aplicación, para asegurarse de que se compilan todos los activos de la tubería de activos.

Entonces, ¿qué pasa si me pongo? config.assets.compile = true ¿en producción?

No necesitaré correr precompile más. Lo que yo creer sucederá la primera vez que se solicite un activo, se compilará. Este será un éxito de rendimiento esa primera vez (y significa que generalmente necesita un tiempo de ejecución JS en producción para hacerlo). Pero aparte de estos inconvenientes, después de que el activo se compiló perezosamente, yo pensar Todo el acceso posterior a ese activo tendrá no rendimiento de rendimiento, el rendimiento de la aplicación será exactamente lo mismo Al igual que con los activos precompilados después de esta compilación perezosa inicial de primer golpe. ¿Es esto cierto?

¿Hay algo que me falta? Cualquier otra razón para no establecer config.assets.compile = true ¿en producción? Si tengo un tiempo de ejecución de JS en producción, y estoy dispuesto a tomar la compensación de rendimiento degradado para el primero acceso de un activo, a cambio de no tener que ejecutar precompile, ¿Esto tiene sentido?

¿Fue útil?

Solución

Escribí ese bit de la guía.

Definitivamente no quieres compilar en vivo en la producción.

Cuando te hayas compilado, esto es lo que sucede:

Cada solicitud de un archivo en /activos se pasa a Spockets. Sobre el primero Solicite todos y cada uno de los activos que se compila y almacena en caché en cualquier rieles que esté utilizando para caché (generalmente el sistema de archivos).

En las solicitudes posteriores, Sprokets recibe la solicitud y tiene que buscar el nombre de archivo de huellas digitales, verifique que el archivo (imagen) o archivos (CSS y JS) que componen el activo no se modificaron, y luego si hay una versión en caché lo sirve.

Eso es todo En la carpeta de activos y En cualquier carpetas de proveedores/activos utilizadas por complementos.

Eso es mucho gastos generales ya que, para ser honesto, el código no está optimizado para la velocidad.

Esto tendrá un impacto en qué tan rápido los activos pasan sobre el cable al cliente e impactará negativamente en los tiempos de carga de la página de su sitio.

Comparar con el valor predeterminado:

Cuando los activos son precompilados y la compilación está apagada, los activos se compilan y se huelen con las huellas digitales al public/assets. Spockets devuelve una tabla de mapeo de la llanura a los nombres de archivo de huellas digitales a Rails, y Rails escribe esto en el sistema de archivos. El archivo manifiesto (YML en Rails 3 o JSON con un nombre aleatorizado en Rails 4) se carga en la memoria por rieles al inicio y en caché para su uso mediante los métodos de activo.

Esto hace que la generación de páginas con los activos de huellas dactilares correctos sea muy rápido, y la porción de los archivos en sí es rápido de Web-Server desde el sistema de archivos. Ambos dramáticamente más rápido que la compilación en vivo.

Para obtener la máxima ventaja de la tubería y las huellas dactilares, debe establecer encabezados de futuro lejano en su servidor web y habilitar la compresión GZIP para archivos JS y CSS. SproCkets escribe versiones de activos GZipped que puede configurar su servidor para usar, eliminando la necesidad de que lo haga para cada solicitud.

Esto lleva los activos al cliente lo más rápido posible, y en el tamaño más pequeño posible, acelerando la visualización del lado del cliente de las páginas, y reduciendo (con encabezado de futuro lejano).

Entonces, si estás en vivo, lo compilas es:

  1. Muy lento
  2. Carece de compresión
  3. Afectará el tiempo de renderizado de las páginas

Versus

  1. Tan rápido como sea posible
  2. Comprimido
  3. Elimine la compresión escuchada desde el servidor (opcionalmente).
  4. Minimizar el tiempo de renderizado de las páginas.

Editar: (Respuesta al comentario de seguimiento)

La tubería pudo Se cambie para precompilar en la primera solicitud, pero hay algunos obstáculos importantes para hacerlo. La primera es que tiene que haber una tabla de búsqueda para nombres huellas digitales o los métodos de ayuda son demasiado lentos. Bajo un Senario compile a pedido, debería haber alguna forma de agregar a la tabla de búsqueda a medida que se compila o solicita cada nuevo activo.

Además, alguien tendría que pagar el precio de la entrega de activos lentos por un período de tiempo desconocido hasta que todos los activos estén compilados y en su lugar.

El valor predeterminado, donde el precio de compilar todo se paga fuera de línea al mismo tiempo, no afecta a los visitantes públicos y garantiza que todo funcione antes de que las cosas sean en vivo.

El factor decisivo es que agrega mucha complejidad a los sistemas de producción.

Editar, junio de 2015 Si está leyendo esto porque está buscando una solución para tiempos de compilación lentos durante un despliegue, entonces podría considerar precompilar los activos localmente. La información sobre esto está en el Guía de tubería de activos. Esto le permite precompilar localmente solo cuando hay un cambio, cometer eso y luego tener una implementación rápida sin etapa de precompilación.

Otros consejos

Tener menos sobrecarga con algo previo.

Precompile everything initially with these settings in production.rb
# Precompile *all* assets, except those that start with underscore
config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/

Luego puede simplemente usar imágenes y hojas de estilo como "/sassets/stylesheet.css" en *.html.erb o "/sassets/web.png"

Para cualquiera que use Heroku:

Si se despliega en Herkou, le hará el precompilar automáticamente durante el despliegue si no se incluyen los activos compilados (es decir, public/assets no comprometido) así que no hay necesidad de config.assets.compile = true, o para cometer los activos precompilados.

Los documentos de Heroku son aquí. A CDN se recomienda eliminar la carga en el recurso DYNO.

No será lo mismo que precompila, incluso después de ese primer éxito: porque los archivos no se escriben en el sistema de archivos no pueden ser atendidos directamente por el servidor web. Algún código Ruby siempre estará involucrado, incluso si solo lee una entrada de caché.

Establecer config.asset.compile = false

Agregue a su archivo gem

group :assets do gem 'turbo-sprockets-rails3' end

Instale el paquete

Correr rake assets:precompile

Luego inicie su servidor

Del oficial guía:

En la primera solicitud, los activos se compilan y almacenan en caché como se describe en el desarrollo anterior, y los nombres manifiestos utilizados en los ayudantes se alteran para incluir el hash MD5.

Las ruedas dentadas también establecen el encabezado HTTP de control de caché en la edad máxima = 31536000. Esto indica todos los cachés entre su servidor y el navegador del cliente que este contenido (el archivo servido) puede almacenarse en caché por 1 año. El efecto de esto es reducir la cantidad de solicitudes para este activo de su servidor; El activo tiene una buena oportunidad de estar en el caché del navegador local o en algún caché intermedio.

Este modo usa más memoria, funciona más pobre que el valor predeterminado y no se recomienda.

Además, el paso de precompilación no es un problema en absoluto si usa Capistro para sus implementaciones. Se encarga de usted. Solo corres

cap deploy

o (dependiendo de su configuración)

cap production deploy

Y estás listo. Si aún no lo usa, le recomiendo que lo revise.

Porque está abriendo una vulnerabilidad transversal de directorio - https://blog.heroku.com/rails-set-pipeline-vulnerabilidad

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top