Trang Web React
Generator này tạo một trang web React mới với CloudScape đã được cấu hình, cùng với cơ sở hạ tầng AWS CDK hoặc Terraform để triển khai trang web của bạn lên đám mây dưới dạng trang web tĩnh được lưu trữ trong S3, phân phối bởi CloudFront và được bảo vệ bởi WAF.
Ứng dụng được tạo ra sử dụng Vite làm công cụ xây dựng và đóng gói. Nó sử dụng TanStack Router cho định tuyến an toàn kiểu.
Cách sử dụng
Phần tiêu đề “Cách sử dụng”Tạo một React Website
Phần tiêu đề “Tạo một React Website”Bạn có thể tạo một React Website mới theo hai cách:
- Install the Nx Console VSCode Plugin if you haven't already
- Open the Nx Console in VSCode
- Click
Generate (UI)in the "Common Nx Commands" section - Search for
@aws/nx-plugin - ts#react-website - Fill in the required parameters
- Click
Generate
pnpm nx g @aws/nx-plugin:ts#react-websiteyarn nx g @aws/nx-plugin:ts#react-websitenpx nx g @aws/nx-plugin:ts#react-websitebunx nx g @aws/nx-plugin:ts#react-websiteYou can also perform a dry-run to see what files would be changed
pnpm nx g @aws/nx-plugin:ts#react-website --dry-runyarn nx g @aws/nx-plugin:ts#react-website --dry-runnpx nx g @aws/nx-plugin:ts#react-website --dry-runbunx nx g @aws/nx-plugin:ts#react-website --dry-runTùy chọn
Phần tiêu đề “Tùy chọn”| Parameter | Type | Default | Description |
|---|---|---|---|
| name Required | 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. |
Kết quả từ Generator
Phần tiêu đề “Kết quả từ Generator”Generator sẽ tạo cấu trúc dự án sau trong thư mục <directory>/<name>:
- index.html Điểm vào HTML
- public Tài nguyên tĩnh
Thư mụcsrc
- main.tsx Điểm vào ứng dụng với thiết lập React
- config.ts Cấu hình ứng dụng (ví dụ: logo)
Thư mụccomponents
- AppLayout Các component cho bố cục tổng thể CloudScape và thanh điều hướng
Thư mụchooks
- useAppLayout.tsx Hook để điều chỉnh AppLayout từ các component lồng nhau
Thư mụcroutes
Thư mụcwelcome
- index.tsx Ví dụ route (hoặc trang) cho @tanstack/react-router
- styles.css Các style toàn cục
- vite.config.ts Cấu hình Vite và Vitest
- tsconfig.json Cấu hình TypeScript cơ bản cho mã nguồn và test
- tsconfig.app.json Cấu hình TypeScript cho mã nguồn
- tsconfig.spec.json Cấu hình TypeScript cho test
Cơ sở hạ tầng
Phần tiêu đề “Cơ sở hạ tầng”Vì generator này cung cấp infrastructure as code dựa trên iacProvider bạn đã chọn, nó sẽ tạo một dự án trong packages/common bao gồm các CDK constructs hoặc Terraform modules liên quan.
Dự án infrastructure as code chung được cấu trúc như sau:
Thư mụcpackages/common/constructs
Thư mụcsrc
Thư mụcapp/ Constructs cho infrastructure cụ thể của một dự án/generator
- …
Thư mụccore/ Constructs chung được tái sử dụng bởi các constructs trong
app- …
- index.ts Entry point xuất các constructs từ
app
- project.json Các build targets và cấu hình của dự án
Thư mụcpackages/common/terraform
Thư mụcsrc
Thư mụcapp/ Terraform modules cho infrastructure cụ thể của một dự án/generator
- …
Thư mụccore/ Modules chung được tái sử dụng bởi các modules trong
app- …
- project.json Các build targets và cấu hình của dự án
Generator tạo infrastructure as code để triển khai trang web của bạn dựa trên iacProvider bạn đã chọn:
Thư mụcpackages/common/constructs/src
Thư mụcapp
Thư mụcstatic-websites
- <name>.ts Cơ sở hạ tầng cụ thể cho trang web của bạn
Thư mụccore
- static-website.ts Construct StaticWebsite chung
Thư mụcpackages/common/terraform/src
Thư mụcapp
Thư mụcstatic-websites
Thư mục<name>
- <name>.tf Module cụ thể cho trang web của bạn
Thư mụccore
Thư mụcstatic-website
- static-website.tf Module trang web tĩnh chung
Triển khai React Website của bạn
Phần tiêu đề “Triển khai React Website của bạn”Tài liệu React là nơi tốt để bắt đầu học các kiến thức cơ bản về xây dựng với React. Bạn có thể tham khảo tài liệu CloudScape để biết chi tiết về các component có sẵn và cách sử dụng chúng.
Routes
Phần tiêu đề “Routes”Tạo một Route/Trang
Phần tiêu đề “Tạo một Route/Trang”Trang web CloudScape của bạn đi kèm với TanStack Router được cấu hình mặc định. Điều này giúp dễ dàng thêm các route mới:
- Chạy Local Development Server
- Tạo một file
<page-name>.tsxmới trongsrc/routes, với vị trí của nó trong cây thư mục đại diện cho đường dẫn - Lưu ý rằng
RoutevàRouteComponentđược tự động tạo cho bạn. Bạn có thể bắt đầu xây dựng trang của mình tại đây!
Điều hướng giữa các Trang
Phần tiêu đề “Điều hướng giữa các Trang”Bạn có thể sử dụng component Link hoặc hook useNavigate để điều hướng giữa các trang:
import { Link, useNavigate } from '@tanstack/react-router';
export const MyComponent = () => { const navigate = useNavigate();
const submit = async () => { const id = await ... // Sử dụng `navigate` để chuyển hướng sau một hành động bất đồng bộ navigate({ to: '/products/$id', { params: { id }} }); };
return ( <> <Link to="/products">Cancel</Link> <Button onClick={submit}>Submit</Button> </> )};Để biết thêm chi tiết, hãy xem tài liệu TanStack Router.
Cấu hình Runtime
Phần tiêu đề “Cấu hình Runtime”Cấu hình từ cơ sở hạ tầng của bạn được cung cấp cho trang web của bạn thông qua Runtime Configuration. Điều này cho phép trang web của bạn truy cập các chi tiết như URL API mà không được biết cho đến khi ứng dụng của bạn được triển khai.
Cơ sở hạ tầng
Phần tiêu đề “Cơ sở hạ tầng”Construct CDK RuntimeConfig có thể được sử dụng để thêm và truy xuất cấu hình trong cơ sở hạ tầng CDK của bạn. Các construct CDK được tạo bởi các generator @aws/nx-plugin (như ts#trpc-api và py#fast-api) sẽ tự động thêm các giá trị phù hợp vào RuntimeConfig.
Construct CDK của trang web của bạn sẽ triển khai cấu hình runtime dưới dạng file runtime-config.json vào thư mục gốc của bucket S3 của bạn.
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);
// Tự động thêm các giá trị vào RuntimeConfig new MyApi(this, 'MyApi', { integrations: MyApi.defaultIntegrations(this).build(), });
// Tự động triển khai runtime config vào runtime-config.json new MyWebsite(this, 'MyWebsite'); }}Với Terraform, cấu hình runtime được quản lý thông qua các module runtime-config. Các module Terraform được tạo bởi các generator @aws/nx-plugin (như ts#trpc-api và py#fast-api) sẽ tự động thêm các giá trị phù hợp vào cấu hình runtime.
Module Terraform của trang web của bạn sẽ triển khai cấu hình runtime dưới dạng file runtime-config.json vào thư mục gốc của bucket S3 của bạn.
# Tự động thêm các giá trị vào runtime configmodule "my_api" { source = "../../common/terraform/src/app/apis/my-api"}
# Tự động triển khai runtime config vào runtime-config.jsonmodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }
# Đảm bảo API được triển khai trước để thêm vào runtime config depends_on = [module.my_api]}Mã Website
Phần tiêu đề “Mã Website”Trong trang web của bạn, bạn có thể sử dụng hook useRuntimeConfig để truy xuất các giá trị từ cấu hình runtime:
import { useRuntimeConfig } from '../hooks/useRuntimeConfig';
const MyComponent = () => { const runtimeConfig = useRuntimeConfig();
// Truy cập các giá trị trong runtime config tại đây const apiUrl = runtimeConfig.apis.MyApi;};Runtime Config Local
Phần tiêu đề “Runtime Config Local”Khi chạy local development server, bạn sẽ cần một file runtime-config.json trong thư mục public của bạn để trang web local của bạn biết các URL backend, cấu hình identity, v.v.
Dự án trang web của bạn được cấu hình với target load:runtime-config mà bạn có thể sử dụng để tải xuống file runtime-config.json từ một ứng dụng đã triển khai:
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"Local Development Server
Phần tiêu đề “Local Development Server”Bạn có thể chạy một local development server bằng cách sử dụng target serve hoặc serve-local.
Target Serve
Phần tiêu đề “Target Serve”Target serve khởi động một local development server cho trang web của bạn. Target này yêu cầu bạn đã triển khai bất kỳ cơ sở hạ tầng hỗ trợ nào mà trang web tương tác với, và đã tải cấu hình runtime local.
Bạn có thể chạy target này với lệnh sau:
pnpm nx run <my-website>:serveyarn nx run <my-website>:servenpx nx run <my-website>:servebunx nx run <my-website>:serveTarget này hữu ích để làm việc với các thay đổi trang web trong khi trỏ đến các API và cơ sở hạ tầng khác đã được triển khai “thực sự”.
Target Serve Local
Phần tiêu đề “Target Serve Local”Target serve-local khởi động một local development server cho trang web của bạn (với Vite MODE được đặt thành serve-local), cũng như khởi động bất kỳ server local nào cho các API mà bạn đã kết nối trang web của mình thông qua API Connection generator.
Khi server trang web local của bạn được chạy thông qua target này, runtime-config.json được tự động ghi đè để trỏ đến các url API đang chạy local của bạn.
Bạn có thể chạy target này với lệnh sau:
pnpm nx run <my-website>:serve-localyarn nx run <my-website>:serve-localnpx nx run <my-website>:serve-localbunx nx run <my-website>:serve-localTarget này hữu ích khi bạn đang làm việc trên cả trang web và API của mình và muốn lặp lại nhanh chóng mà không cần triển khai cơ sở hạ tầng của bạn.
Khi chạy ở chế độ này và không có runtime-config.json, nếu bạn đã cấu hình Cognito Authentication (thông qua CloudScape Website Auth generator), đăng nhập sẽ được bỏ qua và các yêu cầu đến server local của bạn sẽ không bao gồm header xác thực.
Để bật đăng nhập và xác thực cho serve-local, hãy triển khai cơ sở hạ tầng của bạn và tải runtime config.
Xây dựng
Phần tiêu đề “Xây dựng”Bạn có thể xây dựng trang web của mình bằng cách sử dụng target build. Điều này sử dụng Vite để tạo một bundle production trong thư mục gốc dist/packages/<my-website>/bundle, cũng như kiểm tra kiểu, biên dịch và lint trang web của bạn.
pnpm nx run <my-website>:buildyarn nx run <my-website>:buildnpx nx run <my-website>:buildbunx nx run <my-website>:buildTesting
Phần tiêu đề “Testing”Testing trang web của bạn giống như viết test trong một dự án TypeScript tiêu chuẩn, vì vậy vui lòng tham khảo hướng dẫn dự án TypeScript để biết thêm chi tiết.
Đối với testing cụ thể của React, React Testing Library đã được cài đặt và có sẵn cho bạn sử dụng để viết test. Để biết thêm chi tiết về cách sử dụng, vui lòng tham khảo tài liệu React Testing Library.
Bạn có thể chạy test của mình bằng cách sử dụng target test:
pnpm nx run <my-website>:testyarn nx run <my-website>:testnpx nx run <my-website>:testbunx nx run <my-website>:testTriển khai Trang web của bạn
Phần tiêu đề “Triển khai Trang web của bạn”Generator React website tạo infrastructure as code CDK hoặc Terraform dựa trên iacProvider bạn đã chọn. Bạn có thể sử dụng điều này để triển khai trang web của mình.
Để triển khai trang web của bạn, chúng tôi khuyên bạn nên sử dụng generator ts#infra để tạo một ứng dụng CDK.
Bạn có thể sử dụng construct CDK được tạo cho bạn trong packages/common/constructs để triển khai trang web của bạn.
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'); }}Điều này thiết lập:
- Một bucket S3 để lưu trữ các file trang web tĩnh của bạn
- CloudFront distribution để phân phối nội dung toàn cầu
- WAF Web ACL để bảo vệ bảo mật
- Origin Access Control để truy cập S3 an toàn
- Tự động triển khai các file trang web và cấu hình runtime
Để triển khai trang web của bạn, chúng tôi khuyên bạn nên sử dụng generator terraform#project để tạo một dự án Terraform.
Bạn có thể sử dụng module Terraform được tạo cho bạn trong packages/common/terraform để triển khai trang web của bạn.
# Triển khai websitemodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }}Điều này thiết lập:
- Một bucket S3 để lưu trữ các file trang web tĩnh của bạn
- CloudFront distribution để phân phối nội dung toàn cầu
- WAF Web ACL để bảo vệ bảo mật (được triển khai trong us-east-1)
- Origin Access Control để truy cập S3 an toàn
- Tự động triển khai các file trang web và cấu hình runtime