Problem with "pages"
Well, its simple. Not all features are pages. Then you end up developing features in your re-usable components folder.
Solution
A folder-based structure which aims to keep a feature and its dependencies together. I'll be referring to this structure as The Base in the rest of this post.
FolderName
├── index.tsx // Entry point
├── FolderName.module.css // Styles
├── components // Components that are specific to this feature
│ ├── ComponentName
│ │ ├── index.tsx
│ │ └── ComponentName.module.css
│ └── AnotherComponentName
│ ├── index.tsx
│ └── AnotherComponentName.module.css
├── hooks // Hooks that are specific to this feature
│ ├── useHookName.ts
│ └── useAnotherHookName.ts
├── utils // Utils that are specific to this feature
│ ├── utilName.ts
│ └── anotherUtilName.ts
└── assets // Assets that are specific to this feature
└── someImage.png
The beauty of this structure is that if you don't need something, just don't create the folder for it.
Here's an example of a react app
src
├── components // Generic re-usable components
│ ├── ui
│ │ ├── Button
│ │ │ ├── index.tsx
│ │ │ └── Button.module.css
│ │ └── TextField
│ │ ├── index.tsx
│ │ └── TextField.module.css
│ └── Navigation
│ ├── Link
│ │ ├── index.tsx
│ │ └── Link.module.css
│ ├── BottomNavigation
│ │ ├── index.tsx
│ │ └── BottomNavigation.module.css
│ ├── TopNavigation
│ │ └── index.tsx
│ └── hooks
│ └── useExcludeShadow.ts
├── features
│ └── Notifications
│ ├── index.tsx
│ ├── Notifications.module.css
│ ├── components
│ │ ├── NotificationRowCard
│ │ │ └── index.tsx
│ │ ├── NotificationsList
│ │ │ ├── index.tsx
│ │ │ └── NotificationsList.module.css
│ │ └── NotificationsPopup
│ │ └── index.tsx
│ └── hooks
│ ├── useNotificationAction.ts
│ ├── useNotifications.ts
│ └── index.tsx
├── api
│ ├── axios.ts
│ └── resources
│ ├── auth
│ │ ├── index.ts
│ │ └── types.ts
│ ├── notifications
│ │ ├── index.ts
│ │ └── types.ts
│ ├── payment
│ │ ├── index.ts
│ │ └── types.ts
│ └── settings
│ ├── index.ts
│ └── types.ts
├── assets
│ ├── lotties
│ │ └── confetti.json
│ ├── icons
│ ├── placeholders
│ │ └── user-avatar-placeholder.svg
│ ├── fonts
│ │ ├── Inter.ttf
│ │ └── Switzer.ttf
│ ├── logos
│ │ ├── logo-primary.svg
│ │ ├── logo-stacked.svg
│ │ └── logo-alternate.svg
│ └── icons
│ ├── apple-icon.svg
│ ├── facebook-icon.svg
│ ├── google-icon.svg
│ ├── linkedin-icon.svg
│ ├── refresh-icon.svg
│ ├── telegram-icon.svg
│ └── whatsapp-icon.svg
├── global
│ ├── AppContext
│ │ ├── context.ts
│ │ └── index.tsx
│ ├── FeatureToggles
│ │ ├── useFeatureToggle.ts
│ │ └── index.tsx
│ └── UserPreferences
│ ├── useUserPreferences.ts
│ └── index.tsx
├── utils
│ ├── routes.ts
│ ├── formatDate.ts
│ └── hooks
│ ├── useArray.ts
│ └── useDeviceOrientation.ts
└── tracking
├── googleAnalytics.ts
├── firebaseTracking.ts
└── useTracking.ts
This structure has been working and scaling well for us for over 3 years.
Let me know if you guys want a detailed explanation about the api setup. Maybe I'll convert this post into a series of chapters.