Saltearse al contenido

Sitio web de React

Este generador crea un nuevo sitio web en React configurado con CloudScape, 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.

Puedes generar un nuevo sitio web React de dos formas:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - ts#react-website
  5. Complete los parámetros requeridos
    • Haga clic en Generate
    Parámetro Tipo Predeterminado Descripción
    name Requerido string - The name of the application.
    directory string packages The directory of the new application.
    enableTailwind boolean true Enable TailwindCSS for utility-first styling.
    enableTanstackRouter boolean true Enable Tanstack router for type-safe routing.
    iacProvider string Inherit The preferred IaC provider. By default this is inherited from your initial selection.

    El generador creará la siguiente estructura de proyecto en el directorio <directory>/<name>:

    • index.html Punto de entrada HTML
    • public Assets estáticos
    • Directorysrc
      • main.tsx Punto de entrada de la aplicación con configuración de React
      • config.ts Configuración de la aplicación (ej. logo)
      • Directorycomponents
        • AppLayout Componentes para el layout general de CloudScape y barra de navegación
      • Directoryhooks
        • useAppLayout.tsx Hook para ajustar el AppLayout desde componentes anidados
      • Directoryroutes
        • Directorywelcome
          • index.tsx Ruta (o página) de ejemplo para @tanstack/react-router
      • styles.css Estilos globales
    • vite.config.ts 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

    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:

    • Directorypackages/common/constructs
      • Directorysrc
        • Directoryapp/ Constructos para infraestructura específica de un proyecto/generador
        • Directorycore/ 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

    El generador crea infraestructura como código para desplegar tu sitio web según el iacProvider seleccionado:

    • Directorypackages/common/constructs/src
      • Directoryapp
        • Directorystatic-websites
          • <name>.ts Infraestructura específica de tu sitio web
      • Directorycore
        • static-website.ts Construct genérico StaticWebsite

    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.

    Tu sitio CloudScape incluye TanStack Router configurado por defecto. Esto facilita añadir nuevas rutas:

    1. Ejecutar el servidor de desarrollo local
    2. Crear un nuevo archivo <nombre-pagina>.tsx en src/routes, donde la posición en el árbol de archivos representa la ruta
    3. Observa que se generan automáticamente un Route y RouteComponent. ¡Puedes empezar a construir tu página aquí!

    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.

    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.

    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á la configuración como archivo runtime-config.json en la raíz de tu bucket S3.

    packages/infra/src/stacks/application-stack.ts
    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);
    // Añade automáticamente valores al RuntimeConfig
    new MyApi(this, 'MyApi', {
    integrations: MyApi.defaultIntegrations(this).build(),
    });
    // Despliega automáticamente la configuración en runtime-config.json
    new MyWebsite(this, 'MyWebsite');
    }
    }

    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;
    };

    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:

    Terminal window
    pnpm nx run <my-website>:"load:runtime-config"

    Puedes ejecutar un servidor local usando los targets serve o serve-local.

    El target serve inicia un servidor de desarrollo local. Requiere tener desplegada cualquier infraestructura relacionada y haber cargado la configuración local.

    Ejecútalo con:

    Terminal window
    pnpm nx run <my-website>:serve

    Útil para trabajar en cambios del sitio apuntando a APIs reales desplegadas.

    El target serve-local inicia un servidor local (con Vite MODE en serve-local) e inicia servidores locales para APIs conectadas mediante el generador API Connection.

    En este modo, runtime-config.json se sobrescribe automáticamente para apuntar a URLs locales de APIs.

    Ejecútalo con:

    Terminal window
    pnpm nx run <my-website>:serve-local

    Útil para desarrollo conjunto del sitio y API sin desplegar infraestructura.

    En este modo, si no hay runtime-config.json y usas Autenticación Cognito (via CloudScape Website Auth), el login se omitirá y las peticiones no incluirán headers de autenticación.

    Para habilitar login en serve-local, despliega tu infraestructura y carga la configuración.

    Construye tu sitio web con el target build. Esto crea un bundle de producción en dist/packages/<my-website>/bundle usando Vite, junto con verificación de tipos y linting.

    Terminal window
    pnpm nx run <my-website>:build

    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:

    Terminal window
    pnpm nx run <my-website>:test

    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:

    packages/infra/src/stacks/application-stack.ts
    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:

    1. Bucket S3 para alojar archivos estáticos
    2. Distribución CloudFront para entrega global
    3. Web ACL WAF para protección
    4. Origin Access Control para acceso seguro
    5. Despliegue automático de archivos y configuración