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 Biome pour le linting et le formatage.
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#projectyarn nx g @aws/nx-plugin:ts#projectnpx nx g @aws/nx-plugin:ts#projectbunx nx g @aws/nx-plugin:ts#projectVous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:ts#project --dry-runyarn nx g @aws/nx-plugin:ts#project --dry-runnpx nx g @aws/nx-plugin:ts#project --dry-runbunx nx g @aws/nx-plugin:ts#project --dry-run| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
| name Requis | string | - | Nom du projet TypeScript |
| directory | string | packages | Répertoire parent où la bibliothèque est placée. |
| subDirectory | string | - | Le sous-répertoire dans lequel la bibliothèque est placée. Par défaut, il s'agit du nom de la bibliothèque. |
| preferInstallDependencies | boolean | true | Indique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir à false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin. |
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
- package.json Manifeste de projet définissant le nom du package du projet et les dépendances
- 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
- vitest.config.mts Configuration pour Vitest
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, et le projet importé n’a pas encore été déclaré comme dépendance de workspace dans le package.json de votre projet.
Votre workspace est configuré avec des générateurs de synchronisation qui gèrent les deux pour vous, vous n’avez donc pas besoin de les configurer manuellement. Exécutez simplement la commande suivante et Nx ajoutera la configuration nécessaire :
pnpm nx syncyarn nx syncnpx nx syncbunx nx sync NX The workspace is out of sync
[@nx/js:typescript-sync]: Some TypeScript configuration files are missing project references to the projects they depend on, contain stale project references, or have duplicate project references.[@aws/nx-plugin:ts#sync]: Local project dependencies are out of sync. The following workspace dependencies will be declared:packages/my-other-project/package.json:- @my-scope/my-library: workspace:*
Syncing the workspace...The workspace was synced successfully!Le générateur de synchronisation TypeScript de Nx ajoute la référence de projet, et le générateur ts#sync du plugin déclare le projet importé dans le package.json de votre projet (workspace:* lorsque le gestionnaire de packages prend en charge le protocole workspace, * sur npm et yarn classic), de sorte que le gestionnaire de packages lie le projet local lors de l’installation. Après cela, l’erreur dans votre IDE devrait disparaître et vous pourrez utiliser votre bibliothèque.
Maintenir les alias de chemins synchronisés
Section intitulée « Maintenir les alias de chemins synchronisés »Si vous ajoutez des entrées compilerOptions.paths personnalisées dans le tsconfig.json d’un projet, TypeScript cesse d’hériter les alias du workspace définis dans tsconfig.base.json. Le générateur caché ts#sync s’exécute avant la cible compile (configurée dans nx.json) pour copier tous les alias de base manquants dans les fichiers tsconfig.json, tsconfig.lib.json et tsconfig.app.json qui déclarent déjà paths. Pour désactiver cette fonctionnalité, supprimez @aws/nx-plugin:ts#sync de targetDefaults.compile.syncGenerators dans nx.json.
Dépendances
Section intitulée « Dépendances »Chaque projet TypeScript déclare ses dépendances d’exécution tierces dans son propre package.json. Les outils de build et de test partagés entre les projets sont définis dans le package.json racine.
Pour ajouter une dépendance d’exécution à un projet, installez-la dans ce projet :
pnpm add some-npm-package --filter my-libraryyarn workspace @my-scope/my-library add some-npm-packagenpm install --legacy-peer-deps some-npm-package -w packages/my-librarybun add some-npm-package --cwd packages/my-libraryVous pouvez également exécuter la commande add/install simple de votre gestionnaire de packages depuis le répertoire du projet.
Pour ajouter un outil de développement partagé, installez-le à la racine du workspace :
pnpm add -Dw some-dev-toolyarn add -D some-dev-toolnpm install --legacy-peer-deps -D some-dev-toolbun add -D some-dev-toolCatalogues
Section intitulée « Catalogues »Pour les gestionnaires de packages qui prennent en charge les catalogues (pnpm, yarn et bun), les générateurs enregistrent chaque version dans le catalogue et la référencent avec le protocole catalog: (par exemple "zod": "catalog:"), de sorte que le catalogue est la source unique de vérité pour les versions, quel que soit le projet qui déclare la dépendance. Cela vous aide à suivre une politique de version unique, évitant ainsi les conflits de types et les copies multiples de packages dans les bundles de déploiement.
Lorsque vous ajoutez vous-même une nouvelle dépendance, conservez-la également dans le catalogue :
Le workspace définit catalogMode: strict, de sorte que pnpm add enregistre la version dans le catalogue et la référence automatiquement — aucune étape supplémentaire.
pnpm add some-npm-package --filter my-libraryLe protocole catalog: de yarn ne fait que référencer une entrée de catalogue existante — il ne peut pas en créer une — donc enregistrez d’abord la version.
-
Ajoutez la version sous
catalogdans.yarnrc.yml:.yarnrc.yml catalog:some-npm-package: ^1.0.0 -
Référencez-la depuis le projet :
Fenêtre de terminal yarn workspace @my-scope/my-library add some-npm-package@catalog:
Le protocole catalog: de bun ne fait que référencer une entrée de catalogue existante — il ne peut pas en créer une — donc enregistrez d’abord la version.
-
Ajoutez la version sous
catalogdans lepackage.jsonracine :package.json {"catalog": {"some-npm-package": "^1.0.0"}} -
Référencez-la depuis le projet :
Fenêtre de terminal bun add some-npm-package@catalog: --cwd packages/my-library
Désactivation des catalogues
Section intitulée « Désactivation des catalogues »Les catalogues sont activés par défaut. Pour les désactiver, créez votre workspace avec --catalog false :
pnpm create @aws/nx-workspace my-project --catalog falseyarn create @aws/nx-workspace my-project --catalog falsenpm create @aws/nx-workspace -- my-project --catalog falsebun create @aws/nx-workspace my-project --catalog falseOu configurez-le dans aws-nx-plugin.config.mts à tout moment :
export default { packageManager: { catalogs: false, },} satisfies AwsNxPluginConfig;Avec les catalogues désactivés, les générateurs écrivent les versions de dépendances directement dans le package.json de chaque projet, et il est de votre responsabilité de maintenir les versions alignées entre les projets.
Déclarer toutes les dépendances à la racine
Section intitulée « Déclarer toutes les dépendances à la racine »Si vous préférez déclarer chaque dépendance uniquement dans le package.json racine (sans déclarations de dépendances par projet), désactivez la règle de lint dans le biome.json du workspace :
{ "linter": { "rules": { "correctness": { "noUndeclaredDependencies": "off" } } }}Les projets résolvent les packages installés à la racine au moment du build, donc tout se compile toujours — vous renoncez aux manifestes par projet comme enregistrement précis des dépendances de chaque projet (ce qui importe si vous publiez ultérieurement un projet ou divisez le dépôt).
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 référencées par votre projet.
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, }, },]);Votre projet TypeScript est configuré avec une cible build (définie dans project.json), que vous pouvez exécuter via :
pnpm nx build <project-name>yarn nx build <project-name>npx nx build <project-name>bunx nx build <project-name>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
Pour builder tous les projets de votre workspace, exécutez :
pnpm nx run-many --target buildyarn nx run-many --target buildnpx nx run-many --target buildbunx nx run-many --target buildOu utilisez la commande raccourcie :
pnpm buildyarn buildnpm run buildbun buildVitest 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 test <project-name>yarn nx test <project-name>npx nx test <project-name>bunx nx test <project-name>Vous pouvez exécuter un test individuel ou une suite de tests en utilisant le flag -t de Vitest. Passez-le après un séparateur -- pour que Nx le transmette à Vitest plutôt que de le consommer comme sa propre option --target :
pnpm nx test <project-name> -- -t 'sayHello'yarn nx test <project-name> -- -t 'sayHello'npx nx test <project-name> -- -t 'sayHello'bunx nx test <project-name> -- -t 'sayHello'Les projets TypeScript utilisent Biome pour le linting et le formatage. Biome est configuré dans le fichier racine biome.json du workspace — les modifications s’appliquent à tous les projets TypeScript du workspace et assurent la cohérence.
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 lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>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 en exécutant avec l’argument --configuration=fix.
pnpm nx lint <project-name> --configuration=fixyarn nx lint <project-name> --configuration=fixnpx nx lint <project-name> --configuration=fixbunx nx lint <project-name> --configuration=fixDe 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=fixyarn nx run-many --target lint --all --configuration=fixnpx nx run-many --target lint --all --configuration=fixbunx nx run-many --target lint --all --configuration=fixIgnorer les problèmes de lint
Section intitulée « Ignorer les problèmes de lint »Pour éviter que les problèmes de lint ne vous ralentissent pendant le développement (en particulier si vous avez des problèmes non corrigeables automatiquement dans votre projet), vous pouvez exécuter un build avec la configuration skip-lint :
pnpm nx run-many --target build --configuration=skip-lintyarn nx run-many --target build --configuration=skip-lintnpx nx run-many --target build --configuration=skip-lintbunx nx run-many --target build --configuration=skip-lintCela ignore complètement la cible lint pendant le build.