Proyectos de TypeScript
El generador de proyectos TypeScript permite crear bibliotecas o aplicaciones modernas con TypeScript configuradas con mejores prácticas como Módulos ECMAScript (ESM), referencias de proyecto de TypeScript, Vitest para ejecutar pruebas y ESLint para análisis estático.
Uso
Generar un proyecto TypeScript
Puedes generar un nuevo proyecto TypeScript de dos formas:
- 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
pnpm nx g @aws/nx-plugin:ts#project
yarn nx g @aws/nx-plugin:ts#project
npx nx g @aws/nx-plugin:ts#project
bunx nx g @aws/nx-plugin:ts#project
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
pnpm nx g @aws/nx-plugin:ts#project --dry-run
yarn nx g @aws/nx-plugin:ts#project --dry-run
npx nx g @aws/nx-plugin:ts#project --dry-run
bunx nx g @aws/nx-plugin:ts#project --dry-run
Opciones
Parámetro | Tipo | Predeterminado | Descripción |
---|---|---|---|
name Requerido | string | - | TypeScript project name |
directory | string | packages | Parent directory where the library is placed. |
subDirectory | string | - | The sub directory the lib is placed in. By default this is the library name. |
Salida del generador
El generador creará la siguiente estructura de proyecto en el directorio <directory>/<name>
:
Directorysrc Código fuente TypeScript
- index.ts
- project.json Configuración del proyecto y objetivos de build
- tsconfig.json Configuración base de TypeScript para este proyecto (extiende tsconfig.base.json del workspace)
- tsconfig.lib.json Configuración TypeScript para tu biblioteca (código de ejecución o empaquetado)
- tsconfig.spec.json Configuración TypeScript para tus pruebas
- vite.config.ts Configuración para Vitest
- eslint.config.mjs Configuración para ESLint
También notarás 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 TypeScript para tu proyecto para que pueda ser importado por otros proyectos
- tsconfig.json Se añade una referencia de proyecto TypeScript para tu proyecto
Escribiendo código TypeScript
Añade tu código TypeScript en el directorio src
.
Sintaxis de importación ESM
Como tu proyecto TypeScript es un Módulo ES, asegúrate de escribir las sentencias de importación con la sintaxis ESM correcta, incluyendo explícitamente la extensión del archivo:
import { sayHello } from './hello.js';
Exportar para otros proyectos TypeScript
El punto de entrada de tu proyecto TypeScript es src/index.ts
. Puedes añadir exports aquí para cualquier elemento que quieras que otros proyectos puedan importar:
export { sayHello } from './hello.js';export * from './algorithms/index.js';
Importar tu biblioteca en otros proyectos
Los alias de TypeScript para tu proyecto se configuran en el archivo tsconfig.base.json
del workspace, permitiendo referenciar tu proyecto TypeScript desde otros proyectos:
import { sayHello } from ':my-scope/my-library';
Cuando añadas una sentencia de importación para un nuevo proyecto en tu workspace por primera vez, es probable que veas un error en tu IDE similar a este:
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 ocurre porque no se ha configurado una referencia de proyecto.
Los proyectos TypeScript vienen configurados con el generador Nx TypeScript Sync, evitando que necesites configurar manualmente las referencias. Simplemente ejecuta el siguiente comando y Nx añadirá la configuración requerida:
pnpm nx sync
yarn nx sync
npx nx sync
bunx nx sync
Después de esto, el error en tu IDE debería desaparecer y podrás usar tu biblioteca.
Dependencias
Notarás que tu proyecto TypeScript no tiene archivo package.json
, lo cual puede resultar inesperado si estás acostumbrado a monorepos TypeScript tradicionales.
Para añadir una dependencia a cualquier paquete TypeScript en tu monorepo, simplemente añádela al package.json
en la raíz de tu workspace. Puedes hacerlo vía línea de comandos:
pnpm add -w some-npm-package
yarn add some-npm-package
npm install --legacy-peer-deps some-npm-package
bun install some-npm-package
La dependencia estará disponible para cualquier proyecto TypeScript en tu workspace.
Código de ejecución
Cuando uses tu proyecto TypeScript como código de ejecución (por ejemplo como handler de una función AWS Lambda), se recomienda usar una herramienta como esbuild
para empaquetar tu proyecto, ya que permite tree-shaking para incluir solo las dependencias usadas.
Puedes lograrlo añadiendo un objetivo como este en tu project.json
:
{ ... "targets": { ... "bundle": { "cache": true, "executor": "nx:run-commands", "outputs": ["{workspaceRoot}/dist/packages/my-library/bundle"], "options": { "command": "esbuild packages/my-library/src/index.ts --bundle --outfile=dist/packages/my-library/bundle/index.js --platform=node --format=cjs" } }, },}
Publicar en NPM
Si vas a publicar tu proyecto TypeScript en NPM, debes crear un archivo package.json
para él.
Este debe declarar las dependencias que usa tu proyecto. Como en tiempo de build las dependencias se resuelven desde el package.json
raíz, se recomienda configurar el plugin ESLint de NX para verificación de dependencias para asegurar que tu package.json
publicado incluye todas las dependencias usadas.
Construcción
Tu proyecto TypeScript tiene un objetivo build
(definido en project.json
) que puedes ejecutar con:
pnpm nx run <project-name>:build
yarn nx run <project-name>:build
npx nx run <project-name>:build
bunx nx run <project-name>:build
Donde <project-name>
es el nombre completo de tu proyecto.
El objetivo build
compilará, linteará y probará tu proyecto.
La salida del build se encuentra en la carpeta dist
raíz de tu workspace, dentro de un directorio para tu paquete y objetivo, por ejemplo dist/packages/<my-library>/tsc
Pruebas
Vitest está configurado para probar tu proyecto.
Escribiendo pruebas
Las pruebas deben escribirse en archivos .spec.ts
o .test.ts
, ubicados junto al código en la carpeta src
.
Ejemplo:
Directorysrc
- hello.ts Código de la biblioteca
- hello.spec.ts Pruebas para hello.ts
Vitest provee sintaxis similar a Jest para definir pruebas, con utilidades como describe
, it
, test
y expect
.
import { sayHello } from './hello.js';
describe('sayHello', () => {
it('debe saludar al llamador', () => { expect(sayHello('Darth Vader')).toBe('Hello, Darth Vader!'); });
});
Para más detalles sobre cómo escribir pruebas y características como mocks, consulta la documentación de Vitest
Ejecutando pruebas
Las pruebas se ejecutan como parte del objetivo build
, pero también puedes ejecutarlas por separado con el objetivo test
:
pnpm nx run <project-name>:test
yarn nx run <project-name>:test
npx nx run <project-name>:test
bunx nx run <project-name>:test
Puedes ejecutar una prueba individual con el flag -t
:
pnpm nx run <project-name>:test -t 'sayHello'
yarn nx run <project-name>:test -t 'sayHello'
npx nx run <project-name>:test -t 'sayHello'
bunx nx run <project-name>:test -t 'sayHello'
Linting
Los proyectos TypeScript usan ESLint para linting junto con Prettier para formateo.
Recomendamos configurar ESLint en el archivo eslint.config.mjs
raíz del workspace, ya que los cambios aplicarán a todos los proyectos y garantizarán consistencia.
De igual forma, puedes configurar Prettier en el archivo .prettierrc
raíz.
Ejecutando el linter
Para ejecutar el linter y verificar tu proyecto, usa el objetivo lint
:
pnpm nx run <project-name>:lint
yarn nx run <project-name>:lint
npx nx run <project-name>:lint
bunx nx run <project-name>:lint
Corrigiendo problemas de lint
La mayoría de problemas de lint o formateo pueden corregirse automáticamente. Puedes indicar a ESLint que corrija los problemas ejecutando con el argumento --configuration=fix
:
pnpm nx run <project-name>:lint --configuration=fix
yarn nx run <project-name>:lint --configuration=fix
npx nx run <project-name>:lint --configuration=fix
bunx nx run <project-name>:lint --configuration=fix
Para corregir todos los problemas en todos los paquetes de tu workspace, ejecuta:
pnpm nx run-many --target lint --all --configuration=fix
yarn nx run-many --target lint --all --configuration=fix
npx nx run-many --target lint --all --configuration=fix
bunx nx run-many --target lint --all --configuration=fix