Proyectos de TypeScript
El generador de proyectos TypeScript se puede utilizar para crear una biblioteca o aplicación moderna TypeScript configurada 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.
Generar un proyecto de TypeScript
Sección titulada «Generar un proyecto de 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#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-runOpciones
Sección titulada «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
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
- 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 del workspace)
- tsconfig.lib.json Configuración TypeScript para tu biblioteca (código en tiempo 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 permitiendo su importación desde otros proyectos
- tsconfig.json Se añade una referencia de proyecto TypeScript para tu proyecto
Escribiendo código TypeScript
Sección titulada «Escribiendo código TypeScript»Añade tu código TypeScript en el directorio src.
Sintaxis de importación ESM
Sección titulada «Sintaxis de importación ESM»Como tu proyecto TypeScript es un Módulo ES, asegúrate de escribir tus sentencias de importación con la sintaxis ESM correcta, referenciando explícitamente la extensión del archivo:
import { sayHello } from './hello.js';Exportando para otros proyectos TypeScript
Sección titulada «Exportando 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';Importando tu biblioteca en otros proyectos
Sección titulada «Importando tu biblioteca en otros proyectos»Los alias de TypeScript para tu proyecto están configurados en el tsconfig.base.json del workspace, permitiéndote 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, probablemente verás 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 de sincronización de TypeScript de Nx, evitando que necesites configurar manualmente las referencias. Simplemente ejecuta el siguiente comando y Nx añadirá la configuración requerida:
pnpm nx syncyarn nx syncnpx nx syncbunx nx syncDespués de esto, el error en tu IDE debería desaparecer y estarás listo para usar tu biblioteca.
Dependencias
Sección titulada «Dependencias»Notarás que tu proyecto TypeScript no tiene archivo package.json, lo cual puede ser inesperado si estás acostumbrado a monorepos TypeScript tradicionales.
Para añadir una dependencia para cualquier paquete TypeScript en tu monorepo, simplemente añádela al package.json en la raíz de tu workspace. Puedes hacer esto vía línea de comandos para tu gestor de paquetes:
pnpm add -w some-npm-packageyarn add some-npm-packagenpm install --legacy-peer-deps some-npm-packagebun install some-npm-packageLa dependencia estará entonces disponible para cualquier proyecto TypeScript en tu workspace.
Código en tiempo de ejecución
Sección titulada «Código en tiempo de ejecución»Cuando uses tu proyecto TypeScript como código en tiempo de ejecución (por ejemplo como handler para una función AWS Lambda), se recomienda usar una herramienta como Rolldown para empaquetar tu proyecto, ya que puede realizar tree-shake para incluir solo las dependencias realmente usadas.
Puedes lograr esto añadiendo un objetivo como el siguiente en 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 añadiendo el archivo rolldown.config.ts de la siguiente forma:
import { defineConfig } from 'rolldown';
export default defineConfig([ { input: 'src/index.ts', output: { file: '../../dist/packages/my-library/bundle/index.js', format: 'cjs', inlineDynamicImports: true, }, },]);Publicación en NPM
Sección titulada «Publicación 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 tu proyecto utiliza. Dado que en tiempo de compilación tu proyecto resuelve dependencias instaladas vía el package.json raíz del workspace, se recomienda configurar el Plugin ESLint de Verificación de Dependencias de Nx para asegurar que el package.json publicado incluye todas las dependencias usadas.
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 run <project-name>:buildyarn nx run <project-name>:buildnpx nx run <project-name>:buildbunx nx run <project-name>:buildDonde <project-name> es el nombre completo de tu proyecto.
El objetivo build compilará, linteará y probará tu proyecto.
La salida de compilación 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
Sección titulada «Pruebas»Vitest está configurado para probar tu proyecto.
Escribiendo pruebas
Sección titulada «Escribiendo pruebas»Las pruebas deben escribirse en archivos .spec.ts o .test.ts, ubicados junto al código 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 una 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 mock de dependencias, consulta la documentación de Vitest
Ejecutando pruebas
Sección titulada «Ejecutando pruebas»Las pruebas se ejecutarán como parte del objetivo build de tu proyecto, pero también puedes ejecutarlas por separado mediante el objetivo test:
pnpm nx run <project-name>:testyarn nx run <project-name>:testnpx nx run <project-name>:testbunx nx run <project-name>:testPuedes ejecutar una prueba individual o un conjunto de pruebas usando 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
Sección titulada «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 aquí aplicarán a todos los proyectos TypeScript y asegurarán consistencia.
Igualmente, puedes configurar Prettier en el archivo .prettierrc raíz.
Ejecutando el linter
Sección titulada «Ejecutando el linter»Para invocar el linter y verificar tu proyecto, ejecuta el objetivo lint:
pnpm nx run <project-name>:lintyarn nx run <project-name>:lintnpx nx run <project-name>:lintbunx nx run <project-name>:lintCorrigiendo problemas de lint
Sección titulada «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=fixyarn nx run <project-name>:lint --configuration=fixnpx nx run <project-name>:lint --configuration=fixbunx nx run <project-name>:lint --configuration=fixSimilarmente, si quieres 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=fix