Sito Web React
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 sul cloud come sito 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.
Utilizzo
Sezione intitolata “Utilizzo”Generare un Sito Web React
Sezione intitolata “Generare un Sito Web React”Puoi generare un nuovo Sito Web React in due modi:
- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - ts#website - Compila i parametri richiesti
- Clicca su
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#websitePuoi anche eseguire una prova per vedere quali file verrebbero modificati
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-runOpzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| name Obbligatorio | string | - | Il nome dell'applicazione. |
| framework | react | react | Il framework frontend da utilizzare. |
| directory | string | packages | La 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 | shadcn | shadcn | Il provider UX preferito. |
| tailwind | boolean | true | Abilita TailwindCSS per lo styling utility-first. |
| tanstackRouter | boolean | true | Abilita Tanstack router per il routing type-safe. |
| infra | cloudfront-s3 | none | cloudfront-s3 | Il tipo di infrastruttura con cui distribuire il tuo sito web. |
| iac | inherit | cdk | terraform | inherit | Il provider IaC preferito. Per impostazione predefinita viene ereditato dalla selezione iniziale. |
| preferInstallDependencies | boolean | true | Se 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. |
Output del Generatore
Sezione intitolata “Output del Generatore”Il generatore creerà la seguente struttura del progetto nella directory <directory>/<nome>:
- index.html Punto di ingresso HTML
- public Asset statici
Directorysrc
- main.tsx Punto di ingresso dell’applicazione con configurazione React
- config.ts Configurazione dell’applicazione (es. logo)
Directorycomponents
- AppLayout Componenti per il layout generale e la barra di navigazione
Directoryhooks
- useAppLayout.tsx Hook per regolare l’AppLayout da componenti annidati (solo Cloudscape)
Directoryroutes
- index.tsx Route di esempio (o pagina) per TanStack Router
- styles.css Stili globali
- vite.config.mts Configurazione Vite e Vitest
- tsconfig.json Configurazione TypeScript base per sorgenti e test
- tsconfig.app.json Configurazione TypeScript per il codice sorgente
- tsconfig.spec.json Configurazione TypeScript per i test
Infrastruttura
Sezione intitolata “Infrastruttura”Poiché questo generatore fornisce infrastruttura come codice basata sul tuo iacProvider selezionato, creerà un progetto in packages/common che include i relativi costrutti CDK o moduli Terraform.
Il progetto comune di infrastruttura come codice è strutturato come segue:
Directorypackages/common/constructs
Directorysrc
Directoryapp/ Construct per l’infrastruttura specifica di un progetto/generatore
- …
Directorycore/ Construct generici riutilizzati dai construct in
app- …
- index.ts Punto di ingresso che esporta i construct da
app
- project.json Target di build e configurazione del progetto
Directorypackages/common/terraform
Directorysrc
Directoryapp/ Moduli Terraform per l’infrastruttura specifica di un progetto/generatore
- …
Directorycore/ Moduli generici riutilizzati dai moduli in
app- …
- project.json Target di build e configurazione del progetto
Il generatore crea infrastruttura as code per distribuire il tuo sito web in base al iacProvider selezionato:
Directorypackages/common/constructs/src
Directoryapp
Directorystatic-websites
- <nome>.ts Infrastruttura specifica per il tuo sito web
Directorycore
- static-website.ts Construct generico StaticWebsite
Directorypackages/common/terraform/src
Directoryapp
Directorystatic-websites
Directory<nome>
- <nome>.tf Modulo specifico per il tuo sito web
Directorycore
Directorystatic-website
- static-website.tf Modulo generico per sito statico
Architettura
Sezione intitolata “Architettura”Il sito web distribuito ha la seguente architettura:
Security Headers
Sezione intitolata “Security Headers”La distribuzione CloudFront applica una policy di response headers che imposta Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options: DENY, Referrer-Policy e una Content-Security-Policy su tutte le risposte.
Una Content-Security-Policy predefinita viene applicata. Limita script e framing per mitigare XSS e clickjacking, consentendo al contempo connessioni HTTPS e WSS in modo che il sito web possa chiamare endpoint di servizi AWS (come API Gateway, Cognito e Bedrock AgentCore) i cui URL sono noti solo al momento del deploy. 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 generato (CDK) o static-website.tf (Terraform).
runtime-config.json viene servito con Cache-Control: no-cache in modo che i browser recuperino sempre la configurazione più recente dopo un ridistribuzione, invece di usare una copia cache obsoleta.
Implementazione del Sito Web React
Sezione intitolata “Implementazione del Sito Web React”La documentazione React è un buon punto di partenza per apprendere le basi dello sviluppo con React.
Puoi consultare la documentazione Cloudscape per dettagli sui componenti disponibili e il loro utilizzo.
Puoi consultare la documentazione shadcn/ui per dettagli sui componenti disponibili e il loro utilizzo.
Creazione di una Route/Pagina
Sezione intitolata “Creazione di una Route/Pagina”Il tuo sito web include TanStack Router configurato di default. Questo semplifica l’aggiunta di nuove route:
- Avvia il Server di Sviluppo Locale
- Crea un nuovo file
<nome-pagina>.tsxinsrc/routes, con la posizione nell’albero dei file che rappresenta il percorso - Noterai che un
RouteeRouteComponentvengono generati automaticamente. Puoi iniziare a costruire la tua pagina qui!
Navigazione tra Pagine
Sezione intitolata “Navigazione tra Pagine”Puoi usare 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 ... // Usa `navigate` per reindirizzare dopo un'azione asincrona navigate({ to: '/products/$id', { params: { id }} }); };
return ( <> <Link to="/products">Annulla</Link> <Button onClick={submit}>Invia</Button> </> )};Per maggiori dettagli, consulta la documentazione TanStack Router.
Configurazione Runtime
Sezione intitolata “Configurazione Runtime”La configurazione dalla tua infrastruttura viene fornita al sito web tramite Configurazione Runtime. Questo permette al sito di accedere a dettagli come URL di API non noti fino al deployment dell’applicazione.
Infrastruttura
Sezione intitolata “Infrastruttura”Il construct RuntimeConfig CDK può essere usato per aggiungere e recuperare configurazioni nella tua infrastruttura CDK. I construct CDK generati dai generatori @aws/nx-plugin (come ts#trpc-api e py#fast-api) aggiungeranno automaticamente i valori appropriati a RuntimeConfig.
Il construct CDK del tuo sito web distribuirà il namespace connection della configurazione runtime come file runtime-config.json nella root del 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);
// Il sito web può essere dichiarato in qualsiasi punto — la config runtime è risolta in modo lazy new MyWebsite(this, 'MyWebsite');
// Aggiunge automaticamente valori a RuntimeConfig new MyApi(this, 'MyApi', { integrations: MyApi.defaultIntegrations(this).build(), }); }}Con Terraform, la configurazione runtime è gestita tramite moduli runtime-config. I moduli Terraform generati da generatori @aws/nx-plugin (come ts#api e py#api) aggiungeranno automaticamente valori appropriati alla configurazione runtime.
Il modulo Terraform del tuo sito web distribuirà il namespace connection della configurazione runtime come file runtime-config.json nella root del bucket S3.
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
# Aggiunge automaticamente valori alla config runtimemodule "my_api" { source = "../../common/terraform/src/app/apis/my-api"
asset_bucket_name = module.asset_bucket.bucket_name}
# Distribuisce automaticamente la config runtime in runtime-config.jsonmodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }
# Garantisce che l'API sia distribuita prima per aggiungere alla config runtime depends_on = [module.my_api]}Codice del Sito Web
Sezione intitolata “Codice del Sito Web”Nel tuo sito web, puoi usare l’hook useRuntimeConfig per recuperare valori dalla configurazione runtime:
import { useRuntimeConfig } from '../hooks/useRuntimeConfig';
const MyComponent = () => { const runtimeConfig = useRuntimeConfig();
// Accedi ai valori della config runtime qui const apiUrl = runtimeConfig.apis.MyApi;};Configurazione Runtime Locale
Sezione intitolata “Configurazione Runtime Locale”Quando esegui il server di sviluppo locale, avrai bisogno di un file runtime-config.json nella tua directory public per far conoscere al sito locale gli URL dei backend, configurazione identity, ecc.
Il tuo progetto website è configurato con un target load:runtime-config che puoi usare per scaricare il file runtime-config.json da un’applicazione distribuita:
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"Server di Sviluppo Locale
Sezione intitolata “Server di Sviluppo Locale”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 solo comando:
pnpm nx dev <my-website>yarn nx dev <my-website>npx nx dev <my-website>bunx nx dev <my-website>Il target serve è anche disponibile per quando hai bisogno di controllare quanto della tua applicazione viene eseguito localmente rispetto al puntare all’infrastruttura AWS distribuita. Per una panoramica più ampia dello sviluppo locale tra progetti connessi, incluso come dev si comporta per progetti con più componenti, consulta la guida Sviluppo Locale.
Target Serve
Sezione intitolata “Target Serve”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 interagisce, e aver caricato la configurazione runtime locale.
Puoi eseguire questo target con il seguente comando:
pnpm nx serve <my-website>yarn nx serve <my-website>npx nx serve <my-website>bunx nx serve <my-website>Questo target è utile per lavorare a modifiche del sito puntando ad API “reali” distribuite e altra infrastruttura.
Target Dev
Sezione intitolata “Target Dev”Il target dev avvia un server di sviluppo locale per il tuo sito web (con Vite MODE impostato a local-dev), avviando anche server locali per API che hai connesso al sito tramite il generatore Connection.
Quando il server locale del sito è eseguito tramite questo target, runtime-config.json viene automaticamente sovrascritto per puntare agli URL delle API in esecuzione localmente.
Puoi eseguire questo target con il seguente comando:
pnpm nx dev <my-website>yarn nx dev <my-website>npx nx dev <my-website>bunx nx dev <my-website>Questo target è utile quando lavori sia sul sito che sulle API e vuoi iterare rapidamente senza distribuire l’infrastruttura.
Autenticazione simulata
In questa modalità, se non è presente runtime-config.json e hai configurato l’autenticazione Cognito (tramite il generatore ts#website#auth), il login sarà saltato e le richieste ai server locali non includeranno header di autenticazione.
Per abilitare login e autenticazione per dev, distribuisci l’infrastruttura e carica la config runtime.
Puoi compilare il sito web con il target build. Questo esegue i target bundle, compile, test e lint, effettuando type-checking, bundling, testing e linting del sito.
pnpm nx build <my-website>yarn nx build <my-website>npx nx build <my-website>bunx nx build <my-website>Il target bundle usa Vite per creare un bundle di produzione nella directory root dist/packages/<my-website>/bundle. Questo è l’artefatto distribuibile utilizzato dall’infrastruttura del sito web. Puoi eseguirlo autonomamente:
pnpm nx bundle <my-website>yarn nx bundle <my-website>npx nx bundle <my-website>bunx nx bundle <my-website>Testing
Sezione intitolata “Testing”Testare il sito web è simile a scrivere test in un progetto TypeScript standard, quindi consulta la guida TypeScript project per maggiori dettagli.
Per test specifici React, React Testing Library è già installato e disponibile per scrivere test. Per dettagli sul suo utilizzo, consulta la documentazione React Testing Library.
Puoi eseguire i test con il target test:
pnpm nx test <my-website>yarn nx test <my-website>npx nx test <my-website>bunx nx test <my-website>Distribuzione del Sito Web
Sezione intitolata “Distribuzione del Sito Web”Il generatore React website crea infrastruttura as code CDK o Terraform in base al iacProvider selezionato. Puoi usarla per distribuire il sito.
Per distribuire il sito, raccomandiamo di usare il generatore ts#infra per creare un’applicazione CDK.
Puoi usare il construct CDK generato in packages/common/constructs per distribuire il sito.
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:
- Un bucket S3 per l’hosting dei file statici del sito web
- Distribuzione CloudFront per la delivery globale dei contenuti
- Web ACL WAF per la protezione di sicurezza
- Origin Access Control per l’accesso sicuro a S3
- Deployment automatico dei file del sito web e della configurazione runtime
Per distribuire il sito, raccomandiamo di usare il generatore terraform#project per creare un progetto Terraform.
Puoi usare il modulo Terraform generato in packages/common/terraform per distribuire il sito.
# Distribuisci il sito webmodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }}Questo configura:
- Un bucket S3 per l’hosting dei file statici del sito web
- Distribuzione CloudFront per la delivery globale dei contenuti
- Web ACL WAF per la protezione di sicurezza (distribuito in us-east-1)
- Origin Access Control per l’accesso sicuro a S3
- Deployment automatico dei file del sito web e della configurazione runtime
Connessioni
Sezione intitolata “Connessioni”Usa il generatore connection per integrare questo progetto con altri nel tuo workspace. Le seguenti connessioni coinvolgono questo progetto:
id>
