Avec tous les frameworks prêts à l’emploi comment Next, Nest, Remix, Astro… on peut en oublier comment configurer un simple projet Node avec Typescript. Je vous partage pas à pas la configuration minimale que j’ai mise en place dernièrement.
TLDR : Retrouvez le projet sur github
Création du fichier package.json
:
npm init -y
On peut désormais ajouter nos dépendances et scripts.
On veut gérer notre code source en typescript dans src/**/*
et générer du code Javascript dans dist/**/*
:
├── dist
│ └── index.js
├── src
│ └── index.ts
C’est bien du Javascript qu’on déploie, pas du Typescript.
Nous ajoutons Typescript et les défintions de Type pour Node :
npm i --save-dev typescript @types/node
Créons un fichier de configuration tsconfig.json
avec toutes les fonctionnalités supportées par la version Node 18 (LTS à date) :
{
"compilerOptions": {
"module": "nodenext",
"moduleResolution": "nodenext",
"target": "es2022",
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./dist"
},
"include": ["src/**/*"],
"exclude": ["**/*.spec.ts"]
}
Vous pouvez aussi initialiser un fichier de
tsconfig.json
avec la commandenpx tsc --init
.
Ajoutons un script dans la section scripts
de notre fichier package.json
:
"scripts": {
"build": "tsc",
}
npm run build
produit bien des fichiers JS dans le répertoire ./dist
dist
├── index.js
Pour lancer notre application, nous pouvons exécuter notre fichier JS avec Node
node dist
Pour lancer notre application sans passer par la compilation, nous pouvons utiliser TS Node qui permet d’éxécuter directement du code Typescript :
npm i --save-dev ts-node
Exemple
npx ts-node ./src/index.ts
Pour aller plus loin, on veut que le server se relance quand un fichier source change. C’est là que Nodemon rentre en jeu.
npm i --save-dev nodemon
La configuration nodemon.json
permet de relancer ts-node
dès qu’un fichier .js
ou .ts
change :
{
"watch": ["src"],
"ext": ".ts,.js",
"ignore": [],
"exec": "npx ts-node ./src/index.ts"
}
La librairie ESLint permet de trouver et corriger rapidement des problèmes de syntaxe ou non respect de conventions.
Nous ajoutons la librairie et les paquets liés à Typescript :
npm i --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
Nous définissons la configuration .eslintrc
avec les règles standards de Typescript :
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
"rules": {},
"env": {
"browser": true,
"node": true,
"es2022": true
}
}
La librairie Prettier va nous permettre de formater le code selon des conventions définies et partagées dans le code.
Nous ajoutons la librairie à nos dépendances :
npm i --save-dev prettier eslint-config-prettier eslint-plugin-prettier
Les dépendances ESLint ajoutées
eslint-config-prettier
eteslint-plugin-prettier
vont désactiver les règles en conflit avec Prettier
Ajout du fichier .prettierrc
:
{
"trailingComma": "all",
"singleQuote": true,
"printWidth": 80
}
Modifions le fichier de configuration .eslintrc
pour ajouter les règles Prettier :
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint", "prettier"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"prettier"
],
"rules": {
"prettier/prettier": 2
},
"env": {
"browser": true,
"node": true,
"es2022": true
}
}
Jest est le framework de test qui nous simplifie la configuration et écriture des tests.
Nous ajoutons la librairie, les définitions de types pour Typescript et les règles ESLint :
npm i --save-dev jest @types/jest ts-jest eslint-plugin-jest
Ajout du fichier jest.config.ts
:
module.exports = {
transform: {
'^.+\\.ts?$': 'ts-jest',
},
testEnvironment: 'node',
testRegex: './src/.*\\.(test|spec)?\\.(ts|ts)$',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
roots: ['<rootDir>/src'],
};
Modifions le fichier de configuration .eslintrc
pour ajouter les règles Jest :
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint", "prettier", "jest"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"prettier"
],
"rules": {
"prettier/prettier": 2
},
"env": {
"browser": true,
"node": true,
"es2022": true,
"jest/globals": true
}
}
Ne pas oublier d’ignorer certains fichiers et dossiers avec .gitignore
:
# IntelliJ project files
.idea
*.iml
out
gen
# VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
# Folders
dist
coverage
node_modules
Retrouvez le projet sur le projet github Node Typescript Starter
Les liens vers les différentes librairies utilisées :