Shaun Lutin
Google PageSpeed a menudo sugiere que optimizar la entrega de CSS. Se me ocurrió que reduciría los viajes de ida y vuelta de la red para alinear todo el CSS de esta manera:
<style type="text/css">
@{
var bootstrap = File.ReadAllText(Server.MapPath("bootstrap.min.css"));
var bootstrapTheme = File.ReadAllText(Server.MapPath("theme.min.css"));
var fontAwesome = File.ReadAllText(Server.MapPath("font-awesome.min.css"));
var bigfont = File.ReadAllText(Server.MapPath("bigfont.min.css"));
var bigfontPrint = File.ReadAllText(Server.MapPath("bigfont-print.min.css"));
}
@Html.Raw(bootstrap)
@Html.Raw(bootstrapTheme)
@Html.Raw(fontAwesome)
@Html.Raw(bigfont)
@Html.Raw(bigfontPrint)
</style>
Esta parece ser una solución razonable al problema de la carga lenta de páginas y ha aumentado mi puntuación de PageSpeed de 88 a 95.
Dejando a un lado el estilo del código por el momento, ¿qué razones técnicas, si las hay, existen para NO alinear todo el CSS de esta manera?
Incluir todo su CSS significa que no se puede almacenar en caché, por lo que cada carga de una sola página contendrá todo el CSS requerido, y cuando usa bibliotecas grandes, eso realmente puede ser una gran cantidad de ancho de banda desperdiciado. Por ejemplo, Bootstrap ronda los 120k. Tenga en cuenta que el enlace de Google que compartió especifica lo siguiente (énfasis mío):
Si los recursos CSS externos son pequeñospuede insertarlos directamente en el documento HTML, lo que se denomina inserción.
Por lo tanto, la carga de una sola página puede ser más rápida, pero en general es probable que sea más lenta.
Personalmente me mantendría alejado de hacer eso. Sin embargo, una cosa que puede hacer es agrupar todo su CSS en una sola solicitud (está utilizando MVC, por lo que es relativamente simple), por lo que solo tiene que hacer un único viaje adicional al servidor para su CSS y todas las páginas futuras solicitadas por el navegador no necesitará volver a solicitarlos.
-
Con esa lógica, nunca almacenará en caché el CSS para empezar.
– Martheen
28 de septiembre de 2015 a las 2:41
-
Al igual que con cualquier tipo de métrica, es importante comprender los inconvenientes. Para las pruebas de velocidad de la página web, tiendo a usar webpagetest.org ya que las pruebas que ejecuta tienden a ser más “del mundo real”.
– DavidG
28 de septiembre de 2015 a las 2:42
-
o use HTML/2… una vez que se implemente un buen soporte para su función de “empaquetado”
– 小太郎
28 de septiembre de 2015 a las 5:38
-
@ 小太郎, te refieres a HTTP 2
– ysdx
28 de septiembre de 2015 a las 8:04
-
También vale la pena recordar que, en general, las cosas tienden a hacerse más grandes a medida que los proyectos continúan con mucha más frecuencia de lo que se hacen más pequeños. Lamentablemente, es mucho más común que lo que alguna vez fueron 5 líneas de CSS se convierta en 50 que lo que eran 50 líneas se conviertan en 5. Como tal, puede valer la pena asumir que gran parte del código pequeño se volverá grande (y por lo tanto debería ser un recurso separado) o al menos vigilar cuando crezcan para considerar si deben ser movidos.
– Jon Hanna
28 de septiembre de 2015 a las 11:19
Nadie ha mencionado el caso de uso previsto para esta técnica, que definitivamente no es cargar el 100% de su css. Más bien, esta técnica está destinada a hacer que los usuarios pensar la página ha cargado más rápido.
Cuando hablamos de hacer que las páginas se carguen más rápido, el objetivo real generalmente es hacer que la página se cargue más rápido. Desde la perspectiva de la experiencia del usuario, esto es mucho más importante que hacer que la carga tarde menos tiempo. No importa si toda la página tarda 500 ms en cargarse, porque de todos modos un humano no puede analizarla tan rápido. Lo que importa es qué tan rápido parece haberse cargado la página.
Entonces, el uso apropiado de esta técnica es cargar, de inmediato, el css absolutamente esencial para que la página se muestre correctamente. Es decir, hay algunas reglas de css que hacen que las imágenes tengan el tamaño correcto, que hacen que las cosas floten correctamente, que evitan esa apariencia horrible del contenido de la página saltando alrededor de la página mientras el SDK de Facebook termina su trabajo. Ese código debe estar presente en el mismo instante en que se carga el marcado. Solución: en línea ese css crítico.
Pero definitivamente NO coloque en línea todo el css. Puede haber otros 100kb que se carguen más tarde, si ese css solo diseña el contenido que se carga de forma asíncrona de todos modos. Pero si hay una estructura de página que debe estar en la forma correcta después de 25 ms, ese css debe estar en línea.
salman a
No entendiste la sugerencia de PageSpeed. La recomendación es para archivos CSS pequeños:
Si los recursos CSS externos son pequeños, puede insertarlos directamente en el documento HTML, lo que se denomina en línea. […] Tenga en cuenta que si el archivo CSS es grande, insertar completamente el CSS puede hacer que PageSpeed Insights le advierta que la parte superior de su página es demasiado grande a través de Priorizar contenido visible.
De hecho, el artículo más adelante sugiere un enfoque equilibrado para archivos CSS grandes: CSS crítico en línea y carga diferida del archivo CSS restante.
Ahora, incluso si PageSpeed le da una puntuación decente después de incluir grandes archivos CSS*, podría ser una mala idea:
Redundancia
Los archivos CSS en línea significan que duplicas el <style>...</style>
etiqueta a través de las páginas. Esto significa que proporciona datos redundantes para vistas de página posteriores o repetidas. Los datos redundantes cuestan ancho de banda y aumentan el tiempo de descarga.
El archivo CSS separado junto con fuertes encabezados de almacenamiento en caché le permiten eliminar la redundancia. Los encabezados de almacenamiento en caché indican a los navegadores que almacenen en caché el archivo CSS en la vista de la primera página y que lo reutilicen en vistas de página posteriores o repetidas.
Contenido vs Datos
Los archivos CSS en línea reducen la proporción de contenido “real” en la página. Los archivos CSS en línea requieren que inserte el CSS sobre el contenido, mientras que la mayoría de nosotros nos esforzamos por colocar el contenido real cerca del HTML superior.
El CSS en línea también hará que el navegador descargue bytes adicionales antes de permitirle descargar otros recursos como JavaScript e imágenes.
Costo de compresión
Si su página HTML se genera dinámicamente, lo más probable es que se sirva sin comprimir. Algunos servidores (p. ej., IIS) y software (p. ej., WordPress) permiten la compresión de contenido dinámico pero requieren más CPU + memoria en comparación con la compresión de contenido estático (p. ej., archivos CSS). Esta es otra razón más por la que debe mantener CSS en un archivo separado.
Por las razones anteriores, mantendría mi CSS combinado, minimizado, comprimido y almacenado en caché, en un archivo separado, incluso para sitios web de una página.
* No debe confundirse con estilos en línea
IR A 0
Esto es demasiado largo para caber en un comentario. Allí donde trabajo, usamos Política de seguridad de contenido directivas de encabezado (específicamente style-src
) para prohibir explícitamente el uso de CSS en línea. La justificación para no usar CSS en línea en este caso es minimizar los riesgos de la inyección de CSS para las páginas creadas dinámicamente. OWASP tiene información detallada sobre este tema, incluyendo ejemplos de exploits: https://www.owasp.org/index.php/Testing_for_CSS_Injection_(OTG-CLIENTE-005). Si solo se sirve contenido estático al navegador, no debería haber ningún riesgo.
Bueno, mira, es por eso que hice el descargo de responsabilidad. Asumí que de alguna manera estabas hablando de agregar todo el css como cadenas al programa ac # ya que era una etiqueta y soy totalmente ignorante aquí. ¿Ups? Estoy seguro de que alguien que entienda de lo que estás hablando tendrá una mejor respuesta.
– D. Ben Knoble
28 de septiembre de 2015 a las 2:06
Interesante pregunta. Lo mismo podría hacerse con JS también, ¿no? @BenKnoble, dice que el CSS se pone en línea programáticamente, por lo que aún editaría los archivos de recursos de la misma manera.
– Orún
28 de septiembre de 2015 a las 2:07
@OrunBhuiyan Sí. Esto es lo que estoy pensando. Se ha hecho brillantemente para la carga de mi página. Estoy al 99/100 para dispositivos móviles y de escritorio.
– Shaun Lutin
28 de septiembre de 2015 a las 2:08
Así que PageSpeed ignoró el hecho de que metiste unos cientos de kilobytes de CSS en tu página. Extraño.
– Salmán A.
28 de septiembre de 2015 a las 6:45
Esto parece una mala idea. El CSS nunca se almacena en caché. Además, empujar kB adicionales de datos antes de su contenido seguramente hará que su página se cargue más lentamente. Podrías argumentar que
link
hace esto, sin embargo,link
podría ser, en algún momento por parte de algún proveedor, que los archivos vinculados se carguen de forma asíncrona. Nunca podría hacer eso con contenido CSS insertado en su página HTML. Hay una razón por la cual las etiquetas de secuencias de comandos se delegan hasta el final: la misma lógica se aplica a todo el contenido– Dan
28 de septiembre de 2015 a las 7:59