# Projet Angular Developer Friendly
*Auteur: Gaëtan Rouziès*
Voici mes conseils pour mettre en place un projet Angular simple à comprendre et à developper.
Ce projet Angular optimise le bien être et la productivité du développeur et favorise une compréhension rapide pour tous les nouveaux developpeurs qui entreront sur le projet.
## Général
- Angular 8 (Prendre la dernière version au moment de la création du projet)
- Typescript
- Angular-cli pour la génération de composant/service
- Pour le versionning: Git avec le git-flow
- IDE: VSCode ou IntelliJ IDEA
## Arborescence
* app/
* core/ (socle technique si besoin)
* styles/
* utils/
* models/
* components/
* directives/
* pipes/
* services/
* modules/
* assets/
* environments/
## Spécificités
### Général
- Utiliser une librairie CSS Populaire (Bootstrap, Material, etc.)
- Cela peut être impossible suivant le contexte du projet suivant votre équipe UX/UI.
- Vous pouvez demander à votre équipe UX/UI d'utiliser les classes générées par des packages externes afin que vous puissiez utiliser ces packages très utiles et populaires.
- Pas de mock back dans le code Angular, si un mock est nécessaire suivant le besoin du projet, celui-ci doit être dans un projet à part.
- Un seul fichier i18n par langue (fr.json, eng.json) et utilisation du package ``ngx-translate``
- Ne pas utiliser le type ``any`` en dehors des modèles et des réponses d'API
- Styles en SCSS ou LESS dans un dossier styles
- **Limiter grandement la création de composants génériques**
- **Priviligier l'utilisation de packages externes, ceux-ci doivent être populaire et fournir une documentation complète**
### Angular
- Un seul fichier contenant les routes *(A diviser, si le lazyloading est mis en place)*
- Un seul module pour les components (AppModule) *(A diviser, si le lazyloading est mis en place)*
- Les composants peuvent communiquer ensemble via des Input()/Output() ou des ``SharedService`` selon le besoin
- Pas de fichiers styles liés aux composants
- Création d'un module ``SharedModule`` qui contient tous les composants/modules utilisés dans l'ensemble de l'application (Translate, Pipes, etc.)
- Création d'un ``AppSharedModule`` et d'un ``TestingSharedModule`` qui import le ``SharedModule``
- Le ``TestingSharedModule`` contiendra des modules uniquement nécessaire lors des tests (``RouterTestingModule``, ``HttpClientTestingModule``)
- Le ``AppSharedModule`` contiendra des modules qui ne doivent pas être importés lors des tests (``RouterModule``, ``HttpClientModule``)
### Testing
- Tests exécutés avec un Chrome Headless (Ne pas utiliser PhantomJS)
- Utilisation de ``karma-spec-reporter`` pour le détail de l'exécution des tests et de ``karma-coverage-istanbul-reporter`` pour la couverture de code
- Les fichiers tests ne doivent pas importer de module de composants propres à l'application autre que le ``TestingSharedModule``
## Packages très importants
Ces packages ont un impact énorme sur la simplicité de développement et la productivité.
- ``ngx-translate``
- ``ts-cacheable``
- ``ngx-bootstrap`` (Modal, Dropdown, Pagination, Tooltip, Tab, Alert, ProgressBar)
- C'est l'avantage d'utiliser une librairie CSS Populaire
## Scripts
Nous avons ajouté deux scripts
- ``npm run precommit``: Exécute le linter, le build en mode prod et les tests.
- Utilisé très fréquemment par l'équipe de développeur, cela nous permets de rarement casser la branche develop
- ``npm run analyse``: Fournit le détail du bundle.js
- Utilisé rarement mais utile à chaque ajout d'un package externe
## Spécificités en détails
### Déclaration des modèles
Les classes correspondantes à des données provenant d'API ont un constructor avec un paramètre data optionel de type ``any``.
```typescript
export class MyClass {
field1: string;
field2: string;
field3: string;
constructor(data?: any) {
if (!data) {
return;
}
this.field1 = data.field1;
this.field2 = data.field2;
this.field3 = data.field3;
}
}
```