Technologies used in this post:
- Node Serverless Functions
This post assumes a basic knowledge of React, Next.js, and Node. However, if you have no knowledge of Next.js, that is okay. If you know React, you can still follow along here. Just recognize that the file structure will be different, and there are small differences in the component files. That is another topic for another day, however 😁.
Zeit's platform is focused on building workflows for the everyday developer. They provide a production-ready, continuous development platform for anyone from brand new devs, to hobbyists, all the way to Enterprise companies like Hulu.
Starting a React project using Next.js and spinning up serverless node functions is incredibly simple. It truly is an amazing world we live in!
As Zeit is all about workflows, they have made it so simple to begin a new project. To follow the tutorial here, you'll need to set up a new account on their website, zeit.co.
Once you are logged in, and in the dashboard, you will see a
New Project button at the top right. Click that button, then scroll down to the "From a template" section. The Next.js template is the first on the list of templates here.
Click on that template to navigate to the configuration page.
Here you will be able to name your project and also see a live example of the web app that is created with this template.
After giving your new project a name, click
Continue to move to the last step in the creation process.
The card in the UI now lets you create a Git repository, name the repository, and make it private if you wish. You will want to make a repo for this tutorial so you can clone the project onto your computer and work on it alongside me.
Also note that you should keep the name of the repo the same as the Zeit project.
Go ahead and hit
Behind the scenes here, Zeit will set up a modern React application powered by Next.js, add the repository to your GitHub account, and deploy the project on the Zeit platform. After clicking
Deploy you will be navigated to your project's deployment page, where you can watch the progress of the build and deployment.
After the project is deployed, you'll be able to view the deployment overview by clicking the URL under the "Deployment" header. Also, if you click on the preview image, a new tab will be opened where you can view the web app itself.
At this point, go to your repository and clone the project onto your machine. Then you'll be ready to add your first serverless function!
According to Zeit's docs, serverless functions "are pieces of code written with backend languages that take an HTTP request and provide a response". Let's look at our project and find the serverless function that was built out already that the React app consumes to get a current timestamp.
In your project, you will see a
/pages directory, and inside that, an
/api directory. Go ahead and open
date.js that is found in
/api. Here is your first glimpse at a serverless function!
This is just a node function that, as mentioned, takes an HTTP request and returns the current time. Let's take a look at how these functions work.
As shown above, the serverless function in our Next.js app is simply an exported function that receives a
req and a
res object, just like node API endpoints. It is important to note that this actually isn't using Express to build these objects. Zeit has built these objects to mirror what Express does, but it is not Express.
When the HTTP request comes in, this function calls
res.json to return the date stamp from the time the request came in. So Zeit allows our React app to make an async HTTP request to this function and will wait for the data to be returned. Let's see how that is set up on the client-side.
Looking at the node function, at first glance it isn't intuitive how you would make a request to that function. What's the endpoint? How do you pass data to it?
It's actually a really cool setup. The deployed (or even the development) instance knows that files in the
/api directory are serverless functions. It builds the functions in the cloud, and then any request that goes out to
/api/[file-name] is sent to that function.
So there is one single endpoint for each file, and one function for each endpoint. And we can make any HTTP requests to those functions by passing in the file name in the endpoint URL.
Here is the fetch call that is happening in our Next.js app in the
/pages/index.js file. Do you remember the name of the file that is housing the serverless function? Go ahead and look at it. That's right! It's
date.js. So the React app makes a GET request to
It's as simple as that! The call goes out asynchronously to the serverless function, awaits for the function to return the date, then sets the date to state so it can be displayed in the UI.
Now that you have seen this work, I want you to add this code to the JSX in your React app. Instead of the header saying "Welcome to Next!", I want it to greet you by name. So let's add some state and the extra piece in the JSX:
Once you have that added, follow these tasks:
- Add a new serverless file and function that will return your name (you can shape that data however you would like
- Build a new
useEffecthook that will query that new function to get the name back
- Set the returned name to state so it will display in the header
Don't scroll down! Try this out on your own first before you see my implementation below 😁
How'd you do? Did you get it working? Here is how I implemented this. I added a file called
get-name.js in the
/api directory. The serverless function in that file looks like this:
Then I fetched the data like this:
Is that about what you had? Share what you did differently in the comments!
Now you know how to add serverless functions to a React app using Next.js and Zeit. The simplicity of the workflow makes this so easy. I love the developer experience and have found that I can build features so much faster with these amazing tools. Let me know what use cases you find for serverless functions, and how you're liking Zeit and Next.js!