- TypeScript
- Sass
- TSX
- Library: Material UI
- Explorer: Storybook
- RxJS.ajax
- Interceptors
- Redux Observable
- Editorconfig
- Code formatter: Prettier
- Linter: ESLint
- Git hooks: Husky
- Gitflow
- Docker
- Github pages
- Travis CI / Circle CI / Github actions
my-app/
|- .storybook/
|- .vscode/
|- node_modules/
|- public/
| |- index.html
| |- favicon.ico
|- src/
| |- stories/
| |- App.module.scss
| |- App.test.tsx
| |- App.tsx
| |- index.scss
| |- index.tsx
| |- react-app-env.d.ts
| |- setupTests.ts
|- .editorconfig
|- .gitignore
|- package.json
|- package-lock.json
|- README.md
|- tsconfig.json
my-app/
|- .storybook/
|- .vscode/
|- build/
|- node_modules/
|- public/
| |- index.html
| |- favicon.ico
|- src/
| |- core/
| | |- components/
| | | |- button/
| | | | |- button.module.scss
| | | | |- button.stories.scss
| | | | |- button.tsx
| | | |- text-input/
| |- layout/
| | |- components/
| | | |- header/
| | | | |- header.module.scss
| | | | |- header.stories.scss
| | | | |- header.tsx
| | | |- sidebar/
| | |- layout.tsx
| |- router/
| | |- views/
| | | |- landing/
| | | | |- landing.module.scss
| | | | |- landing.stories.scss
| | | | |- landing.tsx
| | | |- page-not-found/
| | |- router.tsx
| |- routes/
| | |- <route>/
| | | |- components/
| | | |- hooks/
| | | |- views/
| | | |- <route>.api.ts
| | | |- <route>.model.ts
| | | |- <route>.router.tsx
| |- styles/
| | |- reset.scss
| | |- theme.scss
| |- app.tsx
| |- index.scss
| |- index.tsx
| |- react-app-env.d.ts
| |- setupTests.ts
|- .editorconfig
|- .gitignore
|- package.json
|- package-lock.json
|- README.md
|- tsconfig.json
useReducer
+ useContext
Fetch data with custom hooks:
Event handlers naming:
npx create-react-app my-app
--use-npm
: CRA uses yarn by default--typescript
Conditional rendering:
Id generation (client vs server):