2011-07-26 16 views
9

He estado educando a mí mismo. Lectura this:¿Sass daña el rendimiento?

El motor evalúa cada regla de derecha a izquierda, comenzando desde el selector de más a la derecha (llamada la "llave") y moviéndose a través de cada selector hasta que se encuentra una coincidencia o descarta la regla. (El "selector" es el elemento documento al que se aplique la regla.)

Por ejemplo:

ul li a {...} 
#footer h3 {...} 
* html #atticPromo ul li a {...] 

Ahora, algunas salidas de código de ejemplo SASS para mí:

#content #blog { 
    /* ... */ 
} 
/* line 85, ../sass/screen.scss */ 
#content #flickr { 
    /* ... */ 
} 

#content #flickr div p { 
    /* ... */ 
} 

Esto parece un poco incómodo. ¿Estoy haciendo algo mal? ¿Este es un problema de comunicación entre Sass y yo? ¿Lo estamos perdiendo?

Editar: Parte del código SCSS:

#flickr { 
    @include columns(5,8); 
    background: url('../img/ipadbg.png') no-repeat; 

    #ipod-gloss { 
     z-index: 999; 
     position: relative; 
    } 

    div { 
     margin-top: -80px; 
     margin-right: 20px; 

     h2 { 
      color: $white; 
      font-size: 24px; 
     } 

     p { 
      margin-top: 40px; 
     } 
    } 
} 

Bono lado!: el artículo dice que los navegadores (o al menos Firefox) buscan los selectores de derecha a izquierda. No podía entender por qué esto es más eficiente por qué. ¿Alguna pista?

+0

No veo su código Sass/SCSS. – BoltClock

+1

SASS/SCSS permite especificar cosas fácilmente (especialmente anidamiento) que requerirían el CSS de "mano larga". Si bien la anidación no siempre es la "forma correcta" de aplicar el CSS dado (puede ser demasiado restrictivo y frágil para el documento), los selectores de CSS se pueden combinar * de manera muy eficiente * con los navegadores web. Dicho eso: no me preocuparía, a menos que exista un caso de prueba comprobable de que el CSS sea "demasiado lento". –

Respuesta

15

usted tiene que encontrar su compromiso entre la facilidad de mantenimiento (anidación hace que sea más fácil encontrar su camino alrededor de la hoja de estilo) y el rendimiento de la representación.

Una regla empírica dice que debe intentar restringirse a una anidación de tres niveles y debe evitar anidar identificadores si no es necesario.

Sin embargo, creo que anidar demasiado no es el mayor problema. Tan pronto como me di cuenta del poder de los mixins, los usé mucho.

Por ejemplo, este es mi uso frecuente mixin botón:

@mixin small-button($active-color: $active-color, $hover-color: $button-hover-color, $shadow: true) 
    display: inline-block 
    padding: 4px 10px 
    margin: 
    right: 10px 
    bottom: 10px 
    border: none 
    background-color: $button-color 
    color: $font-color-inv 
    +sans-serif-font(9px, 700) 
    text-align: center 
    text-transform: uppercase 
    cursor: pointer 
    @if $shadow 
    +light-shadow 
    &:hover 
    text-decoration: none 
    background-color: $hover-color 
    &:last-child 
    margin-right: 0 
    a 
    color: $font-color-inv 
    &, &:hover 
     text-decoration: none 
    &.disabled 
    +opacity(0.75) 
    &:hover 
     background-color: $button-color 
    &.active 
    background-color: $active-color 
    &.disabled:hover 
     background-color: $active-color 

Ves, todo un código de bits. La aplicación de tales mixins a muchos elementos en su página resultará en un gran archivo CSS que tarda más tiempo en ser interpretado.

En la antigua forma de CSS, le daría a cada elemento del botón, p. la clase .small-button. Pero este método contamina tu marcado con clases no semánticas.

Sass proporciona una solución: herencia de selector a través del @extend directive.

Si los valores por omisión de su parámetro de la mixin, también puede proporcionar una clase simple, que utiliza los mixins con su defecto:

// Use this mixin via @extend if you are fine with the parameter defaults 
.small-button 
    +small-button 

Y a continuación, sólo puede heredar de esta clase en diversos contextos :

#admin-interface 
    input[type=submit] 
    @extend .small-button 

La declaración CSS resultante agrega todos los usos de .small botón en una regla con selectores separados por comas:

.small-button, #admin-interface input[type=submit] { 
    display: inline-block; 
    ... 
} 

En conclusión, un uso ingenuo de Sass puede afectar su rendimiento de CSS. Si se usa sabiamente, sin embargo, es mantenible gracias a un código DRY bien estructurado, conduce a una separación adecuada de marcado y estilo (solo clases semánticas) y permite un código CSS inteligente y de rendimiento.

+0

Sé que han pasado 1.5 años desde esta respuesta, pero me preguntaba ... Usted menciona el rendimiento varias veces, ya que se aplica a CSS. ¿Existe un problema real con la forma en que SASS/SCSS traduce la anidación en CSS de bajo rendimiento o el tamaño del archivo es demasiado grande? – ZenMaster

+0

Bueno, [hay estudios] (http://www.stevesouders.com/blog/2009/03/10/performance-impact-of-css-selectors/) que dicen que no tendrá mucho impacto al optimizar rendimiento del selector Tal vez no importa para un navegador moderno como Chrome. Pero si piensas en navegadores IE más antiguos o teléfonos móviles con un navegador más lento y una mala conexión, tanto el rendimiento del selector como el tamaño del archivo CSS sí importan. – crispy

+0

Además, si tiene en cuenta la tabla de rendimiento de un usuario final, puede tener 500ms de tiempo de servidor de aplicaciones, 500ms de tiempo de red, 500ms de procesamiento de navegador DOM y 2000ms de tiempo de procesamiento de páginas del navegador. Mucha gente diría que el tiempo del servidor de aplicaciones de 500 ms no es lo suficientemente bueno (no solo por problemas de escalado), sino que hay 2,5 horas de tiempo en el navegador, ¡hay algo de potencial para reducirlo! – crispy

6

SASS es solo un lenguaje que se compila en CSS. Si le preocupa el rendimiento de SASS en términos de cómo se ejecuta en el navegador, entonces SASS no ingresa la ecuación: se compilará y se publicará en el navegador como CSS regular.


Por lo que puedo ver de su uso de SASS, hay un par de cosas que podría sugerir:

  1. Usted no tiene para anidar todo.

La capacidad de anidar reglas dentro de cada uno en SASS es una función de idioma, pero no tiene que hacerlo si no tiene sentido hacerlo.


En términos de su uso general CSS:

  1. Si el anidamiento se vuelve demasiado severa/unwieldly, considerar el uso de clases donde tiene sentido.
  2. Cuando es necesario usar la jerarquía de elementos DOM, considere usar el [combinador infantil]: .foo > .bar.

Los ID deben ser únicos, por lo tanto, siempre deben hacer referencia solo a un solo elemento. La mayoría de las veces, pueden ser reglas CSS en sí mismas, por ejemplo, #content #flickr se convertiría en #flickr, y los navegadores optimizarán la búsqueda de una única ID. La única vez que necesitaría algo como #id1 #id2 es si #id2 debe aparecer en diferentes contextos en páginas diferentes.

Si su selector contiene elementos como #id div p, ese div es superfluo o sirve para un propósito específico.

  • Si es superflua, cambiar la regla de #id p, que selecciona cualquier <p> que se produce como un descendiente de #id.
  • Si sirve para un propósito específico, considere clasificar el <div> con un nombre de clase que describa su propósito, quizás <div class="photos-list">. Entonces su CSS podría convertirse en .photos-list p, que es mucho más fácil de mantener y reutilizable.

+0

Derecha. Pero creo que la pregunta gira en torno al hecho de que SASS * does * tiende a generar mucho más verbose CSS de lo que uno podría escribir sin él, simplemente porque es más fácil de hacer. Con esa suposición hecha, entonces, ¿qué impacto en el rendimiento, si alguno, tienen los selectores "más profundos"? P.ej. ¿Cómo coinciden los buscadores en ellos de manera eficiente? ¿Cuáles son las consideraciones de rendimiento de CSS? –

+0

El artículo que he vinculado a responde eso. Los selectores largos se consideran lentos. Estoy más interesado en formas de compilar sass sin los selectores anidados largos. # id1 # id2 parece extraño, y no debe estar anidado (aunque el caso límite de usarlos para la inclusión de páginas diferentes hace que esto sea más difícil de identificar). Me pregunto: ¿este impacto en el rendimiento es serio? o: ¿hay alguna manera de hacerlo mejor con sass? el objetivo de la anidación es la legibilidad ... si dejo de anidar para mejorar los selectores ... esa es una característica menos buena en los lenguajes css de alto nivel. – CamelCamelCamel

+1

@Radagaisus: "¿este impacto en el rendimiento es grave?" No. – BoltClock