Subscribe

Using Bootstrap in Next.js + free starter

✍️

How to include bootstrap in a Next.js project

20 Oct, 2021 · 10 min read

I'll be completely honest with you. I haven't used Bootstrap in a while. But that doesn't take away that it's still widely used by many people.

A loyal reader Neeraj asked me to write down a tutorial on integrating Bootstrap with Next.js (Thank you, Neeraj, for this request ❤️).

So today, we'll look at how you can set up Bootstrap to work in a Next.js project.

Adding Bootstrap to Next.js permalink

Let's start from scratch so everyone can follow along.

First, we'll create a new Next.js application, which is as simple as running the following command:

npx create-next-app

All you have to do is pick a name 🥳

Then let's add the Bootstrap NPM package. By loading it with NPM, we can more easily update it later on.

npm install bootstrap

To load Bootstrap in our project, we only need to load the stylesheet in our _app.js file like so:

import 'bootstrap/dist/css/bootstrap.css';

function MyApp({Component, pageProps}) {
  return <Component {...pageProps} />;
}

export default MyApp;

Be aware this will load the complete bootstrap file! Unfortunately, there is no super-easy way to purge Bootstrap as Tailwind has.

Styling a basic Bootstrap template in Next.js permalink

Let's put it to the test and create a simple template. Open up your index.js page and modify it, so it looks like this:

import Head from 'next/head';

export default function Home() {
  return (
    <main className="d-flex flex-column min-vh-100">
      <Head>
        <title>Create Next App</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <div className="px-4 py-5 my-5 text-center flex-grow-1">
        <h1 className="display-5 fw-bold">Next.js + Bootstrap ❤️</h1>
        <div className="col-lg-6 mx-auto">
          <p className="lead mb-4">
            Quickly design and customize responsive mobile-first sites with Bootstrap, the
            world’s most popular front-end open source toolkit, featuring Sass variables
            and mixins, responsive grid system, extensive prebuilt components, and
            powerful JavaScript plugins.
          </p>
          <div className="d-grid gap-2 d-sm-flex justify-content-sm-center">
            <button type="button" className="btn btn-primary btn-lg px-4 gap-3">
              Primary button
            </button>
            <button type="button" className="btn btn-outline-secondary btn-lg px-4">
              Secondary
            </button>
          </div>
        </div>
      </div>
    </main>
  );
}

This should render a Bootstrap hero header:

Hero header Bootstrap in Next.js

It works, yes 🎉.

But does it also work for components?

Let's create a components directory and add a file called Header.js.

const Header = () => {
  return (
    <header className="p-3 bg-dark text-white">
      <div className="container">
        <div className="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">
          <a
            href="#"
            className="d-flex align-items-center mb-2 mb-lg-0 text-white text-decoration-none"
          >
            LOGO
          </a>

          <ul className="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
            <li>
              <a href="#" className="nav-link px-2 text-secondary">
                Home
              </a>
            </li>
            <li>
              <a href="#" className="nav-link px-2 text-white">
                Features
              </a>
            </li>
            <li>
              <a href="#" className="nav-link px-2 text-white">
                Pricing
              </a>
            </li>
            <li>
              <a href="#" className="nav-link px-2 text-white">
                FAQs
              </a>
            </li>
            <li>
              <a href="#" className="nav-link px-2 text-white">
                About
              </a>
            </li>
          </ul>

          <form className="col-12 col-lg-auto mb-3 mb-lg-0 me-lg-3">
            <input
              type="search"
              className="form-control form-control-dark"
              placeholder="Search..."
              aria-label="Search"
            />
          </form>

          <div className="text-end">
            <button type="button" className="btn btn-outline-light me-2">
              Login
            </button>
            <button type="button" className="btn btn-warning">
              Sign-up
            </button>
          </div>
        </div>
      </div>
    </header>
  );
};
export default Header;

And let's create another component called Footer.js.

const Footer = () => {
  return (
    <div className="container">
      <footer className="py-3 my-4">
        <ul className="nav justify-content-center border-bottom pb-3 mb-3">
          <li className="nav-item">
            <a href="#" className="nav-link px-2 text-muted">
              Home
            </a>
          </li>
          <li className="nav-item">
            <a href="#" className="nav-link px-2 text-muted">
              Features
            </a>
          </li>
          <li className="nav-item">
            <a href="#" className="nav-link px-2 text-muted">
              Pricing
            </a>
          </li>
          <li className="nav-item">
            <a href="#" className="nav-link px-2 text-muted">
              FAQs
            </a>
          </li>
          <li className="nav-item">
            <a href="#" className="nav-link px-2 text-muted">
              About
            </a>
          </li>
        </ul>
        <p className="text-center text-muted">© 2021 Company, Inc</p>
      </footer>
    </div>
  );
};

export default Footer;

If we head back to our index.js we can import these two components to see what happens.

import Header from '../components/Header';
import Footer from '../components/Footer';

export default function Home() {
  return (
    <main className='d-flex flex-column min-vh-100'>
      <Header />
      <!-- Hero code -->
      <Footer />
    </main>
  );
}

Let's refresh our page and see what we have.

Next.js Bootstrap starter template

And there you go, a super-easy way to include Bootstrap in your Next.js application.

You can find the complete starter code on GitHub.

Thank you for reading, and let's connect! permalink

Thank you for reading my blog. Feel free to subscribe to my email newsletter and connect on Facebook or Twitter

Spread the knowledge with fellow developers on Twitter
Tweet this tip
Powered by Webmentions - Learn more

Read next 📖

NextJS and TypeScript

3 Mar, 2022 · 4 min read

NextJS and TypeScript

Adding code highlighting to markdown code blocks

3 Feb, 2022 · 3 min read

Adding code highlighting to markdown code blocks

Join 1365 devs and subscribe to my newsletter