In this workshop we'll be building a framework built on React Server Components and Server Functions from scratch. No build tools. No TypeScript, no Vite, no JSX. Just the Browser, Node.js, and React. This is how you develop a deep understanding of something. Let's go!
- Deep experience with React and features like Suspense and useDeferredValue
- Some experience with Node.js will be helpful
Here are some resources you can read before taking the workshop to get you up to speed on some of the tools and concepts we'll be covering:
- React Suspense Workshop
- "Mind The Gap" by Ryan Florence at Big Sky Dev Con 2024
- React for Two Computers - Dan Abramov at React Conf 2024
- Introducing Zero-Bundle-Size React Server Components
- React Server Components RFC
- "React from Another Dimension" by Dan Abramov at Remix Conf 2023
All of these must be available in your PATH
. To verify things are set up
properly, you can run this:
git --version
node --version
npm --version
If you have trouble with any of these, learn more about the PATH environment variable and how to fix it here for windows or mac/linux.
This is a pretty large project (it's actually many apps in one) so it can take several minutes to get everything set up the first time. Please have a strong network connection before running the setup and grab a snack.
Warning: This repo is very large. Make sure you have a good internet connection before you start the setup process. The instructions below use
--depth
to limit the amount you download, but if you have a slow connection, or you pay for bandwidth, you may want to find a place with a better connection.
Follow these steps to get this set up:
git clone --depth 1 https://github.com/epicweb-dev/react-server-components.git
cd react-server-components
npm run setup
If you experience errors here, please open an issue with as many details as you can offer.
Once you have the setup finished, you can start the app with:
npm start
Learn all about the workshop app on the Epic Web Getting Started Guide.
This workshop is heavily influenced by @sebmarkbage's work in this commit. Also, shout-out to @gaearon and @rickhanlonii for their help on this as well.