Projets TypeScript
Le générateur de projet TypeScript peut être utilisé pour créer une bibliothèque ou une application TypeScript moderne 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 :
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- 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
| 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. |
Sortie du générateur
Section intitulée « Sortie 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 du projet définissant le nom du package et les dépendances du projet
- project.json Configuration du projet et cibles de build
- tsconfig.json Configuration TypeScript de base pour ce projet (étend tsconfig.base.json à la racine de l’espace de travail)
- tsconfig.lib.json Configuration TypeScript pour votre bibliothèque (votre source d’exécution ou empaquetée)
- tsconfig.spec.json Configuration TypeScript pour vos tests
- vitest.config.mts Configuration pour Vitest
Vous remarquerez également quelques modifications apportées aux fichiers suivants à la racine de votre espace de travail :
- 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 dans votre espace de travail
- tsconfig.json une référence de projet TypeScript est ajoutée pour votre projet
Écrire du code source TypeScript
Section intitulée « Écrire du code source TypeScript »Ajoutez votre code TypeScript dans le répertoire src.
Syntaxe d’importation ESM
Section intitulée « Syntaxe d’importation ESM »Puisque votre projet TypeScript est un module ES, assurez-vous d’écrire vos instructions d’importation avec la syntaxe ESM correcte, en référençant explicitement l’extension de fichier :
import { sayHello } from './hello.js';Exporter pour d’autres projets TypeScript
Section intitulée « Exporter pour d’autres projets TypeScript »Le point d’entrée de votre projet TypeScript est src/index.ts. Vous pouvez ajouter des exports ici pour tout ce que vous souhaitez que d’autres projets puissent importer :
export { sayHello } from './hello.js';export * from './algorithms/index.js';Importer le code de votre bibliothèque dans d’autres projets
Section intitulée « Importer le code de votre bibliothèque dans d’autres projets »Les alias TypeScript pour votre projet sont configurés dans le tsconfig.base.json de votre espace de travail, ce qui vous 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’importation pour un nouveau projet dans votre espace de travail pour la première fois, vous verrez probablement une erreur dans votre IDE similaire à celle ci-dessous :
Erreur d’importation
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)C’est parce qu’une référence de projet n’a pas encore été configurée, et que le projet importé n’a pas encore été déclaré comme dépendance d’espace de travail dans le package.json de votre projet.
Votre espace de travail 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 requise :
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 êtes prêt à utiliser votre bibliothèque.
Maintenir les alias de chemin synchronisés
Section intitulée « Maintenir les alias de chemin synchronisés »Si vous ajoutez des entrées compilerOptions.paths personnalisées dans le tsconfig.json d’un projet, TypeScript cesse d’hériter des alias d’espace de travail 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 de l’espace de travail :
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, en évitant 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 :
L’espace de travail définit catalogMode: strict, donc 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ésactiver les catalogues
Section intitulée « Désactiver les catalogues »Les catalogues sont activés par défaut. Pour les désactiver, créez votre espace de travail 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 définissez-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 maintenir les versions alignées entre les projets est de votre responsabilité.
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 (pas de déclarations de dépendances par projet), désactivez la règle de lint dans le biome.json de l’espace de travail :
{ "linter": { "rules": { "correctness": { "noUndeclaredDependencies": "off" } } }}Les projets résolvent les packages installés à la racine au moment du build, donc tout se construit 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 tel que Rolldown pour regrouper votre projet, car cela peut effectuer un tree-shaking pour garantir que seules les dépendances que votre projet référence réellement sont incluses.
Vous pouvez y parvenir en ajoutant une cible telle que la suivante à 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', codeSplitting: false, }, },]);Construction
Section intitulée « Construction »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 complet de votre projet.
La cible build compilera, lintera et testera votre projet.
La sortie de build se trouve dans le dossier dist racine de votre espace de travail, à l’intérieur d’un répertoire pour votre package et votre cible, par exemple dist/packages/<my-library>/tsc
Pour construire tous les projets de votre espace de travail, 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.
Écrire des tests
Section intitulée « Écrire 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 tels que 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 la façon d’écrire des tests et des fonctionnalités telles que le mocking de dépendances, consultez la documentation Vitest
Exécuter les tests
Section intitulée « Exécuter les tests »Les tests s’exécuteront dans le cadre de la cible build pour votre projet, mais vous pouvez également les exécuter séparément en exécutant 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 biome.json à la racine de l’espace de travail — les modifications apportées à celui-ci s’appliquent à tous les projets TypeScript de votre espace de travail et garantissent la cohérence.
Exécuter le linter
Section intitulée « Exécuter le linter »Pour invoquer le linter pour vérifier votre projet, vous pouvez exécuter la cible lint.
pnpm nx lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>Corriger les problèmes de lint
Section intitulée « Corriger les problèmes de lint »La majorité des problèmes de linting 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, si vous souhaitez corriger tous les problèmes de lint dans tous les packages de votre espace de travail, vous pouvez exécuter :
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 linting 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 entièrement la cible lint pendant le build.