# Starter pour des applications ReactJS !
---
### Pourquoi ce starter ?
* Besoin d'une base commune aux nouveaux projets
* Application interne donc pas de SEO
* Néanmoins, pas une solution miracle
---
### Choix des librairies
* React 18
* TypeScript
* TailwindCSS
* Formik
* react-router
* Recoil
* JEST
---
### Bonnes pratiques
* One component = One folder
* SMART/DUMB components
* Too many props
* PropTypes
* Lib folder
* Export names
* JEST Test
---
### Organisation du projet
```
project
└───src
│ └───api
│ └───assets
│ └───atoms
│ └───components
│ │ └───%component%
│ └───pages
│ └───lib
│ └───routes
│ └───selectors
```
---
### Boostrap du projet
* Utilisation de [Create React App](https://github.com/facebook/create-react-app).
* Création du projet avec create-react-app en typescript
```
npx create-react-app react-starter --template typescript
```
---
### Docker
* Dockerfile : container nodejs et installation de GIT.
* devcontainer.json : liste d'extension VSCode, fowardPorts.
---
### ESLint et Prettier
* Formattage au commit : https://prettier.io/docs/en/install.html#git-hooks
* Plugin Prettier pour VS Code : https://prettier.io/docs/en/editors.html#visual-studio-code
---
### UI/UX Design
* Installation TailwindCSS
```
npm install -D tailwindcss
npx tailwindcss init
```
* Modification de la configuration des modules (tailwind.config.js)
```
module.exports = {
content: ["./src/**/*.{html,js}"],
theme: {
extend: {},
},
plugins: [],
}
```
---
* Ajout des directives (index.css)
```
@tailwind base;
@tailwind components;
@tailwind utilities;
...
```
---
### Persistence des données / Flux
RecoilJS
```
npm install recoil
```
* Pourquoi RecoilJS et pas Redux ?
une comparaison est disponible ici : https://gitlab.hardis-group.com/JBORDE/recoil-vs-redux
---
### Navigation dans les composants
* React Router 6
```
npm install react-router-dom@6
```
* Installation https://reactrouter.com/docs/en/v6/getting-started/installation#create-react-app
---
### Formulaire
* Formik
```
npm install formik
```
```typescript=
const Formik = () => {
const loginValues = useSelector((state: RootState) => state.login);
const dispatch = useDispatch();
const formik = useFormik({
initialValues: loginValues,
validationSchema: validationSchema,
onSubmit: (values) => {
dispatch(login(values));
},
});
return (
<form onSubmit={formik.handleSubmit}>
<TextField
fullWidth
name="email"
label="Email"
value={formik.values.email}
onChange={formik.handleChange}
error={formik.touched.email && Boolean(formik.errors.email)}
helperText={formik.touched.email && formik.errors.email}
/>
<TextField
fullWidth
name="password"
label="Password"
type="password"
value={formik.values.password}
onChange={formik.handleChange}
error={formik.touched.password && Boolean(formik.errors.password)}
helperText={formik.touched.password && formik.errors.password}
/>
<Typography>
{formik.values.date && isValid(formik.values.date) && format(formik.values.date, "PPPPpppp", { locale: fr })}
</Typography>
<Button color="primary" variant="contained" fullWidth type="submit">
Submit
</Button>
</form>
);
};
```
---
### Et les tests
Pour les tests expect https://jestjs.io/fr/docs/expect
---
```javascript
import React from 'react';
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders recoil button', () => {
render(<App />);
const linkElement = screen.getByText(/Mis à jour/i);
expect(linkElement).toBeInTheDocument();
});
```
---
### CI/CD :rocket:
.gitlab-ci.yml
```yml
stages:
- build
- test
build:
stage: build
image: node
script:
- echo "Start building App"
- npm install
- npm build
- echo "Build successfully!"
artifacts:
expire_in: 1 hour
paths:
- build
- node_modules/
test:
stage: test
image: node
script:
- echo "Testing App"
- npm install
- CI=true npm test
- echo "Test successfully!"
```
---
### Merci d'avoir écouté !
Vous pouvez retrouver le dépot gitlab du starter à [ce lien](https://gitlab.hardis-group.com/nantes-ingenierie/communnantes/starter-kit)
{"metaMigratedAt":"2023-06-17T00:47:10.735Z","metaMigratedFrom":"YAML","title":"Présentation starter-kit ReactJS","breaks":true,"description":"View the slide with \"Slide Mode\".","contributors":"[{\"id\":\"0ae83b58-8f52-464c-a9cf-e2731655da1d\",\"add\":7974,\"del\":3454}]"}