
Metodologia BEM w React
Metodologia BEM (Block-Element-Modifier) to sposób na organizację i nazewnictwo klas CSS, który pozwala na łatwe utrzymanie i rozwijanie aplikacji. BEM bazuje na podejściu wydzielania poszczególnych części interfejsu użytkownika (UI) do reużywalnych bloków, co pozwala na zwiększenie przejrzystości i elastyczności kodu.
CEO
06 cze 2022
W projektach Reactowych jednym z najważniejszych wyzwań jest stworzenie reużywalnych w obrębie całego projektu komponentów. Odpowiednio napisane komponenty potrafią znacząco przyśpieszyć pracę programisty. Jednym z elementów komponentu jest oczywiście jego wygląd, który może zmieniać się w zależności od kontekstu jego użycia. Stylowanie komponentów przy użyciu tradycyjnego CSS potrafi przysporzyć wielu problemów, gdy style napisane są w chaotyczny i nieprzemyślany sposób, co może znacząco utrudniać pracę z kodem. Tutaj z pomocą przychodzi sprawdzona metodologia BEM, która w pewien sposób definiuje to, w jaki sposób programista powinien nazywać klasy w CSS.
Powiązane case studies


Wynajem magazynu w minuty zamiast dni - automatyzacja umów i płatności
Klient: Balticon S.A.
Branża: Logistyka / LogTech

Platforma edukacyjna generująca materiały do nauki programowania z ChatGPT
Klient: Klient (Aplikacja webowa do nauki programowania)
Branża: Edukacja / EdTech
Czym dokładnie jest BEM?
BEM jest metodologią nazywania klas w CSS, bazuje ona na podejściu wydzielania poszczególnych części UI do reużywalnych bloków. Skrót BEM pochodzi od słów Block (blok), Element (element) oraz Modifier (modyfikator).
Block (blok) – jest to w pełni niezależny komponent UI, nazwa bloku definiuje czym jest dany element np.: form, menu lub navigation. Wybierając nazwę bloku powinniśmy kierować się tym, czym dany blok jest, a nie tym jak on wygląda (nazwanie bloku np.: blue-form będzie więc błędem).
Element (element) – jest to część bloku. Schemat nazywania elementu wygląda następująco:
block__element (np.: menu__item)
Nazwa elementu zawiera więc również nazwę bloku, którego element jest częścią. Nazywając dany element oddzielamy jego nazwę od nazwy bloku, w którym element się znajduję za pomocą dwóch znaków podkreślenia. Element może zostać użyty tylko jako część bloku.
Modifier (modyfikator) – definiuje on różnego typu stany bloku lub elementu np.: disabled, small itd. Nazywając dany modyfikator oddzielamy jego nazwę od nazwy bloku lub elementu za pomocą dwóch myślników lub jednego znaku podkreślenia (dokumentacja BEM sugeruje używanie jednego znaku podkreślenia, jednak częściej spotykałem się z zapisem alternatywnym z dwoma myślnikami). Modyfikator nie może zostać użyty poza kontekstem bloku lub elementu, służy on do zmiany domyślnego wyglądu danego bloku lub elementu. Przykładowy modyfikator wygląda następująco:
block__element--modifier (np.: menu__item--active) lub block__element_modifier (np.: menu__item_active). Istnieją dwa rodzaje modyfikatorów:
1. Boolean (np.: disabled, active) – modyfikator posiadający tylko nazwę (oznacza to, że modyfikator został zastosowany),
2. Key-value (np.: size-small) – modyfikator posiadający swoją nazwę oraz wartość (oznacza to, że modyfikator size został zastosowany z wartością small).
Przykładowe reguły CSS stosujące metodologię BEM:
.menu { ...declarations }
.menu--expanded { ...declarations }
.menu__item { ...declarations }
.menu__item--active { ...declarations }
.menu__title { ...declarations }
.menu__title--size-big { ...declarations }
Należy zaznaczyć również, że element jest częścią bloku, a nie innego elementu, nie powinno się zatem nazywać klas elementów w taki sposób:
.menu__item__title
Znając kilka prostych reguł jesteśmy w stanie praktycznie od razu stwierdzić jak wygląda hierarchia w danym bloku, a same nazwy klas są bardzo klarowne.
BEM wraz z preprocesorem CSS
Prawdziwą siłę metodologii BEM widać, gdy zastosujemy ją wraz z wybranym preprocesorem CSS np.: Sass. Preprocesor Sass pozwala między innymi na zagnieżdżanie selektorów CSS wewnątrz siebie, rozwiązanie takie pozwala na wyraźne pogrupowanie danych bloków, co dodatkowo zwiększa czytelność kodu. Powyższy przykład z przykładowymi reguły CSS mógłby zostać napisany w następujący sposób:
.menu {
...declarations
&--expanded {
...declarations
}
&__item {
...declarations
&--active {
...declarations
}
}
&__title {
...declarations
&--size-big {
...declarations
}
}
} Podsumowanie
Wykorzystanie metodologii BEM w projekcie napisanym w React pozwala na lepsze skalowanie projektu oraz zwiększa czytelność pisanego kodu. Podejście polegające na wydzielaniu poszczególnych części UI w niezależne bloki świetnie sprawdza się w połączeniu z React, który również zakłada wydzielanie poszczególnych części UI do mniejszych, reużywalnych komponentów. Wykorzystywanie znanych przez wielu programistów metodologii pozwala również na łatwiejsze zrozumienie napisanego kodu przez osoby, które dołączają do istniejącego już projektu. Dzięki temu proces onboardingu jest znacznie szybszy.
Sam BEM zakłada również różnego typu alternatywne konwencje nazewnictwa (więcej tutaj: https://en.bem.info/methodology/naming-convention/#alternative-naming-schemes).
FAQ
Najczęstsze pytania
- To sposób nazywania klas CSS oparty na wydzielaniu części interfejsu do reużywalnych bloków. Skrót pochodzi od słów Block (niezależny komponent UI), Element (część bloku) i Modifier (modyfikator stanu) — co zwiększa przejrzystość i elastyczność kodu.
- Blok nazywamy według tego, czym jest (form, menu), nie jak wygląda. Element zapisujemy jako block__element (np. menu__item), oddzielając dwoma podkreśleniami. Modyfikator — block__element--modifier (np. menu__item--active) — definiuje stany jak disabled czy active.
- Boolean — posiadający tylko nazwę (np. disabled, active), oznaczający, że modyfikator został zastosowany, oraz key-value — z nazwą i wartością (np. size-small), oznaczający zastosowanie modyfikatora z określoną wartością.
- Prawdziwą siłę BEM widać z preprocesorem jak Sass — zagnieżdżanie selektorów z użyciem znaku & pozwala wyraźnie pogrupować bloki (np. .menu { &__item { &--active } }), co dodatkowo zwiększa czytelność kodu.
- BEM świetnie współgra z Reactem, który również zakłada wydzielanie UI do mniejszych, reużywalnych komponentów — poprawia skalowanie projektu i czytelność kodu, a znana metodologia przyspiesza onboarding osób dołączających do projektu.
Blog
Powiązane artykuły
LitElement: Definicja i sekrety popularności tego narzędzia w budowie komponentów webowych
LitElement to nowoczesny framework JavaScript, który znacznie upraszcza budowę komponentów webowych. Stając się nieodłącznym elementem wielu projektów, zadziwia swoją efektywnością i prostotą. Zaczynając od definicji, zabierzemy Was w podróż po największych sekretach jego popularności. Tworzenie komponentów nigdy nie było łatwiejsze. Czy to rzeczywiście „świetlne” narzędzie dla deweloperów?
Client-side Hydration: jak działa i dlaczego jest kluczowa dla nowoczesnych aplikacji webowych
Nowoczesne aplikacje webowe muszą być jednocześnie szybkie, interaktywne i przyjazne dla użytkownika już od pierwszego załadowania strony. Właśnie w tym kontekście coraz większe znaczenie zyskuje client-side hydration, czyli mechanizm łączący renderowanie po stronie serwera z logiką uruchamianą w przeglądarce. Dzięki niemu możliwe jest wyświetlenie treści niemal natychmiast, a następnie płynne przejście do pełnej interaktywności aplikacji.
Turbopack w praktyce: jak działa nowy bundler od Vercela
Rosnąca złożoność aplikacji webowych sprawia, że wydajność narzędzi developerskich ma dziś ogromne znaczenie. Turbopack, nowy bundler od Vercela, powstał jako odpowiedź na ograniczenia klasycznych rozwiązań, takich jak Webpack, szczególnie w dużych projektach Next.js. Jego głównym celem jest maksymalne skrócenie czasu startu aplikacji i natychmiastowy hot reload podczas pracy z kodem.
Radix UI – biblioteka headless komponentów dla React
Radix UI to coraz popularniejsza biblioteka headless komponentów, która zdobywa uznanie wśród developerów React poszukujących elastycznych i solidnych rozwiązań. W świecie, gdzie dostępność i jakość UX mają kluczowe znaczenie, gotowe prymitywy Radix UI pozwalają budować interfejsy zgodne z najlepszymi praktykami. Biblioteka nie narzuca warstwy wizualnej, dzięki czemu świetnie sprawdza się w projektach opartych na własnym design systemie.
React Storefront: Jak zbudować ultraszybki sklep internetowy?
Budowa ultraszybkiego sklepu internetowego to dziś nie tylko kwestia wygody użytkownika, ale kluczowy element przewagi konkurencyjnej w e-commerce. Każda dodatkowa sekunda ładowania potrafi obniżyć konwersję, dlatego nowoczesne technologie muszą stawiać wydajność na pierwszym miejscu. React Storefront powstał właśnie po to, by łączyć elastyczność Reacta z ekstremalną szybkością działania i sprawdzonymi wzorcami dla sklepów online.
Parsley.js – lekka biblioteka do walidacji formularzy
Formularze są jednym z kluczowych elementów każdej strony internetowej i aplikacji webowej, a ich poprawne działanie ma bezpośredni wpływ na doświadczenie użytkownika. Walidacja danych pozwala uniknąć błędów, niekompletnych zgłoszeń oraz niepotrzebnej komunikacji z serwerem. Parsley.js to lekka i prosta w użyciu biblioteka JavaScript, która umożliwia skuteczną walidację formularzy po stronie klienta.





