Site Web React
Ce générateur crée un nouveau site React configuré avec shadcn/ui par défaut, ainsi que l’infrastructure AWS CDK ou Terraform pour déployer votre site web dans le cloud en tant que site statique hébergé dans S3, servi par CloudFront et protégé par WAF.
L’application générée utilise Vite comme outil de build et bundler. Elle utilise TanStack Router pour le routage type-safe.
Utilisation
Section intitulée « Utilisation »Générer un site React
Section intitulée « Générer un site React »Vous pouvez générer un nouveau site React de deux manières :
- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - ts#website - Remplissez les paramètres requis
- Cliquez sur
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#websiteVous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
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-run| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
| name Requis | string | - | Le nom de l'application. |
| framework | react | react | Le framework frontend à utiliser. |
| directory | string | packages | Le répertoire de la nouvelle application. |
| subDirectory | string | - | Le sous-répertoire dans lequel le projet est placé. Par défaut, il s'agit du nom du projet. |
| ux | none | cloudscape | shadcn | shadcn | Le fournisseur UX préféré. |
| tailwind | boolean | true | Activer TailwindCSS pour un style utilitaire. |
| tanstackRouter | boolean | true | Activer le routeur Tanstack pour un routage type-safe. |
| infra | cloudfront-s3 | none | cloudfront-s3 | Le type d'infrastructure pour déployer votre site web. |
| iac | inherit | cdk | terraform | inherit | Le fournisseur IaC préféré. Par défaut, il est hérité de votre sélection initiale. |
| preferInstallDependencies | boolean | true | Indique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir sur false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin. |
Sortie du générateur
Section intitulée « Sortie du générateur »Le générateur créera la structure de projet suivante dans le répertoire <directory>/<name> :
- index.html Point d’entrée HTML
- public Assets statiques
Répertoiresrc
- main.tsx Point d’entrée de l’application avec la configuration React
- config.ts Configuration de l’application (ex: logo)
Répertoirecomponents
- AppLayout Composants pour le layout et la barre de navigation
Répertoirehooks
- useAppLayout.tsx Hook pour ajuster l’AppLayout depuis des composants imbriqués (Cloudscape uniquement)
Répertoireroutes
- index.tsx Exemple de route (ou page) pour TanStack Router
- styles.css Styles globaux
- vite.config.mts Configuration Vite et Vitest
- tsconfig.json Configuration TypeScript de base pour le code et les tests
- tsconfig.app.json Configuration TypeScript pour le code source
- tsconfig.spec.json Configuration TypeScript pour les tests
Infrastructure
Section intitulée « Infrastructure »Ce générateur fournit de l’infrastructure as code basée sur votre iacProvider choisi. Il créera un projet dans packages/common qui inclut les constructions CDK ou modules Terraform pertinents.
Le projet commun d’infrastructure as code est structuré comme suit :
Répertoirepackages/common/constructs
Répertoiresrc
Répertoireapp/ Constructions pour l’infrastructure spécifique à un projet/générateur
- …
Répertoirecore/ Constructions génériques réutilisées par celles dans
app- …
- index.ts Point d’entrée exportant les constructions depuis
app
- project.json Cibles de build et configuration du projet
Répertoirepackages/common/terraform
Répertoiresrc
Répertoireapp/ Modules Terraform pour l’infrastructure spécifique à un projet/générateur
- …
Répertoirecore/ Modules génériques réutilisés par ceux dans
app- …
- project.json Cibles de build et configuration du projet
Le générateur crée une infrastructure as code pour déployer votre site web en fonction du iacProvider sélectionné :
Répertoirepackages/common/constructs/src
Répertoireapp
Répertoirestatic-websites
- <name>.ts Infrastructure spécifique à votre site
Répertoirecore
- static-website.ts Construct générique StaticWebsite
Répertoirepackages/common/terraform/src
Répertoireapp
Répertoirestatic-websites
Répertoire<name>
- <name>.tf Module spécifique à votre site
Répertoirecore
Répertoirestatic-website
- static-website.tf Module générique de site statique
Architecture
Section intitulée « Architecture »Le site web déployé a l’architecture suivante :
En-têtes de sécurité
Section intitulée « En-têtes de sécurité »La distribution CloudFront applique une politique d’en-têtes de réponse qui définit Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options: DENY, Referrer-Policy et une Content-Security-Policy sur toutes les réponses.
Une Content-Security-Policy par défaut est appliquée. Elle restreint les scripts et le framing pour atténuer les attaques XSS et de clickjacking, tout en permettant les connexions HTTPS et WSS afin que le site puisse appeler les endpoints de services AWS (tels que API Gateway, Cognito et Bedrock AgentCore) dont les URLs ne sont connues qu’au moment du déploiement. Pour ajuster la politique (par exemple pour restreindre connect-src à vos origines spécifiques), modifiez la valeur content_security_policy dans votre fichier généré static-website.ts (CDK) ou static-website.tf (Terraform).
runtime-config.json est servi avec Cache-Control: no-cache afin que les navigateurs récupèrent toujours la dernière configuration après un redéploiement, plutôt que d’utiliser une copie en cache obsolète.
Implémentation de votre site React
Section intitulée « Implémentation de votre site React »La documentation React est un bon point de départ pour apprendre les bases du développement avec React.
Vous pouvez consulter la documentation Cloudscape pour les détails sur les composants disponibles et leur utilisation.
Vous pouvez consulter la documentation shadcn/ui pour les détails sur les composants disponibles et leur utilisation.
Création d’une route/page
Section intitulée « Création d’une route/page »Votre site est configuré avec TanStack Router par défaut. Cela facilite l’ajout de nouvelles routes :
- Lancer le serveur de développement local
- Créer un nouveau fichier
<page-name>.tsxdanssrc/routes, où la position dans l’arborescence représente le chemin - Une
Routeet unRouteComponentsont générés automatiquement. Vous pouvez commencer à développer votre page ici !
Navigation entre pages
Section intitulée « Navigation entre pages »Vous pouvez utiliser le composant Link ou le hook useNavigate pour naviguer entre les pages :
import { Link, useNavigate } from '@tanstack/react-router';
export const MyComponent = () => { const navigate = useNavigate();
const submit = async () => { const id = await ... // Utiliser `navigate` pour rediriger après une action asynchrone navigate({ to: '/products/$id', { params: { id }} }); };
return ( <> <Link to="/products">Annuler</Link> <Button onClick={submit}>Valider</Button> </> )};Pour plus de détails, consultez la documentation TanStack Router.
Configuration runtime
Section intitulée « Configuration runtime »La configuration de votre infrastructure est fournie à votre site via la Configuration Runtime. Cela permet à votre site d’accéder à des détails comme les URLs d’API qui ne sont connus qu’au moment du déploiement.
Infrastructure
Section intitulée « Infrastructure »Le construct CDK RuntimeConfig peut être utilisé pour ajouter et récupérer la configuration dans votre infrastructure CDK. Les constructs CDK générés par les générateurs @aws/nx-plugin (comme ts#trpc-api et py#fast-api) ajoutent automatiquement les valeurs appropriées au RuntimeConfig.
Votre construct CDK de site web déploie le namespace connection de la configuration runtime dans un fichier runtime-config.json à la racine de votre 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);
// Le site peut être déclaré à tout moment — la config runtime est résolue de manière lazy new MyWebsite(this, 'MyWebsite');
// Ajoute automatiquement des valeurs au RuntimeConfig new MyApi(this, 'MyApi', { integrations: MyApi.defaultIntegrations(this).build(), }); }}Avec Terraform, la configuration runtime est gérée via les modules runtime-config. Les modules Terraform générés par les générateurs @aws/nx-plugin (comme ts#api et py#api) ajoutent automatiquement les valeurs appropriées à la configuration runtime.
Votre module Terraform de site web déploie le namespace connection de la configuration runtime dans un fichier runtime-config.json à la racine de votre bucket S3.
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
# Ajoute automatiquement des valeurs à la config runtimemodule "my_api" { source = "../../common/terraform/src/app/apis/my-api"
asset_bucket_name = module.asset_bucket.bucket_name}
# Déploie automatiquement la config runtime dans runtime-config.jsonmodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }
# S'assure que l'API est déployée en premier pour ajouter à la config runtime depends_on = [module.my_api]}Code du site
Section intitulée « Code du site »Dans votre site, vous pouvez utiliser le hook useRuntimeConfig pour récupérer les valeurs de la configuration runtime :
import { useRuntimeConfig } from '../hooks/useRuntimeConfig';
const MyComponent = () => { const runtimeConfig = useRuntimeConfig();
// Accéder aux valeurs de la config runtime ici const apiUrl = runtimeConfig.apis.MyApi;};Configuration runtime locale
Section intitulée « Configuration runtime locale »Lors de l’exécution du serveur de développement local, vous aurez besoin d’un fichier runtime-config.json dans votre répertoire public pour que votre site local connaisse les URLs des backends, la configuration d’identité, etc.
Votre projet de site est configuré avec une cible load:runtime-config que vous pouvez utiliser pour récupérer le fichier runtime-config.json d’une application déployée :
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"Serveur de développement local
Section intitulée « Serveur de développement local »La commande canonique pour le développement local est dev, qui démarre votre site web (et tous les serveurs locaux pour les APIs que vous y avez connectées) avec une seule commande :
pnpm nx dev <my-website>yarn nx dev <my-website>npx nx dev <my-website>bunx nx dev <my-website>La cible serve est également disponible lorsque vous devez contrôler quelle partie de votre application s’exécute localement par rapport à l’infrastructure AWS déployée. Pour un aperçu plus large du développement local entre projets connectés, y compris le comportement de dev pour les projets avec plusieurs composants, consultez le guide Développement local.
Cible Serve
Section intitulée « Cible Serve »La cible serve démarre un serveur de développement local pour votre site. Cette cible nécessite que vous ayez déployé toute infrastructure de support avec laquelle le site interagit, et que vous ayez chargé la configuration runtime locale.
Vous pouvez exécuter cette cible avec la commande :
pnpm nx serve <my-website>yarn nx serve <my-website>npx nx serve <my-website>bunx nx serve <my-website>Cette cible est utile pour travailler sur des modifications du site tout en pointant vers des APIs “réelles” déployées et d’autres infrastructures.
Cible Dev
Section intitulée « Cible Dev »La cible dev démarre un serveur de développement local pour votre site (avec le MODE Vite défini sur local-dev), ainsi que des serveurs locaux pour les APIs connectées via le générateur Connection.
Lorsque le serveur local est lancé via cette cible, le runtime-config.json est automatiquement remplacé pour pointer vers les URLs des APIs locales.
Vous pouvez exécuter cette cible avec la commande :
pnpm nx dev <my-website>yarn nx dev <my-website>npx nx dev <my-website>bunx nx dev <my-website>Cette cible est utile lorsque vous travaillez à la fois sur votre site et vos APIs et souhaitez itérer rapidement sans déployer l’infrastructure.
Authentification simulée
Dans ce mode, si aucun runtime-config.json n’est présent et que vous avez configuré l’authentification Cognito (via le générateur ts#website#auth), la connexion sera ignorée et les requêtes vers vos serveurs locaux n’incluront pas d’en-têtes d’authentification.
Pour activer la connexion et l’authentification pour dev, déployez votre infrastructure et chargez la configuration runtime.
Vous pouvez builder votre site avec la cible build. Cela exécute les cibles bundle, compile, test et lint, effectuant la vérification de types, le bundling, les tests et le linting de votre site.
pnpm nx build <my-website>yarn nx build <my-website>npx nx build <my-website>bunx nx build <my-website>La cible bundle utilise Vite pour créer un bundle de production dans le répertoire dist/packages/<my-website>/bundle. C’est l’artefact déployable consommé par votre infrastructure de site web. Vous pouvez l’exécuter seule :
pnpm nx bundle <my-website>yarn nx bundle <my-website>npx nx bundle <my-website>bunx nx bundle <my-website>Tester votre site fonctionne comme pour un projet TypeScript standard. Consultez le guide de projet TypeScript pour plus de détails.
Pour les tests spécifiques à React, React Testing Library est déjà installé et disponible. Consultez la documentation React Testing Library pour son utilisation.
Vous pouvez exécuter les tests avec la cible test :
pnpm nx test <my-website>yarn nx test <my-website>npx nx test <my-website>bunx nx test <my-website>Déploiement du site
Section intitulée « Déploiement du site »Le générateur de site React crée une infrastructure CDK ou Terraform en fonction du iacProvider sélectionné. Vous pouvez l’utiliser pour déployer votre site.
Pour déployer votre site, nous recommandons d’utiliser le générateur ts#infra pour créer une application CDK.
Vous pouvez utiliser le construct CDK généré dans packages/common/constructs pour déployer votre site.
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'); }}Ceci configure :
- Un bucket S3 pour héberger les fichiers statiques
- Une distribution CloudFront pour la diffusion globale
- Un Web ACL WAF pour la sécurité
- Une Origin Access Control pour l’accès sécurisé à S3
- Déploiement automatique des fichiers et configuration runtime
Pour déployer votre site, nous recommandons d’utiliser le générateur terraform#project pour créer un projet Terraform.
Vous pouvez utiliser le module Terraform généré dans packages/common/terraform pour déployer votre site.
# Déployer le sitemodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }}Ceci configure :
- Un bucket S3 pour héberger les fichiers statiques
- Une distribution CloudFront pour la diffusion globale
- Un Web ACL WAF pour la sécurité (déployé en us-east-1)
- Une Origin Access Control pour l’accès sécurisé à S3
- Déploiement automatique des fichiers et configuration runtime
Connexions
Section intitulée « Connexions »Utilisez le générateur connection pour intégrer ce projet avec d’autres dans votre espace de travail. Les connexions suivantes impliquent ce projet :
id>
