- Notifications
You must be signed in to change notification settings - Fork31
Serverless pre-rendering (SSR) for React SPA using AWS Lambda, S3, and CloudFront.
License
sbstjn/cra-serverless
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Serverless SSR forcreate-react-app
Full-featured AWS architecture to useServer-Side Rendering for anycreate-react-app project usingLambda,API Gateway,CloudFront. All infrastructure is configured using theAWS Cloud Development Kit and can be deployed usingAWS CodePipeline andAWS CodeBuild.
Have fun, and be a niceanti-fascist human being!
https://d31tuk9nqnnpkk.cloudfront.net/
Guide (EN):React with server-side rendering on AWS Lambda onsbstjn.com
Guide (DE):React und server-side rendering mit AWS Lambda und CloudFront onsuperluminar.io
Whenever you search forserver-side rendering of React applications, you will read it's hard to accomplish.But why? Most probably, you'll end up with frameworks likerazzle orNext.js only because you wanted a little bit of pre-rendered HTML for your React application.
The idea ofcra-serverless is pretty simple: Use your existing, un-ejected, and unpatchedcreate-react-app and replaceBrowserRouter
withStaticRouter
, deploy it toAWS Lambda, and finally put a CDN in front of it. You'll have your same React SPA, but now you can have pre-rendered HTML content for all routes in your application. This even works fine with frameworks likestyled-components orapollo client for usingGraphQL on AppSync.
Yes, this isserverless server-side rendering, so let's call itserverless pre-rendering for React. 🤯
- React with server-side rendering on AWS Lambda (English)
- React und server-side rendering mit AWS Lambda und CloudFront (German)
- TypeScript, for God's sake
- Basicun-ejectedcreate-react-app stored
./src
- SSR using
react-dom/server
andkoa in./server
- Infrastructure as Code usingAWS Cloud Development Kit in
./aws
- AWS Lambda for server-side (pre-)rendering ofReact SPA
- Amazon CloudFront tocache pre-rendered HTML and serve assets from S3
- AWS CodePipeline andAWS CodeBuild forContinious Deployments
The primary goal forcra-serverless is to use a defaultcreate-react-app setup without any changes and avoid to eject it from react-scripts.
# Start your local environment as always$> yarn start# Build your static SPA as always$> yarn build
You can develop and build SPA with the usual flow. Afterwards, you can run a local HTTP server withkoa to test-drive your server-side rendering. The built project is intended to be uploaded to AWS Lambda, but you can deploy the Node.js application to other services as well.
# Start local server-side rendering service$> yarn run:local# Build Node.js service for server-side rendering$> yarn build:server
All full-featured pipeline using AWS CodePipeline and AWS CodeBuild using theAWS Cloud Development Kit is included tosupport continious deployments. (Jump toDeployments and Configuration)
Most React applications use thereact-router-dom
withBrowserRouter
:
importReactfrom'react'import{BrowserRouter}from'react-router-dom'React.render(<BrowserRouter><App/></BrowserRouter>,document.getElementById('root'),)
Lucky us, aStaticRouter
exists as well andreact-dom
has a function calledrenderToString
:
import{renderToString}from'react-dom/server'import{StaticRouter}from'react-router-dom'constmarkup=renderToString(<StaticRouterlocation={path}><App/></StaticRouter>,)
Next, the value ofmarkup
will be injected into yourindex.html
file and that's it. In a Nutshell,cra-serverless uses existing features of the frameworks you already use and wraps them in a serverless architecture with AWS Lambda.
Based oncra-pipeline, all you need is apersonal GitHub Access Token and your own fork of this repository. If you have both things in place, store the token inAWS Systems Manager:
$> aws secretsmanager create-secret \ --name GitHubToken \ --secret-string abcdefg1234abcdefg56789abcdefg \ --region us-east-1{"ARN":"arn:aws:secretsmanager:us-east-1:123456789001:secret:GitHubToken-uNBxTr","Name":"GitHubToken","VersionId":"4acda3d1-877f-4032-b38e-17bc50239883"}
As everything is configured usingAWS Cloud Development Kit, you need to prepare (aka bootstrap) your AWS account once for the usage of theCDK in your desired AWS region:
$> yarn cdk bootstrap --region us-east-1⏳ Bootstrapping environment aws://123456789001/us-east-1...0/2| 5:06:49 PM| CREATE_IN_PROGRESS| AWS::S3::Bucket| StagingBucket0/2| 5:06:50 PM| CREATE_IN_PROGRESS| AWS::S3::Bucket| StagingBucket Resource creation Initiated1/2| 5:07:11 PM| CREATE_COMPLETE| AWS::S3::Bucket| StagingBucket✅ Environment aws://123456789001/us-east-1 bootstrapped.
Next, have a look at the./config.ts
file in the root folder and configure at least thegithub
section of the file.
exportconstconfig={name:'cra-serverless',github:{owner:'sbstjn',repository:'cra-serverless',},env:{region:'us-east-1'},}
After changing the GitHub repository information, just deploy the CloudFormation stack for the includedAWS CodePipeline and all resources will be created for you.
$> yarn cdk deploy cra-serverless-pipelinePipeline: deploying...Pipeline: creating CloudFormation changeset...✅ Pipeline
Head over to theAWS Management Console and watch the beauty of a deploy pipeline and CloudFormation stacks. All resources will be created for you, and after a while aCloudFront Distribution is available for the included example application.
- sbstjn.com for a detailed guide in English
- superluminar.io for a detailed guide in German
Feel free to use the code, it's released using theMIT license.
You are welcome to contribute to this project! 😘
To make sure you have a pleasant experience, please read thecode of conduct. It outlines core values and beliefs and will make working together a happier experience.
About
Serverless pre-rendering (SSR) for React SPA using AWS Lambda, S3, and CloudFront.
Topics
Resources
License
Code of conduct
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.