Styled-components to nie jedyna biblioteka CSS-in-JS. Istnieja inne, każda z unikalnymi zaletami. Poznajmy dwie najważniejsze: Emotion i vanilla-extract.
Emotion to biblioteka CSS-in-JS, która oferuje dwa sposoby uzywania:
@emotion/react)1/** @jsxImportSource @emotion/react */
2import { css } from '@emotion/react';
3
4function SpacePanel({ isActive }) {
5 return (
6 <div css={css`
7 background: #0d1137;
8 border: 2px solid ${isActive ? '#00e676' : '#3949ab'};
9 border-radius: 12px;
10 padding: 20px;
11 transition: border-color 0.3s ease;
12 `}>
13 <h2>Navigation Panel</h2>
14 </div>
15 );
16}@emotion/styled)1import styled from '@emotion/styled';
2
3const Card = styled.div`
4 background: #1a1a4e;
5 padding: 20px;
6 border-radius: 12px;
7`;
8
9// Lub obiektowa skladnia:
10const CardObj = styled.div({
11 background: '#1a1a4e',
12 padding: 20,
13 borderRadius: 12,
14});cssVanilla-extract to zupelnie inne podejscie: style sa generowane w czasie kompilacji, nie w runtime. Zero JavaScript w bundlu klienta!
1// styles.css.ts
2import { style, globalStyle } from '@vanilla-extract/css';
3
4export const panel = style({
5 background: '#0d1137',
6 border: '2px solid #3949ab',
7 borderRadius: 12,
8 padding: 20,
9 ':hover': {
10 borderColor: '#7c4dff',
11 },
12});
13
14export const title = style({
15 color: '#7c4dff',
16 fontSize: 24,
17});1// Component.tsx
2import { panel, title } from './styles.css.ts';
3
4function SpacePanel() {
5 return (
6 <div className={panel}>
7 <h2 className={title}>Panel</h2>
8 </div>
9 );
10}| Cecha | Styled-components | Emotion | Vanilla-extract | |-------|-------------------|---------|-----------------| | Runtime | Tak | Tak | Nie (zero-runtime) | | Bundle | Wiekszy | Sredni | Minimalny | | TypeScript | Dobre wsparcie | Dobre wsparcie | Natywny TS | | SSR | Wymaga konfiguracji | Wymaga konfiguracji | Bezproblemowy | | DX | Bardzo dobry | Bardzo dobry | Wymaga buildu |
Wybor biblioteki CSS-in-JS zalezy od kilku czynnikow:
Wybierz styled-components gdy:
Wybierz Emotion gdy:
css do szybkiego dodawania stylow inline-like, ale z pelna moca CSSWybierz vanilla-extract gdy:
Coraz wiecej projektow przechodzi na rozwiazania zero-runtime, takie jak vanilla-extract, Panda CSS czy Linaria. Powod? W duzych aplikacjach runtime CSS-in-JS (styled-components, Emotion) moze spowalniać renderowanie, poniewaz generuje style w JavaScript podczas dzialania aplikacji.
Zero-runtime generuje klasy CSS w czasie kompilacji -- to jak przygotowanie mapy nawigacyjnej przed startem zamiast obliczania trasy w locie. Efekt: szybsze ladowanie strony i lepsze wyniki Core Web Vitals.
1// Panda CSS -- kolejna popularna zero-runtime alternatywa
2import { css } from '../styled-system/css';
3
4function Panel() {
5 return (
6 <div className={css({
7 bg: 'slate.900',
8 p: '4',
9 rounded: 'xl',
10 border: '2px solid',
11 borderColor: 'indigo.700'
12 })}>
13 Panel content
14 </div>
15 );
16}Niezaleznie od wyboru biblioteki, kluczowe jest trzymanie sie jednego podejscia w ramach projektu i ustalenie konwencji z zespolem.