components/
βββ Button.jsx
βββ UserProfile.jsx
βββ DataTable.jsx
βββ ProcurementStatusDetail/
βββ index.js
βββ InfoSection.jsx
βββ TindakLanjutSection.jsx
βββ DocumentHistory.jsx
Why? Matches the component name exactly, makes it obvious it's a component.
pages/
βββ Home.jsx
βββ Login.jsx
βββ Dashboard.jsx
βββ procurement/
βββ ProcurementList.jsx
βββ ProcurementDetail.jsx
Why? Pages are just components, so follow the same convention.
hooks/
βββ useAuth.js
βββ useProcurementDetail.js
βββ useDebounce.js
βββ useLocalStorage.js
Why? Hooks are functions, and JS functions use camelCase.
utils/
βββ formatDate.js
βββ validation.js
βββ apiHelpers.js
βββ stringHelpers.js
Why? These export functions, which use camelCase.
constants/
βββ apiEndpoints.js
βββ routes.js
βββ appConfig.js
βββ errorMessages.js
// Inside the file:
export const API_BASE_URL = 'https://api.example.com';
export const MAX_RETRY_ATTEMPTS = 3;
Why? File is camelCase, exported constants are SCREAMING_SNAKE_CASE.
context/
βββ AuthContext.jsx
βββ ThemeContext.jsx
βββ UserContext.jsx
types/
βββ user.ts // exports User, UserProfile types
βββ procurement.ts // exports Procurement, ProcurementItem
βββ api.ts
styles/
βββ Button.module.css // CSS Modules β PascalCase
βββ UserProfile.module.scss
βββ global.css // Global styles β camelCase
βββ variables.scss
api/
βββ authApi.js
βββ procurementApi.js
βββ userService.js
services/
βββ analyticsService.js
βββ notificationService.js
config/
βββ webpack.config.js
βββ jest.config.js
βββ apiConfig.js
βββ app-config.js
| Type | Convention | Example |
|---|---|---|
| Components | PascalCase | UserProfile.jsx |
| Pages | PascalCase | Dashboard.jsx |
| Hooks | camelCase | useAuth.js |
| Utils | camelCase | formatDate.js |
| Constants | camelCase | apiEndpoints.js |
| Context | PascalCase | AuthContext.jsx |
| Services/API | camelCase | userService.js |
| Styles | Match component | Button.module.css |
| Types | camelCase | user.ts |
β user-profile.jsx (kebab-case components)
β User_Profile.jsx (snake_case components)
β UseAuth.js (PascalCase hooks)
β format-date.js (kebab-case utils)
β API_ENDPOINTS.js (SCREAMING_SNAKE_CASE files)
components/
βββ Button/
βββ index.js β
Always lowercase
βββ Button.jsx
βββ Button.test.js
β
Button.test.jsx
β
Button.spec.jsx
β
useAuth.test.js
β
Button.stories.jsx
β
UserProfile.stories.jsx
Most popular React projects follow these conventions:
- Create React App β PascalCase components
- Next.js β PascalCase pages/components
- Airbnb Style Guide β PascalCase components
- React Official Docs β PascalCase components
- Be consistent - Pick one convention per category and stick to it
- Match exports -
UserProfile.jsxshould exportUserProfile - Folder names - Usually kebab-case or camelCase:
user-profile/oruserProfile/ - One component per file - Makes naming straightforward
- Use ESLint - Enforce conventions automatically
The key is consistency across your team/project! π―