¿Es importante malo para el rendimiento?

192

Los odio, desafía la naturaleza en cascada de CSS, y si no los usa con cuidado, terminará en un ciclo de agregar más !important.

Pero quiero saber si son malos para el rendimiento.

EDITAR
De las respuestas (rápidas) puedo concluir que no tendrá un impacto (significativo) en el rendimiento. Pero es bueno saberlo, incluso si es solo un argumento adicional para desanimar a otros;).

EDIT 2
BoltClock señaló que si hay 2 !importantdeclaraciones, las especificaciones dicen que elegirá la más específica.

janw
fuente
77
Por curiosidad, ¿cómo evalúa el rendimiento de la hoja de estilo CSS? mejor renderizado CSS más rápido o algo así?
xiaoyi
44
@Yoshi todavía tiene que buscar otras !importantreglas.
John Dvorak
1
@janw: Acabo de aclarar que elige el más específico ... He eliminado el comentario engañoso.
BoltClock
15
pensamiento aleatorio: el título sería mucho más divertido si dijera: "¿es importante importante?"
Nik Bougalis
59
siempre leo! importante como 'no importante'
oɔɯǝɹ

Respuestas:

269

Realmente no debería tener ningún efecto sobre el rendimiento. Al ver el analizador CSS de firefox/source/layout/style/nsCSSDataBlock.cpp#572 y creo que esa es la rutina relevante, manejar la sobrescritura de las reglas CSS.

solo parece ser una simple verificación de "importante".

  if (aIsImportant) {
    if (!HasImportantBit(aPropID))
      changed = PR_TRUE;
    SetImportantBit(aPropID);
  } else {
    // ...

También, comentarios en source/layout/style/nsCSSDataBlock.h#219

    /**
     * Transfer the state for |aPropID| (which may be a shorthand)
     * from |aFromBlock| to this block.  The property being transferred
     * is !important if |aIsImportant| is true, and should replace an
     * existing !important property regardless of its own importance
     * if |aOverrideImportant| is true.
     * 
     * ...
     */

  1. Firefox usa un analizador de arriba hacia abajo escrito manualmente. En ambos casos, cada archivo CSS se analiza en un objeto StyleSheet, cada objeto contiene reglas CSS.

  2. Firefox luego crea árboles de contexto de estilo que contienen los valores finales (después de aplicar todas las reglas en el orden correcto)

CSS Parser Firefox

De: http://taligarsiel.com/Projects/howbrowserswork1.htm#CSS_parsing

Ahora, puede ver fácilmente, como en el caso del Modelo de Objetos descrito anteriormente, el analizador puede marcar las reglas afectadas !importantfácilmente, sin mucho costo posterior. La degradación del rendimiento no es un buen argumento en contra !important.

Sin embargo, la capacidad de mantenimiento se ve afectada (como se mencionó en otras respuestas), que podría ser su único argumento en contra de ellos.

Anirudh Ramanathan
fuente
87
Me gusta que seas el único que se molestó en verificar en lugar de asumir. Buen trabajo señor!
Moox
Este modelo de objeto no es el DOM, por cierto ... es el CSSOM. Por si alguien se pregunta.
BoltClock
55
Esta debería ser la respuesta. Me da vergüenza que mi respuesta tenga el doble de puntos que la tuya. Oh querido oh querido ¡Que alguien le dé crédito a este hombre donde le corresponde!
Michael Giovanni Pumo
3
Esta publicación tiene que ver con el análisis y espero que el impacto en el rendimiento sea nulo. Los analizadores son rápidos. La pregunta es, ¿qué pasa durante el renderizado, cuando el navegador busca declaraciones CSS que coincidan con un elemento en particular? ¿Es el caso común donde no hay !importantreglas especialmente optimizadas? No lo creo, pero es difícil estar seguro; El directorio de diseño / estilo en Firefox tiene 80,000 líneas de código.
Jason Orendorff
1
Sus esfuerzos para verificar la fuente exacta y compartir este alto nivel de conocimiento son simplemente extraordinarios y sorprendentes. Las personas como usted son las que hacen que StackOverflow sea tan popular y confiable. Muchas gracias por responder y compartir esto.
Anmol Saraf
113

No creo que eso !importantsea ​​inherentemente malo en términos de la rapidez con la que el navegador coincide con las reglas (no forma parte del selector, solo parte de la declaración)

Sin embargo, como ya se ha indicado, reducirá la capacidad de mantenimiento de su código y, por lo tanto, es probable que aumente innecesariamente su tamaño debido a cambios futuros. El uso de !importantprobablemente también reduciría el rendimiento del desarrollador.

Si fueras muy quisquilloso, también podrías decir que !importantagrega 11 bytes adicionales a tu archivo CSS, esto no es mucho, pero supongo que si tienes algunos pocos !importanten tu hoja de estilo, podría sumar.

Solo mis pensamientos, desafortunadamente no pude encontrar ningún punto de referencia sobre cómo !importantpodría afectar el rendimiento.

Sean
fuente
56
"11 bytes adicionales" dan o toman unos pocos bytes para espacios en blanco opcionales oh dios el espacio en blanco
BoltClock
11
Lo sé ... Me estoy burlando de lo extremadamente exigente que es la gente cuando se trata de rendimiento, llevando esa selectividad al siguiente nivel.
BoltClock
11
Si eres muy exigente, la especificidad adicional necesaria para hacerlo de la manera correcta a menudo supera con creces los 11 bytes.
BlakeGru
10
@DisgruntledGoat: una persona sensata se daría cuenta de que no se están desperdiciando bytes, sino segundos, minutos, horas, días y neuronas. (¿Por qué sigo aquí?)
BoltClock
59

!importanttiene su lugar Confía en mí en eso. Me ha salvado muchas veces y, a menudo, es más útil como solución a corto plazo, antes de encontrar un método más largo y elegante para su problema.

Sin embargo, como la mayoría de las cosas, se ha abusado de él, pero no hay necesidad de preocuparse por el "rendimiento". Apuesto a que un pequeño GIF 1x1 tiene más éxito en el rendimiento en una página web de lo que sería importante.

Si desea optimizar sus páginas, hay muchas más rutas importantes que tomar;);)

Michael Giovanni Pumo
fuente
8
Fue un final un poco divertido, sonríamos todos y ... ¡relájate!
Michael Giovanni Pumo
12
Que burro Tengo que saber!
Oscar Broman
1
@Oscar Broman Creo que quiere decir que :) :) parece una parte particular de la anatomía humana que comparte un nombre común con el otro nombre de un burro en inglés. "El burro o el asno", ese es el comienzo del artículo de Wikipedia sobre el asno, el perdón, el burro. Supongo que el Sr. Jan Dvorak y dos votantes están entre el tipo de personas que se ofenden literalmente con cada palabra (o sonrisa) que es ofensiva remotamente (o en este caso imaginaria). Sin embargo, decir burro cuando te refieres al culo es bastante estúpido y descortés, ya que pocos que no hablan inglés lo entenderían.
Dimitar Slavchev
77
@DimitarSlavchev Jan no estaba hablando de la carita sonriente. Vea la versión inicial de la publicación de Michael (revisión 2).
andytuba
55
@andytuba tbh, invalida el argumento de Dimitars, pero no su punto :) :)
Mueca de desesperación
31

Lo que sucede aquí detrás de escena es que a medida que se procesa su CSS, el navegador lo lee, encuentra un !importantatributo y el navegador vuelve a aplicar los estilos definidos por !important. Este proceso adicional puede parecer un pequeño paso adicional, pero si está atendiendo muchas solicitudes, tendrá un éxito en el rendimiento. (Fuente)

Usar! Important en tu CSS generalmente significa desarrollador narcisista y egoísta o perezoso. Respeta a los desarrolladores por venir ...

El pensamiento de un desarrollador cuando usa !important:

  1. Mi CSS oscilante no funciona ... grrrr.
  2. ¿¿Qué debería hacer ahora??
  3. Y luego !importantsí ... ahora está funcionando bien.

Sin embargo, no es un buen enfoque para usar !importantsolo porque no manejamos bien el CSS. Crea muchos problemas de diseño, que son peores que los problemas de rendimiento, pero también nos obliga a usar muchas líneas adicionales de código, ya que estamos anulando otras propiedades !importanty nuestro CSS se satura con código inútil. Lo que deberíamos hacer es administrar primero el CSS muy bien y no dejar que las propiedades se anulen entre sí.

Nosotros podemos utilizar !important. Pero úselo con moderación y solo cuando no haya otra salida.

ingrese la descripción de la imagen aquí

NullPoiиteя
fuente
¿Qué método es mejor? La especificidad en css para garantizar que el elemento se aplique a sus estilos adecuados (lo que podría significar una gran declaración css; por ejemplo, #news .article .article-title h3 a {}) o simplemente agregando la etiqueta importante?
Dennis Martinez
1
@DennisMartinez sería mejor que haga una clase para el enlace del título y solo agregue esto ..
NullPoiиteя
No, solo vago. Consigue palo. Golpear.
Erik Reppen
1
No creo que casperOne haya eliminado las imágenes solo porque tardaban en cargar ...
BoltClock
13

Estoy de acuerdo con usted en no usarlo porque es una mala práctica, independientemente del rendimiento. Solo por esos motivos, evitaría usar !importantsiempre que sea posible.

Pero sobre la cuestión del rendimiento: No, no debería ser notable. Puede tener algún efecto, pero debería ser tan pequeño que nunca debería notarlo, ni debería preocuparse por ello.

Si es lo suficientemente significativo como para ser notable, entonces es probable que tenga problemas más grandes en su código que simplemente !important. El uso simple de un elemento de sintaxis normal de los idiomas principales que está utilizando nunca será un problema de rendimiento.

Déjame responder a tu pregunta con una pregunta retórica a cambio; un ángulo que probablemente no consideró: ¿a qué navegador se refiere?

Cada navegador obviamente tiene su propio motor de renderizado, con sus propias optimizaciones. Entonces la pregunta ahora es: ¿cuáles son las implicaciones de rendimiento en cada navegador? ¿Quizás se !importantdesempeña mal en un navegador pero realmente bien en otro? Y tal vez en las próximas versiones, ¿será al revés?

Creo que mi punto aquí es que nosotros, como desarrolladores web, no deberíamos pensar (o tener que pensar) en las implicaciones de rendimiento de las construcciones de sintaxis individuales de los lenguajes que estamos usando. Deberíamos usar esas construcciones de sintaxis porque son la forma correcta de lograr lo que queremos no debido a cómo funcionan.

Las preguntas de rendimiento deben formularse junto con el uso de perfiladores para analizar dónde están los puntos críticos en su sistema. Primero arregla las cosas que realmente te están frenando. Es casi seguro que habrá problemas mucho más grandes para que corrija antes de bajar al nivel de construcciones CSS individuales.

SDC
fuente
Buen razonamiento Sé que no vale la pena optimizarlo, pero tengo curiosidad.
enero
7

No afecta notablemente el rendimiento. Sin embargo, reduce la capacidad de mantenimiento de su código y, por lo tanto, es probable que disminuya el rendimiento a largo plazo.

Henrik
fuente
2
@ Jan Dvorak ¿Cuál es tu problema?
Enve
@BoltClock Me refiero a la primera oración.
John Dvorak
44
@Enve mi problema es que me gustaría ver un punto de referencia, no supuestos a priori presentados como hechos. No sé cuál es este.
John Dvorak
Yo diría que el hecho de que haga que su código sea más difícil de mantener debería ser un argumento suficiente para no usarlo. Nunca he experimentado una degradación del rendimiento, incluso en comparación con otras mejoras menores de rendimiento, como el uso de ID en lugar de selectores de CLASE.
Henrik
7

Habiendo tenido que usarlo !importantvarias veces antes, personalmente no he notado ningún impacto demostrable en el rendimiento al usarlo.

Como nota, vea la respuesta a esta pregunta de la pila por una razón que tal vez quiera usar !important.

También mencionaré algo que todos los demás no han mencionado. !importantes la única forma de anular css en línea antes de escribir una función de JavaScript (que afectará su rendimiento aunque sea solo un poco). Por lo tanto, podría ahorrarle algo de tiempo de rendimiento si necesita anular css en línea.

Ryan
fuente
6

hmm ... importante o importante?

Veamos este paso a paso:

  1. El analizador debe verificar si es importante para cada propiedad, independientemente de si la usa o no, por lo que la diferencia de rendimiento aquí es 0
  2. Al sobrescribir una propiedad, el analizador tiene que verificar si la propiedad que se sobrescribe es importante o no, por lo que la diferencia de rendimiento aquí es 0 nuevamente
  3. Si la propiedad que se sobrescribe es !! importante, tiene que sobrescribir la propiedad: ¡un rendimiento de -1 para no usar! Important
  4. Si la propiedad que se sobrescribe es importante, omite sobrescribir la propiedad, ¡un aumento de rendimiento de +1 por usar! Importante
  5. Si la nueva propiedad es! Importante, el análisis tiene que sobrescribirla, independientemente de que la propiedad que se sobrescribe sea! Importante o !! importante - diferencia de rendimiento 0 nuevamente

Así que supongo que importante realmente tiene un mejor rendimiento, ya que puede ayudar al analizador a omitir muchas propiedades que de otro modo no omitirá.

y como @ryan menciona a continuación, la única forma de anular css en línea y evitar el uso de JavaScript ... así que otra forma de evitar un golpe de rendimiento innecesario

hmm ... resulta que importante es importante

y también,

  • usando! importante ahorra mucho tiempo para un desarrollador
  • a veces te salva de rediseñar todo el CSS
  • a veces html o el archivo CSS principal no está bajo tu control, por lo que te salva la vida allí
  • ¡obviamente evita que otros elementos importantes sobrescriban accidentalmente elementos importantes!
  • y, a veces, los navegadores simplemente no eligen las propiedades correctas, sin ser demasiado específicos en los selectores, por lo que usar! important realmente se vuelve importante y le ahorra escribir toneladas de selectores CSS específicos en su CSS. así que supongo que incluso si usa más bytes para escribir! importante, podría ahorrarle bytes en otros lugares. y todos sabemos, los selectores de CSS pueden ser desordenados.

Así que supongo que usar! Important puede hacer felices a los desarrolladores, y creo que eso es muy importante : D

xtrahelp.com
fuente
1
"¡Así que supongo! Importante realmente tiene un mejor rendimiento ya que puede ayudar al analizador a omitir muchas propiedades que de otro modo no omitirá". Esta declaración se anula inmediatamente una vez que tenga varias !importantdeclaraciones. El navegador tendrá que verificarlos todos. Entonces, de vuelta al paso 1, de verdad.
BoltClock
1
@BoltClock, el analizador debe verificar la propiedad independientemente de cuántas veces la use ... así que si tiene 10 propiedades, el analizador debe hacer esa comprobación 10 veces, independientemente de si esas propiedades son importantes o no. así que si tiene 10 propiedades importantes, el analizador hace el cheque 10 veces, y si tiene 10 propiedades no importantes, el analizador aún hace el cheque 10 veces ... ¿tiene sentido?
xtrahelp.com
Todavía no estoy seguro de si! Importante es un aumento del rendimiento o no, de verdad ... pero estoy disfrutando mucho de todos los comentarios y discusiones. Mi conocimiento está dando sus próximos pasos hacia adelante. StackOverflow es simplemente increíble: D
Anmol Saraf
4

No puedo prever !importantobstaculizar el rendimiento, no inherentemente de todos modos. Sin embargo, si su CSS está plagado !important, eso indica que ha superado los selectores de calificación y que es demasiado específico y se ha quedado sin padres o calificadores para agregar especificidad. En consecuencia, su CSS se habrá hinchado (lo que impedirá el rendimiento) y será difícil de mantener.

Meme importante de la regla CSS

Si desea escribir CSS eficiente, entonces debe ser tan específico como sea necesario y escribir CSS modular . Es recomendable abstenerse de usar ID (con hashes), encadenando selectores o selectores calificados.

Los ID con prefijo #CSS son viciosamente específicos, hasta el punto de que 255 clases no anularán un id (violín por: @Faust ). Sin embargo, los ID también tienen un problema de enrutamiento más profundo, tienen que ser únicos, esto significa que no puede reutilizarlos para estilos duplicados, por lo que termina escribiendo CSS lineal con estilos repetitivos. La repercusión de hacer esto variará de proyecto a proyecto, dependiendo de la escala, pero la capacidad de mantenimiento sufrirá inmensamente y, en casos extremos, también el rendimiento.

¿Cómo puede agregar especificidad sin !importantencadenar, calificar o ID (es decir #)

HTML

<div class="eg1-foo">
    <p class="eg1-bar">foobar</p>
</div>
<div id="eg2-foo">
    <p id="eg2-bar">foobar</p>
</div>
<div class="eg3-foo">
    <p class="eg3-foo">foobar</p>
</div>

CSS

.eg1-foo {
    color: blue;
}
.eg1-bar {
    color: red;
}
[id='eg2-foo'] {
    color: blue;
}
[id='eg2-bar'] {
    color: red;
}
.eg3-foo {
    color: blue;
}
.eg3-foo.eg3-foo {
    color: red;
}

JSFiddle

Bien, entonces, ¿cómo funciona eso?

El primer y el segundo ejemplo funcionan igual, el primero es literalmente una clase y el segundo es el selector de atributos. Las clases y los selectores de atributos tienen una especificidad idéntica. .eg1/2-barno hereda su color .eg1/2-fooporque tiene su propia regla.

El tercer ejemplo parece calificar o encadenar selectores, pero no lo es. El encadenamiento es cuando prefijas selectores con padres, antepasados, etc. Esto agrega especificidad. La calificación es similar, pero usted define el elemento al que se aplica el selector. calificación: ul.classy encadenamiento:ul .class

No estoy seguro de cómo llamarías a esta técnica, pero el comportamiento es intencional y está documentado por W3C

Se permiten repeticiones del mismo selector simple y aumentan la especificidad.

¿Qué sucede cuando la especificidad entre dos reglas es idéntica?

Como señaló @BoltClock , si hay varias declaraciones importantes, la especificación dicta que la más específica debe tener prioridad.

En el siguiente ejemplo, tanto .fooy .bartienen idéntica especificidad, por lo que el comportamiento fallsback a la naturaleza en cascada de CSS, por lo que la última regla declarado en las solicitudes de CSS de precedencia es decir .foo.

HTML

<div>
    <p class="foo bar">foobar</p>
</div>

CSS

.bar {
    color: blue !important;
}
.foo {
    color: red !important;
}

JSFiddle

Jack Tuck
fuente