Proyectos TypeScript
El generador de proyectos TypeScript se puede utilizar para crear una biblioteca o aplicación moderna de TypeScript configurada con mejores prácticas como ECMAScript Modules (ESM), referencias de proyecto de TypeScript, Vitest para ejecutar pruebas y Biome para linting y formateo.
Generar un Proyecto TypeScript
Sección titulada «Generar un Proyecto TypeScript»Puedes generar un nuevo proyecto TypeScript de dos maneras:
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#projectTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
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- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - ts#project - Complete los parámetros requeridos
- Haga clic en
Generate
Opciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| name Requerido | string | - | Nombre del proyecto TypeScript |
| directory | string | packages | Directorio padre donde se coloca la biblioteca. |
| subDirectory | string | - | El subdirectorio donde se coloca la biblioteca. Por defecto es el nombre de la biblioteca. |
| preferInstallDependencies | boolean | true | Si se prefiere instalar las dependencias después de que se ejecute el generador. Establecer en false para diferir la instalación al ejecutar múltiples generadores en lote (la instalación aún se ejecuta si es necesaria para que los generadores subsecuentes puedan calcular el grafo de proyectos de Nx); instalar una vez al final. |
Salida del Generador
Sección titulada «Salida del Generador»El generador creará la siguiente estructura de proyecto en el directorio <directory>/<name>:
Directoriosrc Código fuente TypeScript
- index.ts
- package.json Manifiesto del proyecto que define el nombre del paquete y las dependencias del proyecto
- project.json Configuración del proyecto y objetivos de compilación
- tsconfig.json Configuración base de TypeScript para este proyecto (extiende tsconfig.base.json de la raíz del workspace)
- tsconfig.lib.json Configuración de TypeScript para tu biblioteca (tu código fuente de runtime o empaquetado)
- tsconfig.spec.json Configuración de TypeScript para tus pruebas
- vitest.config.mts Configuración para Vitest
También notarás algunos cambios en los siguientes archivos en la raíz de tu workspace:
- nx.json La configuración de Nx se actualiza para configurar el plugin @nx/js/typescript para tu proyecto
- tsconfig.base.json se configura un alias de TypeScript para tu proyecto para que pueda ser importado por otros proyectos en tu workspace
- tsconfig.json se agrega una referencia de proyecto TypeScript para tu proyecto
Escribir Código Fuente TypeScript
Sección titulada «Escribir Código Fuente TypeScript»Agrega tu código TypeScript en el directorio src.
Sintaxis de Importación ESM
Sección titulada «Sintaxis de Importación ESM»Dado que tu proyecto TypeScript es un Módulo ES, asegúrate de escribir tus declaraciones de importación con la sintaxis ESM correcta, haciendo referencia explícita a la extensión del archivo:
import { sayHello } from './hello.js';Exportar para Otros Proyectos TypeScript
Sección titulada «Exportar para Otros Proyectos TypeScript»El punto de entrada para tu proyecto TypeScript es src/index.ts. Puedes agregar exportaciones aquí para cualquier cosa que desees que otros proyectos puedan importar:
export { sayHello } from './hello.js';export * from './algorithms/index.js';Importar el Código de tu Biblioteca en Otros Proyectos
Sección titulada «Importar el Código de tu Biblioteca en Otros Proyectos»Los alias de TypeScript para tu proyecto están configurados en el tsconfig.base.json de tu workspace, lo que te permite hacer referencia a tu proyecto TypeScript desde otros proyectos TypeScript:
import { sayHello } from '@my-scope/my-library';Cuando agregues una declaración de importación para un nuevo proyecto en tu workspace por primera vez, probablemente verás un error en tu IDE similar al siguiente:
Error de importación
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)Esto se debe a que aún no se ha configurado una referencia de proyecto, y el proyecto importado aún no se ha declarado como una dependencia del workspace en el package.json de tu proyecto.
Tu workspace está configurado con generadores de sincronización que gestionan ambos por ti, por lo que no necesitas configurarlos manualmente. Simplemente ejecuta el siguiente comando y Nx agregará la configuración requerida:
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!El generador de sincronización de TypeScript de Nx agrega la referencia de proyecto, y el generador ts#sync del plugin declara el proyecto importado en el package.json de tu proyecto (workspace:* donde el gestor de paquetes soporta el protocolo workspace, * en npm y yarn classic), por lo que el gestor de paquetes enlaza el proyecto local en la instalación. Después de esto, el error en tu IDE debería desaparecer y estarás listo para usar tu biblioteca.
Mantener los Alias de Ruta Sincronizados
Sección titulada «Mantener los Alias de Ruta Sincronizados»Si agregas entradas personalizadas de compilerOptions.paths en el tsconfig.json de un proyecto, TypeScript deja de heredar los alias del workspace definidos en tsconfig.base.json. El generador oculto ts#sync se ejecuta antes del objetivo compile (configurado en nx.json) para copiar cualquier alias base faltante en los archivos tsconfig.json, tsconfig.lib.json y tsconfig.app.json que ya declaran paths. Para optar por no participar, elimina @aws/nx-plugin:ts#sync de targetDefaults.compile.syncGenerators en nx.json.
Dependencias
Sección titulada «Dependencias»Cada proyecto TypeScript declara sus dependencias de runtime de terceros en su propio package.json. Las herramientas de compilación y prueba compartidas entre proyectos se definen en el package.json raíz.
Para agregar una dependencia de runtime a un proyecto, instálala en ese proyecto:
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-libraryTambién puedes ejecutar el comando simple add/install de tu gestor de paquetes desde dentro del directorio del proyecto.
Para agregar una herramienta de desarrollo compartida, instálala en la raíz 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-toolCatálogos
Sección titulada «Catálogos»Para gestores de paquetes que soportan catálogos (pnpm, yarn y bun), los generadores registran cada versión en el catálogo y la referencian con el protocolo catalog: (ej. "zod": "catalog:"), por lo que el catálogo es la única fuente de verdad para las versiones independientemente de qué proyecto declare la dependencia. Esto te ayuda a seguir una política de versión única, evitando conflictos de tipos y múltiples copias de paquetes en los bundles de despliegue.
Cuando agregues una nueva dependencia tú mismo, mantenla también en el catálogo:
El workspace establece catalogMode: strict, por lo que pnpm add registra la versión en el catálogo y la referencia automáticamente — sin pasos adicionales.
pnpm add some-npm-package --filter my-libraryEl protocolo catalog: de yarn solo referencia una entrada de catálogo existente — no puede crear una — así que registra la versión primero.
-
Agrega la versión bajo
catalogen.yarnrc.yml:.yarnrc.yml catalog:some-npm-package: ^1.0.0 -
Refiérela desde el proyecto:
Ventana de terminal yarn workspace @my-scope/my-library add some-npm-package@catalog:
El protocolo catalog: de bun solo referencia una entrada de catálogo existente — no puede crear una — así que registra la versión primero.
-
Agrega la versión bajo
catalogen elpackage.jsonraíz:package.json {"catalog": {"some-npm-package": "^1.0.0"}} -
Refiérela desde el proyecto:
Ventana de terminal bun add some-npm-package@catalog: --cwd packages/my-library
Optar por no usar catálogos
Sección titulada «Optar por no usar catálogos»Los catálogos están habilitados por defecto. Para desactivarlos, crea tu 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 falseO configúralo en aws-nx-plugin.config.mts en cualquier momento:
export default { packageManager: { catalogs: false, },} satisfies AwsNxPluginConfig;Con los catálogos deshabilitados, los generadores escriben las versiones de dependencias directamente en el package.json de cada proyecto, y mantener las versiones alineadas entre proyectos es tu responsabilidad.
Declarar todas las dependencias en la raíz
Sección titulada «Declarar todas las dependencias en la raíz»Si prefieres declarar cada dependencia solo en el package.json raíz (sin declaraciones de dependencias por proyecto), desactiva la regla de lint en el biome.json del workspace:
{ "linter": { "rules": { "correctness": { "noUndeclaredDependencies": "off" } } }}Los proyectos resuelven los paquetes instalados en la raíz en tiempo de compilación, por lo que todo sigue compilándose — renuncias a los manifiestos por proyecto como un registro preciso de las dependencias de cada proyecto (lo cual importa si luego publicas un proyecto o divides el repositorio).
Código de Runtime
Sección titulada «Código de Runtime»Cuando uses tu proyecto TypeScript como código de runtime (por ejemplo, como el handler para una función AWS Lambda), se recomienda que uses una herramienta como Rolldown para empaquetar tu proyecto, ya que esto puede hacer tree-shaking para asegurar que solo se incluyan las dependencias que tu proyecto realmente referencia.
Puedes lograr esto agregando un objetivo como el siguiente a tu archivo project.json:
{ ... "targets": { ... "bundle": { "cache": true, "executor": "nx:run-commands", "outputs": ["{workspaceRoot}/dist/packages/my-library/bundle"], "options": { "command": "rolldown -c rolldown.config.ts" } }, },}Y agregando el archivo rolldown.config.ts de la siguiente manera:
import { defineConfig } from 'rolldown';
export default defineConfig([ { input: 'src/index.ts', output: { file: '../../dist/packages/my-library/bundle/index.js', format: 'cjs', codeSplitting: false, }, },]);Compilación
Sección titulada «Compilación»Tu proyecto TypeScript está configurado con un objetivo build (definido en project.json), que puedes ejecutar mediante:
pnpm nx build <project-name>yarn nx build <project-name>npx nx build <project-name>bunx nx build <project-name>Donde <project-name> es el nombre completamente calificado de tu proyecto.
El objetivo build compilará, hará lint y probará tu proyecto.
La salida de compilación se puede encontrar en la carpeta dist raíz en tu workspace, dentro de un directorio para tu paquete y objetivo, por ejemplo dist/packages/<my-library>/tsc
Para compilar todos los proyectos en tu workspace, ejecuta:
pnpm nx run-many --target buildyarn nx run-many --target buildnpx nx run-many --target buildbunx nx run-many --target buildO usa el comando abreviado:
pnpm buildyarn buildnpm run buildbun buildPruebas
Sección titulada «Pruebas»Vitest está configurado para probar tu proyecto.
Escribir Pruebas
Sección titulada «Escribir Pruebas»Las pruebas deben escribirse en archivos .spec.ts o .test.ts, co-ubicados en la carpeta src de tu proyecto.
Por ejemplo:
Directoriosrc
- hello.ts Código fuente de la biblioteca
- hello.spec.ts Pruebas para hello.ts
Vitest proporciona sintaxis similar a Jest para definir pruebas, con utilidades como describe, it, test y expect.
import { sayHello } from './hello.js';
describe('sayHello', () => {
it('should greet the caller', () => { expect(sayHello('Darth Vader')).toBe('Hello, Darth Vader!'); });
});Para más detalles sobre cómo escribir pruebas, y características como simular dependencias, consulta la documentación de Vitest
Ejecutar Pruebas
Sección titulada «Ejecutar Pruebas»Las pruebas se ejecutarán como parte del objetivo build para tu proyecto, pero también puedes ejecutarlas por separado ejecutando el objetivo test:
pnpm nx test <project-name>yarn nx test <project-name>npx nx test <project-name>bunx nx test <project-name>Puedes ejecutar una prueba individual o un conjunto de pruebas usando la bandera -t de Vitest. Pásala después de un separador -- para que Nx la reenvíe a Vitest en lugar de consumirla como su propia opción --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
Sección titulada «Linting»Los proyectos TypeScript usan Biome para linting y formateo. Biome está configurado en el archivo biome.json de la raíz del workspace — los cambios a este se aplican a todos los proyectos TypeScript en tu workspace y aseguran consistencia.
Ejecutar el Linter
Sección titulada «Ejecutar el Linter»Para invocar el linter para verificar tu proyecto, puedes ejecutar el objetivo lint.
pnpm nx lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>Corregir Problemas de Lint
Sección titulada «Corregir Problemas de Lint»La mayoría de los problemas de linting o formateo se pueden corregir automáticamente ejecutando con el argumento --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 manera similar, si deseas corregir todos los problemas de lint en todos los paquetes de tu workspace, puedes ejecutar:
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=fixOmitir Problemas de Lint
Sección titulada «Omitir Problemas de Lint»Para evitar que los problemas de linting te ralenticen durante el desarrollo (particularmente si tienes problemas no auto-corregibles en tu proyecto), puedes ejecutar una compilación con la configuración 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-lintEsto omite el objetivo lint por completo durante la compilación.