Sitio web de React
Este generador crea un nuevo sitio web en React configurado con shadcn/ui por defecto, junto con la infraestructura de AWS CDK o Terraform para desplegar tu sitio web en la nube como un sitio estático alojado en S3, servido por CloudFront y protegido por WAF.
La aplicación generada utiliza Vite como herramienta de construcción y empaquetado. Emplea TanStack Router para enrutamiento tipado.
Generar un sitio web React
Sección titulada «Generar un sitio web React»Puedes generar un nuevo sitio web React 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#website - Complete los parámetros requeridos
- Haga clic en
Generate
pnpm nx g @aws/nx-plugin:ts#websiteyarn nx g @aws/nx-plugin:ts#websitenpx nx g @aws/nx-plugin:ts#websitebunx nx g @aws/nx-plugin:ts#websiteTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
pnpm nx g @aws/nx-plugin:ts#website --dry-runyarn nx g @aws/nx-plugin:ts#website --dry-runnpx nx g @aws/nx-plugin:ts#website --dry-runbunx nx g @aws/nx-plugin:ts#website --dry-runOpciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| name Requerido | string | - | El nombre de la aplicación. |
| framework | react | react | El framework frontend a utilizar. |
| directory | string | packages | El directorio de la nueva aplicación. |
| subDirectory | string | - | El subdirectorio en el que se coloca el proyecto. Por defecto, este es el nombre del proyecto. |
| ux | none | cloudscape | shadcn | shadcn | El proveedor de UX preferido. |
| tailwind | boolean | true | Habilitar TailwindCSS para estilos basados en utilidades. |
| tanstackRouter | boolean | true | Habilitar Tanstack router para enrutamiento con seguridad de tipos. |
| infra | cloudfront-s3 | none | cloudfront-s3 | El tipo de infraestructura con la que desplegar tu sitio web. |
| iac | inherit | cdk | terraform | inherit | El proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial. |
| preferInstallDependencies | boolean | true | Si se prefiere instalar las dependencias después de que se ejecute el generador. Establece en false para diferir la instalación cuando se ejecutan múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsecuentes puedan calcular el grafo de proyectos de Nx); instala 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>:
- index.html Punto de entrada HTML
- public Assets estáticos
Directoriosrc
- main.tsx Punto de entrada de la aplicación con configuración de React
- config.ts Configuración de la aplicación (ej. logo)
Directoriocomponents
- AppLayout Componentes para el layout general y barra de navegación
Directoriohooks
- useAppLayout.tsx Hook para ajustar el AppLayout desde componentes anidados (solo Cloudscape)
Directorioroutes
- index.tsx Ruta (o página) de ejemplo para TanStack Router
- styles.css Estilos globales
- vite.config.mts Configuración de Vite y Vitest
- tsconfig.json Configuración base de TypeScript para código y tests
- tsconfig.app.json Configuración de TypeScript para código fuente
- tsconfig.spec.json Configuración de TypeScript para tests
Infraestructura
Sección titulada «Infraestructura»Dado que este generador proporciona infraestructura como código basada en tu proveedor de iacProvider seleccionado, creará un proyecto en packages/common que incluye los constructos CDK o módulos de Terraform correspondientes.
El proyecto común de infraestructura como código tiene la siguiente estructura:
Directoriopackages/common/constructs
Directoriosrc
Directorioapp/ Constructos para infraestructura específica de un proyecto/generador
- …
Directoriocore/ Constructos genéricos reutilizados por los constructos en
app- …
- index.ts Punto de entrada que exporta los constructos de
app
- project.json Objetivos de compilación y configuración del proyecto
Directoriopackages/common/terraform
Directoriosrc
Directorioapp/ Módulos de Terraform para infraestructura específica de un proyecto/generador
- …
Directoriocore/ Módulos genéricos reutilizados por los módulos en
app- …
- project.json Objetivos de compilación y configuración del proyecto
El generador crea infraestructura como código para desplegar tu sitio web según el iacProvider seleccionado:
Directoriopackages/common/constructs/src
Directorioapp
Directoriostatic-websites
- <name>.ts Infraestructura específica de tu sitio web
Directoriocore
- static-website.ts Construct genérico StaticWebsite
Directoriopackages/common/terraform/src
Directorioapp
Directoriostatic-websites
Directorio<name>
- <name>.tf Módulo específico para tu sitio web
Directoriocore
Directoriostatic-website
- static-website.tf Módulo genérico de sitio web estático
Arquitectura
Sección titulada «Arquitectura»El sitio web desplegado tiene la siguiente arquitectura:
Encabezados de seguridad
Sección titulada «Encabezados de seguridad»La distribución de CloudFront aplica una política de encabezados de respuesta que establece Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options: DENY, Referrer-Policy y una Content-Security-Policy en todas las respuestas.
Se aplica una Content-Security-Policy predeterminada. Restringe scripts y framing para mitigar XSS y clickjacking, mientras permite conexiones HTTPS y WSS para que el sitio web pueda llamar a endpoints de servicios AWS (como API Gateway, Cognito y Bedrock AgentCore) cuyas URLs solo se conocen en tiempo de despliegue. Para ajustar la política (por ejemplo, restringir connect-src a tus orígenes específicos), edita el valor content_security_policy en tu static-website.ts generado (CDK) o static-website.tf (Terraform).
runtime-config.json se sirve con Cache-Control: no-cache para que los navegadores siempre obtengan la configuración más reciente después de un redespliegue, en lugar de usar una copia en caché obsoleta.
Implementando tu sitio web React
Sección titulada «Implementando tu sitio web React»La documentación de React es un buen punto de partida para aprender los fundamentos.
Puedes consultar la documentación de Cloudscape para detalles sobre los componentes disponibles y su uso.
Puedes consultar la documentación de shadcn/ui para detalles sobre los componentes disponibles y su uso.
Crear una ruta/página
Sección titulada «Crear una ruta/página»Tu sitio web incluye TanStack Router configurado por defecto. Esto facilita añadir nuevas rutas:
- Ejecutar el servidor de desarrollo local
- Crear un nuevo archivo
<nombre-pagina>.tsxensrc/routes, donde la posición en el árbol de archivos representa la ruta - Observa que se generan automáticamente un
RouteyRouteComponent. ¡Puedes empezar a construir tu página aquí!
Navegar entre páginas
Sección titulada «Navegar entre páginas»Puedes usar el componente Link o el hook useNavigate para navegar entre páginas:
import { Link, useNavigate } from '@tanstack/react-router';
export const MyComponent = () => { const navigate = useNavigate();
const submit = async () => { const id = await ... // Usar `navigate` para redireccionar después de una acción asíncrona navigate({ to: '/products/$id', { params: { id }} }); };
return ( <> <Link to="/products">Cancelar</Link> <Button onClick={submit}>Enviar</Button> </> )};Para más detalles, consulta la documentación de TanStack Router.
Configuración en tiempo de ejecución
Sección titulada «Configuración en tiempo de ejecución»La configuración de tu infraestructura se provee al sitio web mediante Configuración en Tiempo de Ejecución. Esto permite acceder a detalles como URLs de API que no se conocen hasta el despliegue.
Infraestructura
Sección titulada «Infraestructura»El construct RuntimeConfig de CDK puede usarse para añadir y recuperar configuración. Los constructs generados por generadores @aws/nx-plugin (como ts#trpc-api y py#fast-api) añaden automáticamente valores al RuntimeConfig.
Tu construct CDK del sitio web desplegará el namespace connection de la configuración en tiempo de ejecución como archivo runtime-config.json en la raíz de tu bucket S3.
import { Stack } from 'aws-cdk-lib';import { Construct } from 'constructs';import { MyWebsite, MyApi } from ':my-scope/common-constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string) { super(scope, id);
// El sitio web puede declararse en cualquier punto — la configuración se resuelve de forma diferida new MyWebsite(this, 'MyWebsite');
// Añade automáticamente valores al RuntimeConfig new MyApi(this, 'MyApi', { integrations: MyApi.defaultIntegrations(this).build(), }); }}Con Terraform, la configuración se gestiona mediante módulos runtime-config. Los módulos generados por @aws/nx-plugin (como ts#api y py#api) añaden automáticamente valores a la configuración.
Tu módulo Terraform del sitio web desplegará el namespace connection de la configuración en tiempo de ejecución como archivo runtime-config.json en la raíz de tu bucket S3.
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
# Añade valores a la configuración automáticamentemodule "my_api" { source = "../../common/terraform/src/app/apis/my-api"
asset_bucket_name = module.asset_bucket.bucket_name}
# Despliega la configuración en runtime-config.json automáticamentemodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }
# Garantiza que la API se despliega primero para añadir a la configuración depends_on = [module.my_api]}Código del sitio web
Sección titulada «Código del sitio web»En tu sitio web, usa el hook useRuntimeConfig para obtener valores de la configuración:
import { useRuntimeConfig } from '../hooks/useRuntimeConfig';
const MyComponent = () => { const runtimeConfig = useRuntimeConfig();
// Accede a los valores de la configuración aquí const apiUrl = runtimeConfig.apis.MyApi;};Configuración local
Sección titulada «Configuración local»Al ejecutar el servidor de desarrollo local, necesitarás un archivo runtime-config.json en tu directorio public para que el sitio local conozca las URLs del backend, configuración de identidad, etc.
Tu proyecto incluye un target load:runtime-config para descargar el archivo desde una aplicación desplegada:
pnpm nx run <my-website>:"load:runtime-config"yarn nx run <my-website>:"load:runtime-config"npx nx run <my-website>:"load:runtime-config"bunx nx run <my-website>:"load:runtime-config"Servidor de desarrollo local
Sección titulada «Servidor de desarrollo local»El comando canónico para el desarrollo local es dev, que inicia tu sitio web (y cualquier servidor local para APIs que hayas conectado) con un solo comando:
pnpm nx dev <my-website>yarn nx dev <my-website>npx nx dev <my-website>bunx nx dev <my-website>El target serve también está disponible para cuando necesites controlar cuánto de tu aplicación se ejecuta localmente versus apuntando a infraestructura AWS desplegada. Para una visión general más amplia del desarrollo local a través de proyectos conectados, incluyendo cómo se comporta dev para proyectos con múltiples componentes, consulta la guía de Desarrollo Local.
Target Serve
Sección titulada «Target Serve»El target serve inicia un servidor de desarrollo local para tu sitio web. Este target requiere que hayas desplegado cualquier infraestructura de soporte con la que interactúa el sitio web, y que hayas cargado la configuración de runtime local.
Puedes ejecutar este target con el siguiente comando:
pnpm nx serve <my-website>yarn nx serve <my-website>npx nx serve <my-website>bunx nx serve <my-website>Este target es útil para trabajar en cambios del sitio web mientras apuntas a APIs “reales” desplegadas y otra infraestructura.
Target Dev
Sección titulada «Target Dev»El target dev inicia un servidor de desarrollo local para tu sitio web (con Vite MODE establecido en local-dev), así como iniciando cualquier servidor local para APIs que hayas conectado a tu sitio web mediante el generador Connection.
Cuando tu servidor de sitio web local se ejecuta mediante este target, runtime-config.json se sobrescribe automáticamente para apuntar a las URLs de tu API que se ejecutan localmente.
Puedes ejecutar este target con el siguiente comando:
pnpm nx dev <my-website>yarn nx dev <my-website>npx nx dev <my-website>bunx nx dev <my-website>Este target es útil cuando estás trabajando en tu sitio web y API y deseas iterar rápidamente sin desplegar tu infraestructura.
Autenticación simulada
Cuando se ejecuta en este modo y no hay runtime-config.json presente, si has configurado Autenticación Cognito (mediante el generador ts#website#auth), el inicio de sesión se omitirá y las solicitudes a tus servidores locales no incluirán encabezados de autenticación.
Para habilitar el inicio de sesión y la autenticación para dev, despliega tu infraestructura y carga la configuración de runtime.
Construcción
Sección titulada «Construcción»Puedes construir tu sitio web usando el target build. Esto ejecuta los targets bundle, compile, test y lint, verificando tipos, empaquetando, probando y analizando tu sitio web.
pnpm nx build <my-website>yarn nx build <my-website>npx nx build <my-website>bunx nx build <my-website>El target bundle usa Vite para crear un paquete de producción en el directorio raíz dist/packages/<my-website>/bundle. Este es el artefacto desplegable consumido por la infraestructura de tu sitio web. Puedes ejecutarlo por sí solo:
pnpm nx bundle <my-website>yarn nx bundle <my-website>npx nx bundle <my-website>bunx nx bundle <my-website>Pruebas
Sección titulada «Pruebas»Las pruebas siguen estándares de proyectos TypeScript. Consulta la guía de proyectos TypeScript.
Para pruebas específicas de React, React Testing Library está preinstalado. Consulta su documentación.
Ejecuta pruebas con:
pnpm nx test <my-website>yarn nx test <my-website>npx nx test <my-website>bunx nx test <my-website>Despliegue del sitio web
Sección titulada «Despliegue del sitio web»El generador crea infraestructura CDK o Terraform según tu iacProvider. Úsala para desplegar tu sitio.
Recomendamos usar el generador ts#infra para crear una aplicación CDK.
Usa el construct generado en packages/common/constructs para desplegar:
import { Stack } from 'aws-cdk-lib';import { Construct } from 'constructs';import { MyWebsite } from ':my-scope/common-constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string) { super(scope, id);
new MyWebsite(this, 'MyWebsite'); }}Esto configura:
- Bucket S3 para alojar archivos estáticos
- Distribución CloudFront para entrega global
- Web ACL WAF para protección
- Origin Access Control para acceso seguro
- Despliegue automático de archivos y configuración
Recomendamos usar el generador terraform#project para crear un proyecto Terraform.
Usa el módulo generado en packages/common/terraform para desplegar:
# Desplegar sitio webmodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }}Esto configura:
- Bucket S3 para archivos estáticos
- Distribución CloudFront
- Web ACL WAF (en us-east-1)
- Origin Access Control
- Despliegue automático de archivos y configuración
Conexiones
Sección titulada «Conexiones»Usa el generador connection para integrar este proyecto con otros en tu workspace. Las siguientes conexiones involucran este proyecto:
