# Render Blocking CSS

## Introducción

El browser utiliza el **DOM** (Document Object Model) y el **CSSOM** (CSS Object Model) para mostrar una página. El DOM es el modelo del HTML que el browser necesita para renderizar la estructura de una página web, mientras que el **CSSOM** es el mapeo del CSS que el browser necesita para darle estilos a una página.

![](https://1842544784-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LkARxWs8LKt1tySXtEO%2F-LnYK5xi6fMynXc2fVuW%2F-LnYQ94o80OmB36fY0Uw%2Frender-tree-construction.png?alt=media\&token=eb3c22b2-ee4d-4bf2-9fa4-d59a5de0e6db)

## El CSS bloquea el render

El CSS bloquea el render por lo tanto, necesitamos que este lo mejor posible, ya que queremos tener una experiencia buena para el usuario.

![](https://1842544784-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LkARxWs8LKt1tySXtEO%2F-LnYK5xi6fMynXc2fVuW%2F-LnYVxlkgFqxSngeMrGO%2Fcssom-styles-fout.png?alt=media\&token=96739eb0-bb4d-404a-8866-67dfd3863ef6)

### ¿Cómo verifico si lo estoy bloqueando?

Lo más fácil es utilizar una herramienta por ejemplo [Lighthouse](https://developers.google.com/web/tools/lighthouse/?hl=es), [WebpageTest](https://www.webpagetest.org/), etc

Ejemplo con <https://developers.google.com/speed/pagespeed/insights/>

![](https://1842544784-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LkARxWs8LKt1tySXtEO%2F-LnYK5xi6fMynXc2fVuW%2F-LnYQhGH-MxSGwULoNrW%2F1.png?alt=media\&token=dd6f1bd6-f53c-4afa-9692-ba28f57f7dca)

## ¿Cómo podemos solucionarlo?

### 1- No utilizar @import en los CSS

Esto afecta la performance ya que agrega un tiempo extra en ir a buscar el CSS

***MAL***

```css
@import url("style.css")
```

***BIEN***

```markup
<link rel="stylesheet" href="style.css">
```

### 2 - Utilizar los media type

Podemos utilizar la property media de los link para especificar que CSS mostrar

```markup
<link href="style.css"    rel="stylesheet">
<link href="style.css"    rel="stylesheet" media="all">
<link href="portrait.css" rel="stylesheet" media="orientation:portrait">
<link href="print.css"    rel="stylesheet" media="print">
```

### 3 - Combinar CSS

Cada CSS en la página da un tiempo adicional, combinar los CSS en un **main.css**

![](https://1842544784-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LkARxWs8LKt1tySXtEO%2F-LnYK5xi6fMynXc2fVuW%2F-LnYVKRwAXZxWeCbWB-Y%2Fcombine-css-before-after.png?alt=media\&token=24ae221c-017b-4fec-ab2b-f6c55db11f32)

### 4 - Critical CSS

Es una técnica para mostrar sólo el CSS del contenido que el usuario ve a primera vista.

Es el más efectivo de todos, ya que permite tener un CSS ligero que no bloquea el render mejorando así la performance y la experiencia al usuario ya que tenemos un primer pintado mucho más rápido.

![](https://1842544784-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LkARxWs8LKt1tySXtEO%2F-LnYK5xi6fMynXc2fVuW%2F-LnYWWuX5ICHAOlVH6P2%2Fabove-the-fold.png?alt=media\&token=33309d64-d2b8-4bd1-b634-345e5b01c124)

#### Término Above the Fold

La expresión **“above the fold”'** define la parte del sitio web que los usuarios ven primero sin necesidad de desplazarse con el scroll. Si se desplazan hacia abajo, esta parte del sitio web se denomina **“below the fold”**. El término **“fold”** proviene de la imprenta y corresponde al pliegue de la página de, por ejemplo, un periódico.

#### ¿Cómo implementarlo?

Existen varias formas de implementar criticalCSS

1\) Sitios online <https://www.sitelocity.com/critical-path-css-generator>

2\) Módulos de NPM

* <https://www.npmjs.com/package/fg-loadcss>
* <https://www.npmjs.com/package/critical>

#### ¿Si ya poseo un criticalCSS y tengo otros CSS?

1\) Cargar los estilos críticos y luego mostrar el resto en el evento *"**load**"*

```javascript
<script>
window.addEventListener('load', () => {
  const element = document.createElement('link');
  element.setAttribute('rel', 'stylesheet');
  element.setAttribute('type', 'text/css');
  element.setAttribute('href', 'path/full.css');
  document.querySelector('head').appendChild(element);
});
</script>
```

2\) Utilizar el [preload](https://developers.google.com/web/fundamentals/performance/resource-prioritization?hl=es-419) del link

```markup
<link rel="preload" href="path/full.css" as="style" onload="this.rel='stylesheet'">
```

**Podríamos combinar ambos utilizar el preload en caso que soporte el browser sino el otro...**

**Siempre tener en cuenta el tag \<noscript> en caso que no haya javascript activo...**

```markup
<noscript>
    <link rel="stylesheet" type="text/css" href="path/full.css">
</noscript>
```

![](https://1842544784-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LkARxWs8LKt1tySXtEO%2F-LnZ3gf8KIQ1nS8XN1wY%2F-LnZ3mPZ4GwxKN5ZcPvG%2FD8QV1wGUYAAXyPi.png?alt=media\&token=6123d5e7-69a6-4aa9-8c29-b7e735d4dc41)
