Progetti TypeScript
Il generatore di progetti TypeScript può essere utilizzato per creare una libreria o un’applicazione moderna TypeScript configurata con le migliori pratiche come ECMAScript Modules (ESM), i riferimenti di progetto di TypeScript, Vitest per l’esecuzione dei test e Biome per il linting e la formattazione.
Utilizzo
Sezione intitolata “Utilizzo”Genera un progetto TypeScript
Sezione intitolata “Genera un progetto TypeScript”Puoi generare un nuovo progetto TypeScript in due modi:
- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - ts#project - Compila i parametri richiesti
- Clicca su
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#projectPuoi anche eseguire una prova per vedere quali file verrebbero modificati
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-runOpzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| name Obbligatorio | string | - | Nome del progetto TypeScript |
| directory | string | packages | Directory principale dove viene posizionata la libreria. |
| subDirectory | string | - | La sotto-directory in cui viene posizionata la libreria. Per impostazione predefinita corrisponde al nome della libreria. |
| preferInstallDependencies | boolean | true | Se preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine. |
Output del generatore
Sezione intitolata “Output del generatore”Il generatore creerà la seguente struttura del progetto nella directory <directory>/<name>:
Directorysrc Codice sorgente TypeScript
- index.ts
- package.json Manifesto del progetto che definisce il nome del pacchetto e le dipendenze
- project.json Configurazione del progetto e target di build
- tsconfig.json Configurazione TypeScript di base per questo progetto (estende tsconfig.base.json nella root del workspace)
- tsconfig.lib.json Configurazione TypeScript per la tua libreria (codice runtime o sorgente impacchettato)
- tsconfig.spec.json Configurazione TypeScript per i test
- vitest.config.mts Configurazione per Vitest
Noterai anche alcune modifiche ai seguenti file nella root del workspace:
- nx.json La configurazione di Nx viene aggiornata per configurare il plugin @nx/js/typescript per il tuo progetto
- tsconfig.base.json Viene impostato un alias TypeScript per il tuo progetto in modo che possa essere importato da altri progetti nel workspace
- tsconfig.json Viene aggiunto un riferimento di progetto TypeScript per il tuo progetto
Scrivere codice TypeScript
Sezione intitolata “Scrivere codice TypeScript”Aggiungi il tuo codice TypeScript nella directory src.
Sintassi di import ESM
Sezione intitolata “Sintassi di import ESM”Poiché il tuo progetto TypeScript è un ES Module, assicurati di scrivere le istruzioni di import con la corretta sintassi ESM, riferendo esplicitamente l’estensione del file:
import { sayHello } from './hello.js';Esportare per altri progetti TypeScript
Sezione intitolata “Esportare per altri progetti TypeScript”Il punto di ingresso per il tuo progetto TypeScript è src/index.ts. Puoi aggiungere qui le esportazioni per qualsiasi elemento che desideri rendere disponibile ad altri progetti:
export { sayHello } from './hello.js';export * from './algorithms/index.js';Importare il codice della libreria in altri progetti
Sezione intitolata “Importare il codice della libreria in altri progetti”Gli alias TypeScript per il tuo progetto sono configurati nel tsconfig.base.json del workspace, consentendo di riferire il tuo progetto TypeScript da altri progetti TypeScript:
import { sayHello } from '@my-scope/my-library';Quando aggiungi un’istruzione di import per un nuovo progetto nel workspace per la prima volta, potresti vedere un errore nel tuo IDE simile al seguente:
Errore di importazione
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)Questo accade perché non è stato configurato un riferimento di progetto, e il progetto importato non è stato ancora dichiarato come dipendenza del workspace nel package.json del tuo progetto.
Il tuo workspace è configurato con generatori di sincronizzazione che gestiscono entrambi per te, quindi non è necessario configurarli manualmente. Esegui semplicemente il seguente comando e Nx aggiungerà la configurazione necessaria:
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!Il generatore TypeScript sync di Nx aggiunge il riferimento di progetto, e il generatore ts#sync del plugin dichiara il progetto importato nel package.json del tuo progetto (workspace:* dove il package manager supporta il protocollo workspace, * su npm e yarn classic), in modo che il package manager colleghi il progetto locale durante l’installazione. Dopo questo passaggio, l’errore nel tuo IDE dovrebbe scomparire e sarai pronto a utilizzare la tua libreria.
Mantenere gli alias di percorso sincronizzati
Sezione intitolata “Mantenere gli alias di percorso sincronizzati”Se aggiungi voci personalizzate compilerOptions.paths nel tsconfig.json di un progetto, TypeScript smette di ereditare gli alias del workspace definiti in tsconfig.base.json. Il generatore nascosto ts#sync viene eseguito prima del target compile (configurato in nx.json) per copiare eventuali alias di base mancanti nei file tsconfig.json, tsconfig.lib.json e tsconfig.app.json che già dichiarano paths. Per disattivare questa funzionalità, rimuovi @aws/nx-plugin:ts#sync da targetDefaults.compile.syncGenerators in nx.json.
Dipendenze
Sezione intitolata “Dipendenze”Ogni progetto TypeScript dichiara le proprie dipendenze runtime di terze parti nel proprio package.json. Gli strumenti di build e test condivisi tra i progetti sono definiti nel package.json root.
Per aggiungere una dipendenza runtime a un progetto, installala in quel progetto:
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-libraryPuoi anche eseguire il comando add/install del tuo package manager direttamente dalla directory del progetto.
Per aggiungere uno strumento di sviluppo condiviso, installalo nella root del workspace:
pnpm add -Dw some-dev-toolyarn add -D some-dev-toolnpm install --legacy-peer-deps -D some-dev-toolbun add -D some-dev-toolCatalog
Sezione intitolata “Catalog”Per i package manager che supportano i catalog (pnpm, yarn e bun), i generatori registrano ogni versione nel catalog e la referenziano con il protocollo catalog: (ad es. "zod": "catalog:"), quindi il catalog è l’unica fonte di verità per le versioni indipendentemente da quale progetto dichiara la dipendenza. Questo ti aiuta a seguire una single version policy, evitando conflitti di tipo e copie multiple di pacchetti nei bundle di deployment.
Quando aggiungi una nuova dipendenza tu stesso, mantienila anche nel catalog:
Il workspace imposta catalogMode: strict, quindi pnpm add registra la versione nel catalog e la referenzia automaticamente — nessun passaggio aggiuntivo.
pnpm add some-npm-package --filter my-libraryIl protocollo catalog: di yarn referenzia solo una voce di catalog esistente — non può crearne una — quindi registra prima la versione.
-
Aggiungi la versione sotto
catalogin.yarnrc.yml:.yarnrc.yml catalog:some-npm-package: ^1.0.0 -
Referenziala dal progetto:
Terminal window yarn workspace @my-scope/my-library add some-npm-package@catalog:
Il protocollo catalog: di bun referenzia solo una voce di catalog esistente — non può crearne una — quindi registra prima la versione.
-
Aggiungi la versione sotto
catalognelpackage.jsonroot:package.json {"catalog": {"some-npm-package": "^1.0.0"}} -
Referenziala dal progetto:
Terminal window bun add some-npm-package@catalog: --cwd packages/my-library
Disattivare i catalog
Sezione intitolata “Disattivare i catalog”I catalog sono abilitati per impostazione predefinita. Per disattivarli, crea il tuo workspace con --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 falseOppure impostalo in aws-nx-plugin.config.mts in qualsiasi momento:
export default { packageManager: { catalogs: false, },} satisfies AwsNxPluginConfig;Con i catalog disabilitati, i generatori scrivono le versioni delle dipendenze direttamente nel package.json di ogni progetto, e mantenere le versioni allineate tra i progetti è tua responsabilità.
Dichiarare tutte le dipendenze nella root
Sezione intitolata “Dichiarare tutte le dipendenze nella root”Se preferisci dichiarare ogni dipendenza solo nel package.json root (senza dichiarazioni di dipendenze per progetto), disattiva la regola di lint nel biome.json del workspace:
{ "linter": { "rules": { "correctness": { "noUndeclaredDependencies": "off" } } }}I progetti risolvono i pacchetti installati nella root al momento della build, quindi tutto continua a funzionare — rinunci ai manifesti per progetto come registro accurato delle dipendenze di ciascun progetto (il che è importante se successivamente pubblichi un progetto o dividi il repository).
Codice runtime
Sezione intitolata “Codice runtime”Quando utilizzi il tuo progetto TypeScript come codice runtime (ad esempio come handler per una funzione AWS Lambda), è consigliato utilizzare uno strumento come Rolldown per bundle del progetto, poiché permette di effettuare tree-shaking per includere solo le dipendenze effettivamente utilizzate.
Puoi ottenere questo aggiungendo un target come il seguente nel tuo file project.json:
{ ... "targets": { ... "bundle": { "cache": true, "executor": "nx:run-commands", "outputs": ["{workspaceRoot}/dist/packages/my-library/bundle"], "options": { "command": "rolldown -c rolldown.config.ts" } }, },}E aggiungendo il file rolldown.config.ts come segue:
import { defineConfig } from 'rolldown';
export default defineConfig([ { input: 'src/index.ts', output: { file: '../../dist/packages/my-library/bundle/index.js', format: 'cjs', inlineDynamicImports: true, }, },]);Il tuo progetto TypeScript è configurato con un target build (definito in project.json), che puoi eseguire tramite:
pnpm nx build <project-name>yarn nx build <project-name>npx nx build <project-name>bunx nx build <project-name>Dove <project-name> è il nome completo del tuo progetto.
Il target build compilerà, eseguirà il lint e testerà il progetto.
L’output della build si trova nella cartella dist della root del workspace, all’interno di una directory specifica per il pacchetto e il target, ad esempio dist/packages/<my-library>/tsc
Per buildare tutti i progetti nel tuo workspace, esegui:
pnpm nx run-many --target buildyarn nx run-many --target buildnpx nx run-many --target buildbunx nx run-many --target buildOppure utilizza il comando abbreviato:
pnpm buildyarn buildnpm run buildbun buildTesting
Sezione intitolata “Testing”Vitest è configurato per testare il tuo progetto.
Scrivere test
Sezione intitolata “Scrivere test”I test devono essere scritti in file .spec.ts o .test.ts, posizionati nella cartella src del progetto.
Esempio:
Directorysrc
- hello.ts Codice sorgente della libreria
- hello.spec.ts Test per hello.ts
Vitest fornisce una sintassi simile a Jest per definire i test, con utility come describe, it, test e expect.
import { sayHello } from './hello.js';
describe('sayHello', () => {
it('should greet the caller', () => { expect(sayHello('Darth Vader')).toBe('Hello, Darth Vader!'); });
});Per maggiori dettagli su come scrivere test e funzionalità come il mocking delle dipendenze, consulta la documentazione di Vitest
Eseguire i test
Sezione intitolata “Eseguire i test”I test verranno eseguiti come parte del target build del progetto, ma puoi anche eseguirli separatamente con il target test:
pnpm nx test <project-name>yarn nx test <project-name>npx nx test <project-name>bunx nx test <project-name>Puoi eseguire un singolo test o una suite di test usando il flag -t di Vitest. Passalo dopo un separatore -- in modo che Nx lo inoltri a Vitest invece di interpretarlo come la propria opzione --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'Linting
Sezione intitolata “Linting”I progetti TypeScript utilizzano Biome per il linting e la formattazione. Biome è configurato nel file biome.json della root del workspace — le modifiche si applicano a tutti i progetti TypeScript nel workspace garantendo coerenza.
Eseguire il linter
Sezione intitolata “Eseguire il linter”Per invocare il linter e verificare il progetto, puoi eseguire il target lint:
pnpm nx lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>Correggere i problemi di lint
Sezione intitolata “Correggere i problemi di lint”La maggior parte dei problemi di linting o formattazione può essere corretta automaticamente eseguendo con l’argomento --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=fixAnalogamente, se vuoi correggere tutti i problemi di lint in tutti i pacchetti del workspace, puoi eseguire:
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=fixSaltare i problemi di lint
Sezione intitolata “Saltare i problemi di lint”Per evitare che i problemi di linting ti rallentino durante lo sviluppo (in particolare se hai problemi non auto-correggibili nel tuo progetto), puoi eseguire una build con la configurazione 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-lintQuesto salta completamente il target lint durante la build.