Konwencje w React: Jak to wszystko nazwać?

Wstęp
Konwencje nazewnictwa to zbiór zasad dotyczących wyboru nazw dla zmiennych, funkcji, plików czy folderów. Są one kluczowe dla utrzymania czytelności projektu i ułatwiają komunikację między programistami, którzy dzięki nim posługują się wspólnym językiem i terminologią.
W tym artykule podzielę się z Tobą wiedzą na temat stosowania konwencji nazewnictwa w kodzie i projektach React.
Najpopularniejsze konwencje
Przyjrzyjmy się najpopularniejszym konwencjom nazewnictwa stosowanym przez programistów, ze szczególnym uwzględnieniem tych używanych w projektach React.
1 2 3 4
camelCase
camelCase to konwencja, w której pierwsze słowo w nazwie zaczyna się małą literą, a każde kolejne wielką. Na przykład: handleClick, useState, currentAccountBalance.
Zastosowanie:
- Zmienne
- Funkcje
- Hooki
- Pliki i foldery niekomponentowe w React
Przykład w kodzie JS:
const myName = 'Steve';
const sayHello = (userName) => {
console.log(`Hello ${userName}!`);
}
sayHello(myName);Przykład w strukturze plików:
hooks
├── useAppDispatch.ts
└── useAppSelector.tsPascalCase
PascalCase, znany również jako "CapitalCamelCase", to konwencja podobna do camelCase, ale każde słowo zaczyna się wielką literą. Na przykład: LoginScreen, Button, App.
Zastosowanie:
- Komponenty React
- Pliki i foldery komponentów React
- Klasy
- Typy
Przykład w strukturze plików:
Button
├── index.jsx
└── Button.module.scssPrzykład komponentu Button w kodzie:
// index.jsx
export default function Button({ children }) {
return <button>{children}</button>;
}UPPER_CASE
UPPER_CASE, znany również jako "CONSTANT_CASE" lub "SCREAM_CASE", to konwencja, w której wszystkie litery w nazwie są wielkie. Na przykład: FIRST_NAME, API_URL, APP_VERSION.
Zastosowanie:
- Stałe
- Wartości enum
Przykłady w kodzie TS:
const PI = 3.14;
const API_URL = "https://example.com/api";
enum RoutePath {
DASHBOARD = '/',
BLOG = '/blog',
PRIVACY_POLICY = '/privacy-policy',
TERMS_OF_SERVICE = '/terms-of-service'
}kebab-case
kebab-case, znany również jako "dash-case", to konwencja, w której słowa w nazwie są oddzielone myślnikami. Na przykład: button-primary, main-heading, gallery-item.
Zastosowanie:
- Klasy CSS
- Atrybuty HTML
- Pliki i foldery
- Adresy URL
Przykład w kodzie HTML:
<ul class="site-nav">
<li class="site-nav-item"><a href="#">Sklep</a></li>
<li class="site-nav-item"><a href="#">Blog</a></li>
<li class="site-nav-item"><a href="#">Kontakt</a></li>
</ul>snake_case
snake_case to konwencja, w której słowa w nazwie są oddzielone podkreślnikami. Na przykład: last_name, annual_earnings, total_products_found.
Zastosowanie:
- Zmienne i funkcje w niektórych językach (Python, Ruby, SQL)
- Rzadko spotykany w aplikacjach React
Przykład w kodzie SQL:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100)
);Konwencje specyficzne dla React
Oprócz ogólnych zasad nazewnictwa, istnieją wytyczne specjalne dla projektów React.
Nazwy komponentów
Komponenty React powinny być pisane w PascalCase. Używaj rozszerzenia .jsx lub .tsx dla plików z komponentami React. Ułatwia to rozróżnić pliki z komponentami React od innych plików oraz pozwala odblokować dodatkowe możliwości w edytorze kodu. 5 6 7
Przykład w strukturze plików:
src
└── components
├── layout
│ ├── Header
│ │ ├── index.tsx
│ │ └── Header.module.scss
│ └── Footer
│ ├── index.tsx
│ └── Footer.module.scss
└── TodoList
├── index.tsx
├── TodoList.module.scss
└── components
├── TodoItem
│ ├── index.tsx
│ └── TodoItem.module.scss
└── AddTodoForm
├── index.tsx
└── AddTodoForm.module.scssHooki
Nazwy hooków powinny zaczynać się od słowa use i być pisane w camelCase. Na przykład: useEffect, useState, useFetch. 8
Przykład w kodzie JSX:
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]);Funkcje "handlery"
Funkcje obsługi zdarzeń powinny zaczynać się od słowa "handle", na przykład handleClick, handleChange, handleLoad. Ułatwia to czytelność, zrozumienie kodu oraz pomaga przy refaktoryzacji kodu, ponieważ można łatwo znaleźć wszystkie funkcje handlerów poprzez wyszukanie słowa "handle". 9
Przykład w kodzie JSX:
const handleInputChange = (event) => {
const { name, value } = event.target;
setFormValues((prev) => ({ ...prev, [name]: value }));
};
const handleToggleModalVisibility = () => {
setIsModalOpen((prev) => !prev);
}Style
W React można używać różnych metod do definiowania stylów. Oto zalecane konwencje dla różnych podejść:
Przykłady
- Inline — camelCase
<button style={{ backgroundColor: 'blue', color: 'white' }}>Tekst</button>- Zwyczajny CSS — kebab-case
.button-primary {
background-color: blue;
color: white;
}<button className="button-primary">Tekst</button>- CSS Modules — camelCase
.buttonPrimary {
background-color: blue;
color: white;
}import styles from './style.css';
<button className={styles.buttonPrimary}>Tekst</button>- CSS-in-JS — camelCase
// biblioteka styled-components
import styled from 'styled-components';
const Button = styled.button`
background-color: blue;
color: white;
`;
<Button>Tekst</Button>Wymuszanie stosowania konwencji z ESLint i TypeScript
Możesz użyć reguły ESLint @typescript-eslint/naming-convention do wymuszenia odpowiednich konwencji nazewnictwa w projekcie TypeScript. Oto przykładowa konfiguracja:
// .eslintrc
{
"rules": {
"@typescript-eslint/naming-convention": [
"error",
{
"selector": "default",
"format": ["camelCase"]
},
{
"selector": "variable",
"format": ["camelCase", "PascalCase", "UPPER_CASE"]
},
{
"selector": "function",
"format": ["camelCase", "PascalCase"]
},
{
"selector": "typeLike",
"format": ["PascalCase"]
},
{
"selector": "enumMember",
"format": ["UPPER_CASE"]
}
]
}
}Pełną dokumentację znajdziesz na stronie naming-convention | typescript-eslint.
Podsumowanie
Konwencje nazewnictwa są kluczowym elementem pracy zespołowej, ułatwiającym komunikację i współpracę. Warto znać różne opcje i wybrać te, które najlepiej odpowiadają potrzebom zespołu. Dla dużych zespołów dobrym rozwiązaniem może być stworzenie reguł ESLint wymuszających stosowanie przyjętych zasad w projekcie.
Pamiętaj, że najważniejsza jest spójność w całym projekcie. Wybrane konwencje powinny być zrozumiałe i oczywiste dla wszystkich członków zespołu, co przyczyni się do tworzenia bardziej czytelnego i łatwiejszego w utrzymaniu kodu 😉
- Naming Conventions in React JS | Upbeat Code↩
- React coding Standards and Practices | by Navita Singhal | Medium↩
- Programming naming conventions (explained by a snake) | Pluralsight↩
- React naming conventions - Stack Overflow↩
- What is PascalCase in React? – ProfoundTips↩
- reactjs - Warning:
is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements - Stack Overflow↩ - Kluczowe Aspekty JSX - Podstawy składni, Integracja z JavaScript oraz Zaawansowane Techniki↩
- Building Your Own Hooks – React↩
- Handling Events – React↩
