10 de octubre de 2022

Simple React como botón con Stylify CSS. De Utilidades, a Componentes, selectores mangled y 50% más pequeño build de producción.

Estiliza botones en React rápidamente con Stylify CSS. Es como escribir CSS directamente en la plantilla.



Comprueba cómo dar estilo a un botón rápidamente usando sólo utilidades y luego limpiar la plantilla usando components. Aprenda por qué la salida en producción puede ser del 50% y más pequeña🔥.

Introducción

Stylify es una librería que utiliza selectores similares a CSS para generar CSS optimizado basado en lo que escribes.

  • ✅ Selectores similares a CSS
  • ✅ Sin framework que estudiar
  • ✅ Menos tiempo dedicado a la documentación
  • ✅ CSS manoseado y extremadamente pequeño
  • ✅ No es necesario purgar CSS
  • ✅ Componentes, variables, selectores personalizados
  • ✅ Puede generar múltiples paquetes de CSS

También tenemos una página sobre ¡qué problemas resuelve Stylify CSS y por qué deberías probarlo!

El código

Aquí está el código detrás del botón:

import { useState } from 'react';
import './stylify.css';

function LikeButton() {
	const [count, setCount] = useState(0);

	return (
		<button
		className="
			color:#222
			font-weight:bold
			border:0
			background:#fff
			font-size:16px
			padding:8px_16px
			border-radius:4px
			cursor:pointer
			box-shadow:0_.3em_.6em_rgba(0,0,0,0.3)
			transition:background_0.3s,scale_0.3
			align-items:center
			display:inline-flex

			[&:hover_span:first-of-type]{transform:scale(1.5)}
			[span]{display:inline-flex}
		"
		onClick={() => setCount(count + 1)}
		>
		<span className="
			margin-right:8px
			font-size:24px
			transition:transform_0.3s
		">❤️</span>
		<span className="margin-right:6px">Igual que</span>
		<span
			className="
			background:#eee
			padding:4px
			align-items:center
			justify-content:center
			border-radius:50%
			min-width:24px
			min-height:24px
		">{count}</span>
		</button>
	);
}

export default LikeButton;

El CSS generado para el ejemplo anterior:

.color\:\#222{color: #222}
.font-weight\:bold{font-weight: bold}
.border\:0{border: 0}
.background\:\#fff{background: #fff}
.font-size\:16px{font-size: 16px}
.padding\:8px_16px{padding: 8px 16px}
.border-radius\:4px{border-radius: 4px}
.cursor\:pointer{cursor: pointer}
.box-shadow\:0_\.3em_\.6em_rgba\(0\,0\,0\,0\.3\){box-shadow: 0 .3em .6em rgba(0,0,0,0.3)}
.transition\:background_0\.3s\,scale_0\.3{transition: background 0.3s,scale 0.3}
.align-items\:center{align-items: center}
.\[span\]\{display\:inline\-flex\} span,
.display\:inline-flex{display: inline-flex}
.margin-right\:8px{margin-right: 8px}
.font-size\:24px{font-size: 24px}
.transition\:transform_0\.3s{transition: transform 0.3s}
.margin-right\:6px{margin-right: 6px}
.background\:\#eee{background: #eee}
.padding\:4px{padding: 4px}
.justify-content\:center{justify-content: center}
.border-radius\:50\%{border-radius: 50%}
.min-width\:24px{min-width: 24px}
.min-height\:24px{min-height: 24px}
.\[\&\:hover\_span\:first\-of\-type\]\{transform\:scale\(1\.5\)\}:hover span:first-of-type,
.transform\:scale\(1\.5\){transform: scale(1.5)}

Production build - 50% más pequeño

Cuando permites que Stylify manipule los selectores, el resultado es el siguiente:

.c{color:#222}
.d{font-weight:bold}
.e{border:0}
.f{background:#fff}
.g{font-size:16px}
.h{padding:8px 16px}
.i{border-radius:4px}
.j{cursor:pointer}
.k{box-shadow:0 .3em .6em rgba(0,0,0,0.3)}
.l{transition:background 0.3s,scale 0.3}
.m{align-items:center}
.b span,.n{display:inline-flex}
.o{margin-right:8px}
.p{font-size:24px}
.q{transition:transform 0.3s}
.r{margin-right:6px}
.s{background:#eee}
.t{padding:4px}
.u{justify-content:center}
.v{border-radius:50%}
.w{min-width:24px}
.x{min-height:24px}
.a:hover span:first-of-type,.y{transform:scale(1.5)}

Además, los selectores en JSX están minificados

<button
	className="c d e f g h i j k l m n a b"
	onClick={() => setCount(count + 1)}
>
	<span className="o p q">❤️</span>
	<span className="r">Like</span>
	<span className="s t m u v w x">{count}</span>
</button>

Tamaño del CSS:

  • Dev: 1101 bytes
  • Producción: 556 bytes

El ahorro de tamaño ronda el 50% (El tamaño es similar en modo comprimido). Si tomamos el HTML manipulado, la diferencia será aún mayor.

Limpieza de plantillas

¿Qué pasa si tenemos muchas utilidades y queremos moverlas fuera de la plantilla? Con Stylify puedes hacerlo usando componentes reutilizables. Se pueden definir dentro de un comentario (espera objeto js sin corchetes alrededor) en el archivo donde se utilizan o en una configuración global.

// ...

/*
stylify-components
'like-button': `
	color:#222
	font-weight:bold
	border:0
	background:#fff
	font-size:16px
	padding:8px_16px
	border-radius:4px
	cursor:pointer
	box-shadow:0_.3em_.6em_rgba(0,0,0,0.3)
	transition:background_0.3s,scale_0.3
	align-items:center
	display:inline-flex
	span { display:inline-flex }
	&:hover span:first-of-type { transform:scale(1.5) }
`,
'like-button__hearth': 'margin-right:8px font-size:24px transition:transform_0.3s',
'like-button__counter': `
	background:#eee
	padding:4px
	align-items:center
	justify-content:center
	border-radius:50%
	min-width:24px
	min-height:24px
`
/stylify-components
*/

function LikeButton() {
	// ...

	return (
	<button className="like-button" onClick={() => setCount(count + 1)}>
		<span className="like-button__hearth">❤️</span>
		<span className="margin-right:6px">Like</span>
		<span className="like-button__counter">{count}</span>
	</button>
	);
}

// ...

En producción, los componentes también están maltratados.

Explicación de la sintaxis

En el ejemplo anterior, puedes ver Stylify usando selectores similares a CSS. Con algunas diferencias.

  • _ dentro de un selector se utiliza en lugar de un espacio
  • [span]{display:inline-flex} es un selector personalizado en línea. Esto permite aplicar estilo a los selectores personalizados.
  • & dentro de [&:hover_span:first-of-type] siempre se refiere a un nivel superior como en SCSS
  • La sintaxis indentada en los componentes es también como en SCSS. Excepto que, para mantener las cosas simples, sólo soporta anidamiento y encadenamiento
span {
	display:inline-flex
}
&:hover span:first-of-type {
	transform:scale(1.5)
}

Echa un vistazo a Stackblitz Playground

Puedes probar el patio de recreo en Stackblitz.

¡Dar como Feedback!
¿Te gusta Stylify CSS? Háznoslo saber con una estrella en nuestro repo!