Salta ai contenuti

Sito Web React

Filter this guidePick generator option values to hide sections that don't apply.

Questo generatore crea un nuovo sito web React con shadcn/ui configurato di default, insieme all’infrastruttura AWS CDK o Terraform per distribuire il tuo sito web nel cloud come sito web statico ospitato in S3, servito da CloudFront e protetto da WAF.

L’applicazione generata utilizza Vite come strumento di build e bundler. Utilizza TanStack Router per il routing type-safe.

Puoi generare un nuovo sito web React in due modi:

Terminal window
pnpm nx g @aws/nx-plugin:ts#website --framework=react
Puoi anche eseguire una prova per vedere quali file verrebbero modificati
Terminal window
pnpm nx g @aws/nx-plugin:ts#website --framework=react --dry-run
ParametroTipoPredefinitoDescrizione
name Obbligatoriostring-Il nome dell'applicazione.
framework reactreactIl framework frontend da utilizzare.
directory stringpackagesLa directory della nuova applicazione.
subDirectory string-La sotto-directory in cui viene posizionato il progetto. Per impostazione predefinita corrisponde al nome del progetto.
ux none | cloudscape | shadcnshadcnIl provider UX preferito.
tailwind booleantrueAbilita TailwindCSS per lo styling utility-first.
tanstackRouter booleantrueAbilita Tanstack router per il routing type-safe.
infra cloudfront-s3 | nonecloudfront-s3Il tipo di infrastruttura con cui distribuire il tuo sito web.
iac inherit | cdk | terraforminheritIl provider IaC preferito. Per impostazione predefinita viene ereditato dalla selezione iniziale.
preferInstallDependencies booleantrueSe preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine.

Il generatore creerà la seguente struttura di progetto nella directory <directory>/<name>:

  • index.html HTML entry point
  • public Static assets
  • Directorysrc
    • main.tsx Application entry point with React setup
    • config.ts Application configuration (eg. logo)
    • Directorycomponents
      • AppLayout Components for the overall layout and navigation bar
    • Directoryhooks
      • useAppLayout.tsx Hook for adjusting the AppLayout from nested components (Cloudscape only)
    • Directoryroutes
      • index.tsx Example route (or page) for TanStack Router
    • styles.css Global styles
  • vite.config.mts Vite and Vitest configuration
  • tsconfig.json Base TypeScript configuration for source and tests
  • tsconfig.app.json TypeScript configuration for source code
  • tsconfig.spec.json TypeScript configuration for tests
  • package.json Project manifest defining the project’s package name and dependencies

Poiché questo generatore fornisce infrastruttura come codice basata sul tuo iac scelto, creerà un progetto in packages/common che include i costrutti CDK o i moduli Terraform pertinenti.

Il progetto comune di infrastruttura come codice è strutturato come segue:

  • Directorypackages/common/constructs
    • Directorysrc
      • Directoryapp/ Constructs for infrastructure specific to a project/generator
      • Directorycore/ Generic constructs which are reused by constructs in app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

Il generatore crea infrastruttura come codice per distribuire il tuo sito web in base al tuo iac selezionato:

  • Directorypackages/common/constructs/src
    • Directoryapp
      • Directorystatic-websites
        • <name>.ts Infrastructure specific to your website
    • Directorycore
      • static-website.ts Generic StaticWebsite construct

Il sito web distribuito ha la seguente architettura:

Web BrowserWAFCloudFrontStatic Assets(S3)

La documentazione React è un buon punto di partenza per imparare le basi della costruzione con React.

ux = cloudscape

Puoi fare riferimento alla documentazione Cloudscape per dettagli sui componenti disponibili e su come utilizzarli.

ux = shadcn

Puoi fare riferimento alla documentazione shadcn/ui per dettagli sui componenti disponibili e su come utilizzarli.

Il tuo sito web viene fornito con TanStack Router configurato di default. Questo rende facile aggiungere nuove route:

  1. Esegui il server di sviluppo locale
  2. Crea un nuovo file <page-name>.tsx in src/routes, con la sua posizione nell’albero dei file che rappresenta il percorso
  3. Nota che un Route e RouteComponent vengono generati automaticamente per te. Puoi iniziare a costruire la tua pagina qui!

Puoi utilizzare il componente Link o l’hook useNavigate per navigare tra le pagine:

import { Link, useNavigate } from '@tanstack/react-router';
export const MyComponent = () => {
const navigate = useNavigate();
const submit = async () => {
const id = await ...
// Use `navigate` for redirecting after some asynchronous action
navigate({ to: '/products/$id', { params: { id }} });
};
return (
<>
<Link to="/products">Cancel</Link>
<Button onClick={submit}>Submit</Button>
</>
)
};

Per maggiori dettagli, consulta la documentazione di TanStack Router.

Il generatore di siti web React crea infrastruttura come codice CDK o Terraform in base al tuo iac selezionato. Puoi utilizzarla per distribuire il tuo sito web.

Per distribuire il tuo sito web, consigliamo di utilizzare il generatore ts#infra per creare un’applicazione CDK.

Puoi utilizzare il costrutto CDK generato per te in packages/common/constructs per distribuire il tuo sito web.

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

Questo configura:

  1. Un bucket S3 per ospitare i file del tuo sito web statico
  2. Distribuzione CloudFront per la distribuzione globale dei contenuti
  3. WAF Web ACL per la protezione della sicurezza
  4. Origin Access Control per l’accesso sicuro a S3
  5. Distribuzione automatica dei file del sito web e della configurazione runtime

La distribuzione CloudFront applica una policy di header di risposta che imposta Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options: DENY, Referrer-Policy e una Content-Security-Policy su tutte le risposte.

Viene applicata una Content-Security-Policy predefinita. Essa limita gli script e il framing per mitigare XSS e clickjacking, consentendo al contempo connessioni HTTPS e WSS in modo che il sito web possa chiamare gli endpoint dei servizi AWS (come API Gateway, Cognito e Bedrock AgentCore) i cui URL sono noti solo al momento della distribuzione. Per regolare la policy (ad esempio per restringere connect-src alle tue origini specifiche), modifica il valore content_security_policy nel tuo static-website.ts (CDK) o static-website.tf (Terraform) generato.

runtime-config.json viene servito con Cache-Control: no-cache in modo che i browser recuperino sempre la configurazione più recente dopo una ridistribuzione, anziché utilizzare una copia cache obsoleta.

La distribuzione CloudFront è protetta da un AWS WAFv2 Web ACL di default. Il Web ACL utilizza il set di regole predefinito gestito da AWS (AWSManagedRulesCommonRuleSet e AWSManagedRulesKnownBadInputsRuleSet), fornendo protezione contro exploit web comuni inclusi OWASP Top 10.

Per disattivare, imposta enableWaf su false quando crei il tuo sito web:

packages/infra/src/stacks/application-stack.ts
import { Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { MyWebsite, suppressRules } from '@my-scope/common-constructs';
export class ApplicationStack extends Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
const website = new MyWebsite(this, 'MyWebsite', {
enableWaf: false,
});
// Disabling WAF fails the checkov CKV_AWS_68 check ("CloudFront
// Distribution should have WAF enabled"). Suppress it explicitly.
suppressRules(
website.cloudFrontDistribution,
['CKV_AWS_68'],
'WAF is intentionally disabled for this distribution',
);
}
}

Il bucket del sito web, il bucket dei log della distribuzione CloudFront e il gruppo CloudWatch Logs che riceve i loro log di accesso al server sono crittografati con una chiave AWS KMS gestita dal cliente di default. Questa chiave viene creata automaticamente per te, con la rotazione delle chiavi abilitata.

Se desideri utilizzare una configurazione di crittografia diversa, passa le proprietà encryption, encryptionKey e enableKeyRotation quando crei il tuo sito web:

packages/infra/src/stacks/application-stack.ts
import { Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { BucketEncryption } from 'aws-cdk-lib/aws-s3';
import { MyWebsite } from '@my-scope/common-constructs';
export class ApplicationStack extends Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
new MyWebsite(this, 'MyWebsite', {
encryption: BucketEncryption.S3_MANAGED,
});
}
}

Per utilizzare la tua chiave KMS invece di una creata automaticamente, passa encryptionKey:

new MyWebsite(this, 'MyWebsite', {
encryptionKey: myKey,
});

enableKeyRotation (default true) si applica solo alla chiave creata automaticamente, cioè quando encryption è BucketEncryption.KMS (il default) e non viene fornita alcuna encryptionKey:

new MyWebsite(this, 'MyWebsite', {
enableKeyRotation: false,
});

Di default, la distribuzione utilizza il nome di dominio CloudFront predefinito (*.cloudfront.net) e il suo certificato predefinito, che non supporta l’applicazione di una versione TLS minima di 1.2. Per servire il tuo sito web dal tuo dominio, fornisci un certificato ACM (che deve risiedere in us-east-1 per l’uso con CloudFront) e i tuoi nomi di dominio. Viene quindi applicata una versione TLS minima di 1.2 per i visualizzatori:

Passa le proprietà certificate e domainNames quando crei il tuo sito web:

packages/infra/src/stacks/application-stack.ts
import { Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Certificate } from 'aws-cdk-lib/aws-certificatemanager';
import { MyWebsite } from '@my-scope/common-constructs';
export class ApplicationStack extends Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
new MyWebsite(this, 'MyWebsite', {
domainNames: ['www.example.com'],
certificate: Certificate.fromCertificateArn(this, 'Cert',
'arn:aws:acm:us-east-1:123456789012:certificate/...'),
});
}
}

Dovrai anche creare record DNS (ad esempio in Route 53) che puntano il tuo dominio alla distribuzione CloudFront.

La configurazione dalla tua infrastruttura viene fornita al tuo sito web tramite Configurazione runtime. Questo consente al tuo sito web di accedere a dettagli come gli URL delle API che non sono noti fino a quando la tua applicazione non viene distribuita.

Il costrutto CDK RuntimeConfig può essere utilizzato per aggiungere e recuperare la configurazione nella tua infrastruttura CDK. I costrutti CDK generati dai generatori @aws/nx-plugin (come ts#api e py#api) aggiungeranno automaticamente valori appropriati al RuntimeConfig.

Il tuo costrutto CDK del sito web distribuirà il namespace connection della configurazione runtime come file runtime-config.json nella radice del tuo bucket S3.

packages/infra/src/stacks/application-stack.ts
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);
// Website can be declared at any point, since runtime config is resolved lazily
new MyWebsite(this, 'MyWebsite');
// Automatically adds values to the RuntimeConfig
new MyApi(this, 'MyApi', {
integrations: MyApi.defaultIntegrations(this).build(),
});
}
}

Nel tuo sito web, puoi utilizzare l’hook useRuntimeConfig per recuperare valori dalla configurazione runtime:

import { useRuntimeConfig } from '../hooks/useRuntimeConfig';
const MyComponent = () => {
const runtimeConfig = useRuntimeConfig();
// Access values in the runtime config here
const apiUrl = runtimeConfig.apis.MyApi;
};

Quando esegui il server di sviluppo locale, avrai bisogno di un file runtime-config.json nella tua directory public affinché il tuo sito web locale conosca gli URL del backend, la configurazione dell’identità, ecc.

Il tuo progetto del sito web è configurato con un target load-runtime-config che puoi utilizzare per scaricare il file runtime-config.json da un’applicazione distribuita:

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

Il comando canonico per lo sviluppo locale è dev, che avvia il tuo sito web (e qualsiasi server locale per le API a cui lo hai connesso) con un unico comando:

Terminal window
pnpm nx dev <my-website>

Il target serve è disponibile anche per quando hai bisogno di controllare quanto della tua applicazione viene eseguito localmente rispetto al puntamento all’infrastruttura AWS distribuita. Per una panoramica più ampia dello sviluppo locale tra progetti connessi, incluso come si comporta dev per progetti con più componenti, consulta la guida Sviluppo locale.

Il target serve avvia un server di sviluppo locale per il tuo sito web. Questo target richiede che tu abbia distribuito qualsiasi infrastruttura di supporto con cui il sito web interagisce e che tu abbia caricato la configurazione runtime locale.

Puoi eseguire questo target con il seguente comando:

Terminal window
pnpm nx serve <my-website>

Questo target è utile per lavorare sulle modifiche del sito web puntando a API “reali” distribuite e ad altra infrastruttura.

Il target dev avvia un server di sviluppo locale per il tuo sito web (con Vite MODE impostato su local-dev), oltre ad avviare qualsiasi server locale per le API a cui hai connesso il tuo sito web tramite il generatore Connection.

Quando il server del tuo sito web locale viene eseguito tramite questo target, runtime-config.json viene automaticamente sovrascritto per puntare agli URL delle tue API in esecuzione localmente.

Puoi eseguire questo target con il seguente comando:

Terminal window
pnpm nx dev <my-website>

Questo target è utile quando stai lavorando sul tuo sito web e sulla tua API e desideri iterare rapidamente senza distribuire la tua infrastruttura.

Autenticazione simulata

Quando viene eseguito in questa modalità e non è presente alcun runtime-config.json, se hai configurato l’autenticazione Cognito (tramite il generatore ts#website#auth), il login verrà saltato e le richieste ai tuoi server locali non includeranno header di autenticazione.

Per abilitare il login e l’autenticazione per dev, distribuisci la tua infrastruttura e carica la configurazione runtime.

Puoi compilare il tuo sito web utilizzando il target build. Questo esegue i target bundle, compile, test e lint, effettuando il controllo dei tipi, il bundling, il testing e il linting del tuo sito web.

Terminal window
pnpm nx build <my-website>

Il target bundle utilizza Vite per creare un bundle di produzione nella directory radice dist/packages/<my-website>/bundle. Questo è l’artefatto distribuibile consumato dalla tua infrastruttura del sito web. Puoi eseguirlo da solo:

Terminal window
pnpm nx bundle <my-website>

Testare il tuo sito web è molto simile a scrivere test in un progetto TypeScript standard, quindi fai riferimento alla guida al progetto TypeScript per maggiori dettagli.

Per i test specifici di React, React Testing Library è già installato e disponibile per scrivere test. Per maggiori dettagli sul suo utilizzo, fai riferimento alla documentazione di React Testing Library.

Puoi eseguire i tuoi test utilizzando il target test:

Terminal window
pnpm nx test <my-website>

Utilizza il generatore connection per integrare questo progetto con altri nel tuo workspace. Le seguenti connessioni coinvolgono questo progetto:

tRPC
React a tRPCChiama un'API tRPC da un sito web React
FastAPI
React a FastAPIChiama una FastAPI Python da un sito web React
Smithy
React a Smithy APIChiama un'API Smithy da un sito web React
Strands AgentsPython
React a Python AgentChiama un agente Python da un sito web React
Strands AgentsTypeScript
React a TypeScript AgentChiama un agente TypeScript da un sito web React
CopilotKit
React a AG-UI AgentChiama un agente che espone il protocollo AG-UI da un sito web React tramite CopilotKit
Amazon Bedrock AgentCore Gateway
Sito web React a AgentCore GatewayConnetti un sito web React agli agenti tramite un AgentCore Gateway