Back to home

PrerequisitesGetting startedSetting up the pagesAdding a helper to redirect WIP to home in productionUpdating the pageTrying out our helper in developmentSummaryResources and further reading
Dev Only Next.js Routes main image

Dev Only Next.js Routes

This post will demonstrate how to create a helper to redirect from pages in Next.js that you want to leave for development only.

The redirects will occur serverside.

Source code can be found here.

Prerequisites

  1. Basic familiarity with Create Next App.
  2. create-next-app installed.
  3. Basic familiarity with Next.js.

Getting started

We will let create-next-app create the project directory hello-world for us and create a page for route /wip.

Run the following in your terminal:

1 2 3 4 5 $ npx create-next-app hello-world # ... creates Next.js app for us $ cd hello-world # Create a demo work-in-progress route to only be used in development $ touch pages/wip.js

At this stage, a working Next.js app is ready for us.

Setting up the pages

In our demo, we want to update the home page pages/index.js and copy across similar code for our work-in-progress page pages/wip.js.

Update pages/index.js to look like the following:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import Head from "next/head"; import styles from "../styles/Home.module.css"; import Link from "next/link"; export default function Home() { return ( <div className={styles.container}> <Head> <title>Create Next App</title> <meta name="description" content="Generated by create next app" /> <link rel="icon" href="/favicon.ico" /> </Head> <main className={styles.main}> <h1 style={{ marginBottom: "12px" }} className={styles.title}> Welcome to <a href="https://nextjs.org">Next.js!</a> </h1> <Link href="/wip" passHref> <a style={{ color: "blue" }}>Go to WIP</a> </Link> </main> </div> ); }

We are doing some basic style here but the main part to note is that we are using the Link component from next/link to update our website to /wip on click.

Let's do a similar job for pages/wip.js:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import Head from "next/head"; import styles from "../styles/Home.module.css"; import Link from "next/link"; export default function Wip() { return ( <div className={styles.container}> <Head> <title>Create Next App</title> <meta name="description" content="Generated by create next app" /> <link rel="icon" href="/favicon.ico" /> </Head> <main className={styles.main}> <h1 style={{ marginBottom: "12px" }} className={styles.title}> WIP </h1> <Link href="/" passHref> <a style={{ color: "blue" }}>Home</a> </Link> </main> </div> ); }

You'll notice some minor differences but essentially we can toggle back and forward between / and /wip.

Let's start up the development server by running npm run dev and then visit http://localhost:3000.

Once started, note that you can click back and forward on the browser.

Adding a helper to redirect WIP to home in production

In general, when you want to do a server-side redirect you can use the Next.js function getServerSideProps:

1 2 3 4 5 6 7 8 export const getServerSideProps = () => { return { redirect: { permanent: false, destination: "/", }, }; };

The above code would always redirect the page it is added to back to the home page.

What we want to do is create a helper that redirects to /wip when in production but otherwise renders as expected.

We can do this by modifying the above code and abstracting it out for reusability.

Create a file utils/devOnly.js from the root of your project and add the following:

1 2 3 4 5 6 7 8 9 10 11 12 export const devOnly = () => { if (process.env.NODE_ENV === "production") { return { redirect: { permanent: false, destination: "/", }, }; } return { props: {} }; };

This code tells Next.js to always redirect to / when the NODE_ENV environment is production. Next.js will set NODE_ENV to production for us in production builds.

We are now ready to update pages/wip.js.

Updating the page

Update pages/wip.js to be the following:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import Head from "next/head"; import styles from "../styles/Home.module.css"; import Link from "next/link"; // ! Added import { devOnly } from "../utils/devOnly"; export default function Wip() { return ( <div className={styles.container}> <Head> <title>Create Next App</title> <meta name="description" content="Generated by create next app" /> <link rel="icon" href="/favicon.ico" /> </Head> <main className={styles.main}> <h1 style={{ marginBottom: "12px" }} className={styles.title}> WIP </h1> <Link href="/" passHref> <a style={{ color: "blue" }}>Home</a> </Link> </main> </div> ); } // ! Added export const getServerSideProps = devOnly;

All we do is import our new helper function from the relative path it lives in and add export const getServerSideProps = devOnly; to the bottom of the file. Easy as pie!

Trying out our helper in development

If you have stopped your server, run npm run dev again. You'll notice that you can still click back and forward from / to /wip. This is expected as NODE_ENV is set to development in development mode.

To test production, we can run the following to start a production build:

1 2 3 4 # Make a production build $ npm run build # Run the production code $ npm start

The production code will now start up on http://localhost:3000.

Head to the home page and attempt to get to /wip. This time, we are constantly redirected to /. Great success!

Summary

Today's post demonstrated how to protect development-only routes that you are not ready to deploy to production. We also saw how to use a helper to abstract out code that is only needed in development.

Resources and further reading

  1. Basic familiarity with Create Next App.
  2. Basic familiarity with Next.js.

Photo credit: jplenio

Dennis O'Keeffe

@dennisokeeffe92
  • Melbourne, Australia

Hi, I am a professional Software Engineer. Formerly of Culture Amp, UsabilityHub, Present Company and NightGuru.
I am currently working on workingoutloud.dev, Den Dribbles and LandPad .

Related articles


1,200+ PEOPLE ALREADY JOINED ❤️️

Get fresh posts + news direct to your inbox.

No spam. We only send you relevant content.