Projets TypeScript
Le générateur de projet TypeScript permet de créer une bibliothèque ou une application moderne TypeScript configurée avec les meilleures pratiques telles que les modules ECMAScript (ESM), les références de projet TypeScript, Vitest pour exécuter les tests et ESLint pour l’analyse statique.
Utilisation
Section intitulée « Utilisation »Générer un projet TypeScript
Section intitulée « Générer un projet TypeScript »Vous pouvez générer un nouveau projet TypeScript de deux manières :
- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)
dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - ts#project
- Remplissez les paramètres requis
- Cliquez sur
Generate
pnpm nx g @aws/nx-plugin:ts#project
yarn nx g @aws/nx-plugin:ts#project
npx nx g @aws/nx-plugin:ts#project
bunx nx g @aws/nx-plugin:ts#project
Vous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:ts#project --dry-run
yarn nx g @aws/nx-plugin:ts#project --dry-run
npx nx g @aws/nx-plugin:ts#project --dry-run
bunx nx g @aws/nx-plugin:ts#project --dry-run
Paramètre | Type | Par défaut | Description |
---|---|---|---|
name Requis | string | - | TypeScript project name |
directory | string | packages | Parent directory where the library is placed. |
subDirectory | string | - | The sub directory the lib is placed in. By default this is the library name. |
Résultat du générateur
Section intitulée « Résultat du générateur »Le générateur créera la structure de projet suivante dans le répertoire <directory>/<name>
:
Répertoiresrc Code source TypeScript
- index.ts
- project.json Configuration du projet et cibles de build
- tsconfig.json Configuration TypeScript de base pour ce projet (étend le tsconfig.base.json racine du workspace)
- tsconfig.lib.json Configuration TypeScript pour votre bibliothèque (code d’exécution ou source empaquetée)
- tsconfig.spec.json Configuration TypeScript pour vos tests
- vite.config.ts Configuration pour Vitest
- eslint.config.mjs Configuration pour ESLint
Vous remarquerez également des modifications dans les fichiers suivants à la racine de votre workspace :
- nx.json La configuration Nx est mise à jour pour configurer le plugin @nx/js/typescript pour votre projet
- tsconfig.base.json Un alias TypeScript est configuré pour votre projet afin qu’il puisse être importé par d’autres projets de votre workspace
- tsconfig.json Une référence de projet TypeScript est ajoutée pour votre projet
Écriture du code source TypeScript
Section intitulée « Écriture du code source TypeScript »Ajoutez votre code TypeScript dans le répertoire src
.
Syntaxe d’import ESM
Section intitulée « Syntaxe d’import ESM »Comme votre projet TypeScript est un module ES, assurez-vous d’écrire vos instructions d’import avec la syntaxe ESM correcte, en référençant explicitement l’extension de fichier :
import { sayHello } from './hello.js';
Export pour d’autres projets TypeScript
Section intitulée « Export pour d’autres projets TypeScript »Le point d’entrée de votre projet TypeScript est src/index.ts
. Vous pouvez ajouter ici des exports pour tout élément que vous souhaitez rendre importable par d’autres projets :
export { sayHello } from './hello.js';export * from './algorithms/index.js';
Importation de votre bibliothèque dans d’autres projets
Section intitulée « Importation de votre bibliothèque dans d’autres projets »Les alias TypeScript pour votre projet sont configurés dans le tsconfig.base.json
de votre workspace, ce qui permet de référencer votre projet TypeScript depuis d’autres projets TypeScript :
import { sayHello } from ':my-scope/my-library';
Lorsque vous ajoutez une instruction d’import pour un nouveau projet dans votre workspace pour la première fois, vous verrez probablement une erreur dans votre IDE similaire à celle-ci :
Erreur d’import
File '/path/to/my/workspace/packages/my-library/src/index.ts' is not under 'rootDir' '/path/to/my/workspace/packages/my-consumer'. 'rootDir' is expected to contain all source files. File is ECMAScript module because '/path/to/my/workspace/package.json' has field "type" with value "module" ts(6059)File '/path/to/my/workspace/packages/my-library/src/index.ts' is not listed within the file list of project '/path/to/my/workspace/packages/my-consumer/tsconfig.lib.json'. Projects must list all files or use an 'include' pattern. File is ECMAScript module because '/path/to/my/workspace/package.json' has field "type" with value "module" ts(6307)
Cela est dû à l’absence de configuration d’une référence de projet.
Les projets TypeScript sont configurés avec le générateur Nx TypeScript Sync par défaut, vous évitant de configurer manuellement les références de projet. Exécutez simplement la commande suivante et Nx ajoutera la configuration nécessaire :
pnpm nx sync
yarn nx sync
npx nx sync
bunx nx sync
Après cela, l’erreur dans votre IDE devrait disparaître et vous pourrez utiliser votre bibliothèque.
Dépendances
Section intitulée « Dépendances »Vous remarquerez que votre projet TypeScript n’a pas de fichier package.json
, ce qui peut être surprenant si vous avez l’habitude des monorepos TypeScript traditionnels.
Pour ajouter une dépendance à un package TypeScript dans votre monorepo, ajoutez-la simplement au package.json
à la racine de votre workspace. Vous pouvez le faire via la ligne de commande de votre gestionnaire de packages :
pnpm add -w some-npm-package
yarn add some-npm-package
npm install --legacy-peer-deps some-npm-package
bun install some-npm-package
La dépendance est alors disponible pour tous les projets TypeScript de votre workspace.
Code d’exécution
Section intitulée « Code d’exécution »Lorsque vous utilisez votre projet TypeScript comme code d’exécution (par exemple comme gestionnaire pour une fonction AWS Lambda), il est recommandé d’utiliser un outil comme Rolldown pour empaqueter votre projet, car cela permet un tree-shaking pour n’inclure que les dépendances réellement utilisées.
Vous pouvez y parvenir en ajoutant une cible comme celle-ci dans votre fichier project.json
:
{ ... "targets": { ... "bundle": { "cache": true, "executor": "nx:run-commands", "outputs": ["{workspaceRoot}/dist/packages/my-library/bundle"], "options": { "command": "rolldown -c rolldown.config.ts" } }, },}
Et en ajoutant le fichier rolldown.config.ts
comme suit :
import { defineConfig } from 'rolldown';
export default defineConfig([ { input: 'src/index.ts', output: { file: '../../dist/packages/my-library/bundle/index.js', format: 'cjs', inlineDynamicImports: true, }, },]);
Publication sur NPM
Section intitulée « Publication sur NPM »Si vous publiez votre projet TypeScript sur NPM, vous devez créer un fichier package.json
pour celui-ci.
Celui-ci doit déclarer les dépendances utilisées par votre projet. Comme au moment du build votre projet résoudra les dépendances installées via le package.json
racine du workspace, il est recommandé de configurer le plugin ESLint Nx Dependency Checks pour s’assurer que le package.json
de votre projet publié inclut toutes les dépendances utilisées.
Votre projet TypeScript est configuré avec une cible build
(définie dans project.json
), que vous pouvez exécuter via :
pnpm nx run <project-name>:build
yarn nx run <project-name>:build
npx nx run <project-name>:build
bunx nx run <project-name>:build
Où <project-name>
est le nom qualifié complet de votre projet.
La cible build
compilera, linttera et testera votre projet.
Le résultat du build se trouve dans le dossier dist
racine de votre workspace, dans un répertoire spécifique à votre package et à la cible, par exemple dist/packages/<my-library>/tsc
Vitest est configuré pour tester votre projet.
Écriture des tests
Section intitulée « Écriture des tests »Les tests doivent être écrits dans des fichiers .spec.ts
ou .test.ts
, co-localisés dans le dossier src
de votre projet.
Par exemple :
Répertoiresrc
- hello.ts Code source de la bibliothèque
- hello.spec.ts Tests pour hello.ts
Vitest fournit une syntaxe similaire à Jest pour définir les tests, avec des utilitaires comme describe
, it
, test
et expect
.
import { sayHello } from './hello.js';
describe('sayHello', () => {
it('should greet the caller', () => { expect(sayHello('Darth Vader')).toBe('Hello, Darth Vader!'); });
});
Pour plus de détails sur l’écriture de tests et des fonctionnalités comme le mocking de dépendances, consultez la documentation Vitest
Exécution des tests
Section intitulée « Exécution des tests »Les tests s’exécuteront dans le cadre de la cible build
de votre projet, mais vous pouvez aussi les exécuter séparément via la cible test
:
pnpm nx run <project-name>:test
yarn nx run <project-name>:test
npx nx run <project-name>:test
bunx nx run <project-name>:test
Vous pouvez exécuter un test individuel ou une suite de tests avec le flag -t
:
pnpm nx run <project-name>:test -t 'sayHello'
yarn nx run <project-name>:test -t 'sayHello'
npx nx run <project-name>:test -t 'sayHello'
bunx nx run <project-name>:test -t 'sayHello'
Les projets TypeScript utilisent ESLint pour le linting, ainsi que Prettier pour le formatage.
Nous recommandons de configurer ESLint dans le fichier racine eslint.config.mjs
du workspace, car les modifications s’appliqueront à tous les projets TypeScript et assureront la cohérence.
De même, vous pouvez configurer Prettier dans le fichier racine .prettierrc
.
Exécution du linter
Section intitulée « Exécution du linter »Pour invoquer le linter et vérifier votre projet, exécutez la cible lint
:
pnpm nx run <project-name>:lint
yarn nx run <project-name>:lint
npx nx run <project-name>:lint
bunx nx run <project-name>:lint
Correction des problèmes de lint
Section intitulée « Correction des problèmes de lint »La majorité des problèmes de lint ou de formatage peuvent être corrigés automatiquement. Vous pouvez demander à ESLint de corriger les problèmes avec l’argument --configuration=fix
:
pnpm nx run <project-name>:lint --configuration=fix
yarn nx run <project-name>:lint --configuration=fix
npx nx run <project-name>:lint --configuration=fix
bunx nx run <project-name>:lint --configuration=fix
De même, pour corriger tous les problèmes de lint dans tous les packages de votre workspace, exécutez :
pnpm nx run-many --target lint --all --configuration=fix
yarn nx run-many --target lint --all --configuration=fix
npx nx run-many --target lint --all --configuration=fix
bunx nx run-many --target lint --all --configuration=fix