Salta ai contenuti

Progetti TypeScript

Il generatore di progetti TypeScript può essere utilizzato per creare una libreria o applicazione TypeScript moderna configurata con le best practice come ECMAScript Modules (ESM), project references di TypeScript, Vitest per l’esecuzione dei test e Biome per il linting e la formattazione.

Puoi generare un nuovo progetto TypeScript in due modi:

Terminal window
pnpm nx g @aws/nx-plugin:ts#project
Puoi anche eseguire una prova per vedere quali file verrebbero modificati
Terminal window
pnpm nx g @aws/nx-plugin:ts#project --dry-run
ParametroTipoPredefinitoDescrizione
name Obbligatoriostring-Nome del progetto TypeScript
directory stringpackagesDirectory 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 booleantrueSe 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.

Il generatore creerà la seguente struttura di progetto nella directory <directory>/<name>:

  • Directorysrc Codice sorgente TypeScript
    • index.ts
  • package.json Manifest 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 il tsconfig.base.json della radice del workspace)
  • tsconfig.lib.json Configurazione TypeScript per la tua libreria (il tuo codice sorgente runtime o pacchettizzato)
  • tsconfig.spec.json Configurazione TypeScript per i test
  • vitest.config.mts Configurazione per Vitest

Noterai anche alcune modifiche ai seguenti file nella radice del tuo workspace:

  • nx.json La configurazione 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 tuo workspace
  • tsconfig.json viene aggiunto un project reference TypeScript per il tuo progetto

Aggiungi il tuo codice TypeScript nella directory src.

Poiché il tuo progetto TypeScript è un ES Module, assicurati di scrivere le tue istruzioni import con la corretta sintassi ESM, facendo riferimento esplicito all’estensione del file:

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

Il punto di ingresso per il tuo progetto TypeScript è src/index.ts. Puoi aggiungere export qui per tutto ciò che vorresti che altri progetti possano importare:

src/index.ts
export { sayHello } from './hello.js';
export * from './algorithms/index.js';

Importare il Codice della Tua Libreria in Altri Progetti

Sezione intitolata “Importare il Codice della Tua Libreria in Altri Progetti”

Gli alias TypeScript per il tuo progetto sono configurati nel tsconfig.base.json del workspace, il che ti consente di fare riferimento al tuo progetto TypeScript da altri progetti TypeScript:

packages/my-other-project/src/index.ts
import { sayHello } from '@my-scope/my-library';

Quando aggiungi un’istruzione import per un nuovo progetto nel tuo workspace per la prima volta, probabilmente vedrai un errore nel tuo IDE simile al seguente:

Errore di import
Terminal window
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 perché un project reference non è ancora stato configurato, e il progetto importato non è ancora stato 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 devi configurarli manualmente. Esegui semplicemente il seguente comando e Nx aggiungerà la configurazione richiesta:

Terminal window
pnpm nx sync
Terminal window
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 di sincronizzazione TypeScript di Nx aggiunge il project reference, 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 all’installazione. Dopo questo, l’errore nel tuo IDE dovrebbe scomparire e sei pronto per usare la tua libreria.

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.

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 radice.

Per aggiungere una dipendenza runtime a un progetto, installala in quel progetto:

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

Puoi anche eseguire il comando add/install semplice del tuo package manager dalla directory del progetto.

Per aggiungere uno strumento di sviluppo condiviso, installalo nella radice del workspace:

Terminal window
pnpm add -Dw some-dev-tool

Per i package manager che supportano i cataloghi (pnpm, yarn e bun), i generatori registrano ogni versione nel catalogo e vi fanno riferimento con il protocollo catalog: (es. "zod": "catalog:"), quindi il catalogo è 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 distribuzione.

Quando aggiungi tu stesso una nuova dipendenza, mantienila anche nel catalogo:

Il workspace imposta catalogMode: strict, quindi pnpm add registra la versione nel catalogo e vi fa riferimento automaticamente — nessun passaggio aggiuntivo.

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

I cataloghi sono abilitati per impostazione predefinita. Per disattivarli, crea il tuo workspace con --catalog false:

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

Oppure impostalo in aws-nx-plugin.config.mts in qualsiasi momento:

aws-nx-plugin.config.mts
export default {
packageManager: {
catalogs: false,
},
} satisfies AwsNxPluginConfig;

Con i cataloghi 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à.

Se preferisci dichiarare ogni dipendenza solo nel package.json radice (nessuna dichiarazione di dipendenze per progetto), disattiva la regola di lint nel biome.json del workspace:

biome.json
{
"linter": {
"rules": {
"correctness": {
"noUndeclaredDependencies": "off"
}
}
}
}

I progetti risolvono i pacchetti installati nella radice al momento del build, quindi tutto viene comunque compilato — rinunci ai manifest per progetto come registrazione accurata delle dipendenze di ogni progetto (il che è importante se successivamente pubblichi un progetto o dividi il repository).

Quando usi il tuo progetto TypeScript come codice runtime (ad esempio come handler per una funzione AWS Lambda), è consigliabile utilizzare uno strumento come Rolldown per raggruppare il tuo progetto, poiché questo può fare tree-shake per garantire che solo le dipendenze a cui il tuo progetto fa effettivamente riferimento siano incluse.

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:

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',
codeSplitting: false,
},
},
]);

Il tuo progetto TypeScript è configurato con un target build (definito in project.json), che puoi eseguire tramite:

Terminal window
pnpm nx build <project-name>

Dove <project-name> è il nome completo del tuo progetto.

Il target build compilerà, eseguirà il lint e testerà il tuo progetto.

L’output del build può essere trovato nella cartella dist radice nel tuo workspace, all’interno di una directory per il tuo pacchetto e target, ad esempio dist/packages/<my-library>/tsc

Per fare il build di tutti i progetti nel tuo workspace, esegui:

Terminal window
pnpm nx run-many --target build

Oppure usa il comando abbreviato:

Terminal window
pnpm build

Vitest è configurato per testare il tuo progetto.

I test dovrebbero essere scritti in file .spec.ts o .test.ts, co-locati nella cartella src del tuo progetto.

Ad 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.

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

I test verranno eseguiti come parte del target build per il tuo progetto, ma puoi anche eseguirli separatamente eseguendo il target test:

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

Terminal window
pnpm nx test <project-name> -- -t 'sayHello'

I progetti TypeScript usano Biome per il linting e la formattazione. Biome è configurato nel file biome.json della radice del workspace — le modifiche a questo si applicano a tutti i progetti TypeScript nel tuo workspace e garantiscono coerenza.

Per invocare il linter per controllare il tuo progetto, puoi eseguire il target lint.

Terminal window
pnpm nx lint <project-name>

La maggior parte dei problemi di linting o formattazione può essere corretta automaticamente eseguendo con l’argomento --configuration=fix.

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

Allo stesso modo, se desideri correggere tutti i problemi di lint in tutti i pacchetti nel tuo workspace, puoi eseguire:

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

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 un build con la configurazione skip-lint:

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

Questo salta completamente il target lint durante il build.