Rapidement Configurer un Projet TypeScript
Introduction
En cours de rédaction :)
Beaucoup de gens utilisent des outils dits de scaffolding (littéralement "construction d'échafaudage") pour créer la myriade de fichiers de configuration nécessaire à un projet web digne de ce nom de nos jours.
D'autres se créent un ou plusieurs dépôts dits "de boilerplate" qu'ils clonent à chaque nouveau projet.
Ces approches sont pratiques, mais je ne les aime pas beaucoup :
- avec le scaffolding je ne comprends pas ce que je fais, je manque de flexibilité, j'ai du mal à débugger quand quelque chose ne fonctionne pas correctement
- avec les boilerplate je me coupe de l'avancée de l'état de l'art et m'enferme dans des habitudes
Ma stratégie personnelle est de tout reconstruire à partir de zéro à chaque fois, tout en m'inspirant de sources que je connais bien pour accélérer la manoeuvre.
Ces sources peuvent être certains de mes projets, de la documentation officielle bien réputée...
Plus on fait ça, plus on va vite et plus on en apprend sur ses outils. Je perds sans doute une dizaine de minute à chaque projet par rapport à quelqu'un qui va utiliser un outil magique, mais que sont dix minutes sur la vie d'un projet, surtoût quand on prend en compte le bénéfice de l'apprentissage'?
Pour rédiger cette page, je me suis installé un Ubuntu 20.04 tout frais dans une VM, histoire de vraiment prendre les choses depuis le début.
Je vais tâcher de documenter la manière la plus efficace, selon moi, de créer un projet en TypeScript avec le linting et tout ce qui va bien en partant d'une installation vierge d'Ubuntu.
Nous sommes le 29 juin 2021, cette documentation sera sans doute périmée demain. Allons-y...
Installation de Node.js et de yarn
J'utilise le plus souvent possible snap pour installer des choses, on a des paquets plus récents, mis à jour automatiquement, et, pour certains, avec un système d'isolation de l'environnement d'exécution du programme qui fait qu'on augmente la sécurité de son système.
Bon, la nature de node fait qu'on n'a pas de sécurité supplémentaire grâce à snap par rapport à apt mais c'est pas grave.
C'est pour ça qu'on met --classic dans la commande qui suit :
Ensuite, j'installe yarn comme gestionnaire de paquets plutôt que le traditionnel npm, parce que yarn apporte plein d'avantages comme :
- une installation beaucoup plus rapide des dépendances
- une meilleure reproductibilité des installations grâce au fait que l'on versionne ses dépendances dans son projet
- de façon générale, une expérience utilisateur plus agréable
La liste des avantages de yarn est longue, mais ce n'est pas le sujet ici. Installons-le :
À l'heure où j'écris ces lignes, c'est la version 1.x de yarn est installée. On verra plus tard qu'on utilisera en fait la v2 pour notre projet.
Initialisation de git et de yarn
On se met dans le dossier qu'on veut puis :
Initialisation de git
J'initialise toujours en premier un dépôt git que je mets sur GitHub, soit en privé soit en public.
C'est gratuit, on n'a pas d'excuse pour ne pas le faire. Versionner son code c'est toujours bien, même quand on pense que le projet ne va servir à rien, on ne sait jamais.
Et puis ça permet de le retrouver de n'importe-où.
Le code pour ce tuto est sur GitHub.
En initialisant son dépôt git en premier, on gagne un peu de temps car certains outils utilisent les informations fournies par git pour accélérer un peu leur config. Notamment yarn init
.
Je vais sur GitHub créer le répo et en bon fainéant que je suis je copie-colle la plupart des instructions qu'il me donne pour gagner du temps. Sauf le README. Fuck le README.
On s'occupe tout de suite de rajouter un fichier .gitignore avant de faire quoi que ce soit avec yarn.
Source de cette information : yarnpkg.com.
Et voila pour git ! On peut passer à la suite.
Initialisation de yarn
Enfin on lance yarn init
:
Là, il n'y à qu'a répondre aux questions. Pour l'entry point on peut mettre src/index.ts à la place du index.js suggéré.
Grâce au fait que j'ai déjà initialisé mon répo git la réponse à la question repository url
est déjà pré-remplie ansi que author
.
Ça nous crée un fichier package.json tout comme l'aurait fait npm.
Pour private
je mets 'true' car je n'ai pas l'intention de publier ce paquet sur le registry global.
Maintenant que j'ai un package.json je rajoute dedans le très important 'type: module'
qui va indiquer à Node.js que j'ai l'intention d'utiliser les modules javascript ES6+, i.e. import/export.
On reparlera de ce grand bazaar.
Au final mon package.json ressemble à ça :
Maintenant qu'on a un package défini, on peut mettre à jour yarn :
Le echo "nodeLinker: node-modules" >> .yarnrc.yml
est important, cela dit à yarn d'utiliser un traditionnel dossier node_modules au lieu de sa relativement nouvelle architecture dénommée Plug'n'Play.
Initialisation de TypeScript et tsconfig.json
Il nous manque un élément crucial, bien sûr,installer TypeScript !!
Le compilo TypeScript prend par défaut sa myriade de paramètres dans un fichier tsconfig.json à mettre à la racine du projet.
Je détaillerai plus tard, peut-être, ce qu'il faut en retenir, mais en voici déjà un qui marche bien :
Si vous voulez vraiment rigoler, mettez "strictNullChecks": true
dans les compilerOptions, on en reparlera :)
Configuration du linter eslint
J'installe toujours en premier le linter, on va prendre eslint comme pour le JavaScript. C'est de loin la solution la plus populaire et la plus standard.
C'est toujours bien d'être dans les standards.
À la base eslint a été fait pour linter le JavaScript mais il a un plugin pour parser le TypeScript et tout un tas d'ensembles de règles très bien faites pour nous aider au quotidien, même des règles spécifiques à TypeScript via des plugins qu'on va installer.
Au plus tôt on lint, au plus tôt on évite d'être con.
On l'installe avec yarn et on lance son script d'initialisation pour ne pas s'embêter à créer notre config de toutes pièces.
On répond aux questions :
- How would you like to use ESLint?
- To check syntax, find problems, and enforce code style
- What type of modules does your project use?
- JavaScript modules (import/export)
- Which framework does your project use?
- React (oui, on sais jamais, me connaissant...)
- Does your project use TypeScript?
- Yes
- Where does your code run?
- Browser, Node (on appuie sur "a" pour tout choisir)
- How would you like to define a style for your project?
- Use a popular style guide
- Which style guide do you want to follow?
- Airbnb: https://github.com/airbnb/javascript
- What format do you want your config file to be in?
- JSON
Là, ça va nous proposer d'installer les dépendances qui vont bien, mais il va les installer avec npm et ce n'est pas ce qu'on veut, donc on copie la liste des dépendances et on répond No.
On peut maintenant installer avec yarn les dépendances qu'on a copiées.
Mais la liste n'est hélas pas complète, j'en rajoute donc :
De toutes façons c'est simple, s'il manque des dépendances on regarder les erreurs affichées par yarn et on les installes ensuite avec yarn add -D
...
Ensuite, très utile : Se préparer une tâche de lint dans package .json.
on s'en servira rarement, mais ça permet de vérifier au moins que la config est bonne - des fois quand la config n'est pas bonne l'IDE se met tout simplement à arrêter silencieusement de signaler les erreurs.
Donc c'est bien pratique de pouvoir lancer un petit yarn lint
pour se rassurer si jamais on trouve que tout est décidément trop calme.
Pour faire ça, dans package.json on ajoute :
Configuration eslint de base
Normalement, de base, eslint aura généré quelque chose comme ça :
Mes modifications habituelles aux règles de base d'eslint
Mais à chacun ses gouts (et ses impératifs), je noterai dans ce qui suit les règles que j'éprouve le plus souvent le besoin d'ajuster.
Pour appliquer les règles qui suivent, il n'y a qu'à les insérer dans l'objet "rules" du fichier ".eslintrc.json".
En ce qui concerne React
Pour le TypeScript en général
Il y a pas mal de règles parfaitement sensées en JavaScript mais qui perdent de leur pertinence en TypeScript grace aux garanties que TypeScript nous apporte sur notre code.
Il ne faut donc pas hésiter à désactiver les règles qui n'ont pas de sens en TypeScript, surtout quand une autre, spécifique à TypeScript la remplace.
Le fastidieux plugin import
On rajoute :
Et la règle dans rules , qui dépend un peu du projet...
J'installe maintenant VSCode avec un petit :sudo snap install code --classic
et je le lance via code .
.
fm.de.jouvencel@gmail.com