Aller au contenu

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.

Vous pouvez générer un nouveau projet TypeScript de deux manières :

  1. Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
  2. Ouvrez la console Nx dans VSCode
  3. Cliquez sur Generate (UI) dans la section "Common Nx Commands"
  4. Recherchez @aws/nx-plugin - ts#project
  5. Remplissez les paramètres requis
    • Cliquez sur Generate
    ParamètreTypePar défautDescription
    name Requisstring-Nom du projet TypeScript
    directory stringpackagesRé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 booleantrueIndique 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.

    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

    Ajoutez votre code TypeScript dans le répertoire src.

    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 :

    index.ts
    import { sayHello } from './hello.js';

    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 :

    src/index.ts
    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 :

    packages/my-other-project/src/index.ts
    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
    Fenêtre de terminal
    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 :

    Terminal window
    pnpm nx sync
    Fenêtre de terminal
    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.

    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.

    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 :

    Terminal window
    pnpm add some-npm-package --filter my-library

    Vous 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 :

    Terminal window
    pnpm add -Dw some-dev-tool

    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.

    Fenêtre de terminal
    pnpm add some-npm-package --filter my-library

    Les catalogues sont activés par défaut. Pour les désactiver, créez votre workspace avec --catalog false :

    Terminal window
    pnpm create @aws/nx-workspace my-project --catalog false

    Ou configurez-le dans aws-nx-plugin.config.mts à tout moment :

    aws-nx-plugin.config.mts
    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.

    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 :

    biome.json
    {
    "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).

    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 :

    rolldown.config.ts
    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 :

    Terminal window
    pnpm nx build <project-name>

    <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 :

    Terminal window
    pnpm nx run-many --target build

    Ou utilisez la commande raccourcie :

    Terminal window
    pnpm build

    Vitest est configuré pour tester votre projet.

    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.

    hello.spec.ts
    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

    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 :

    Terminal window
    pnpm 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 :

    Terminal window
    pnpm 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.

    Pour invoquer le linter et vérifier votre projet, exécutez la cible lint :

    Terminal window
    pnpm nx lint <project-name>

    La majorité des problèmes de lint ou de formatage peuvent être corrigés automatiquement en exécutant avec l’argument --configuration=fix.

    Terminal window
    pnpm nx lint <project-name> --configuration=fix

    De même, pour corriger tous les problèmes de lint dans tous les packages de votre workspace, exécutez :

    Terminal window
    pnpm nx run-many --target lint --all --configuration=fix

    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 :

    Terminal window
    pnpm nx run-many --target build --configuration=skip-lint

    Cela ignore complètement la cible lint pendant le build.