Building a Content Driven Blog with Next.js and Typescript

Build an easy to maintain and developer friendly blog using Next.JS with the added benefits of typescript.

created
2022-11-20
modified
2026-02-20
words
~746
reading
~4 min
Table of Contents

Almost every developer dreams of creating a stylish and functional blog for sharing their journeys about learning in tech. I want to quickly talk through my design choices for the beginning stages of building my own blog.

Content Management §

The key part to this all working nicely is being able to manage content well. As a developer who's already familiar with markdown, the next logical step would be using MDX to write all content.

MDX §

MDX is a framework that allows you to use Markdown style markup in tandem with JSX (React) components. The concept allows for a more interactive style blogging as you can include JS powered components in your own articles (like code examples that you can edit and run in real time).

I will be building MDX support using contentlayer1, which is a SDK that transforms content into type-safe JSON data. It plays nicely with Next.js, which makes it a perfect pair for a developer blog.

For the time being, I will store my posts in a `/content` directory within the project directory.

Design System §

By trade, I am a developer, not a designer, so I wanted to create something simple that looked nice with MDX content.

Style System §

When I am designing a website I begin by whipping up a style sheet. There are two major components that I like to decide, and use continually throughout a site.

  1. Colors
  2. Typography

Colors

When dealing with colors, I like to select one primary color, and one or two other colors that play nicely with the primary. You can use a tool like coolors2 to help with this type of planning. Check out this video by Web Design Life3 about picking web colors.

Typography

When choosing typography for a website, there is one concept that I consider to be _most_ important to selecting a font, and that is readability. When focusing on a content-heavy site, the most important thing to your users is actually being able to read what is on the site. In my opinion, there is a rather large difference between selecting a font because it looks good, or selecting a font because it's easy to read.

Fonts are interesting, because they can say just as much as colors can when it comes to web design. Sans-serif fonts often go hand in hand with a "modern" feel (think technology) while a serif font often conveys a feel of sophistication. If you are interested in reading more about selecting fonts, visit this google design article4.

Layout §

Selecting a layout for a website, especially something content-heavy like a blog, is another important stylistic decision to improve readability. The key here is to rely heavily on whitespace. 1

Why? Eye strain and fatigue is a very real experience to the viewers of a website. When designing, you want to keep the users of your site engaged, and on your site for as long as possible. Minimizing fatigue is an easy way to do this. I drew much of my layout from delba.dev5, who is a developer experience engineer at Vercel.

The layout she chose was excellent for content-driven sites, especially those that utilize link-headings and aside annotations.

Setup §

Now, let's get into the code. We will start by spinning up a Next.js6 app with TailwindCSS7 styling.

1. Create a new Next.JS App

There are a couple of ways to do this, which you can find here8.

yarn create next-app

Follow the prompts to generate the following directory structure (I added eslint and typescript support).\

├── README.md
├── next-env.d.ts
├── next.config.js
├── node_modules
├── package.json
├── pages
├── public
├── styles
├── tsconfig.json
├── .eslintrc.json
├── .gitignore
├── .next
└── yarn.lock

2. Initialize TailwindCSS Configuration

Running this command will generate tailwind.config.js and postcss.config.js for configuring tailwind.

yarn add -D tailwindcss postcss autoprefixer && \
npx tailwindcss init -p

3. Add your components

Edit the tailwind.config.js file and add the directories where you will have your .tsx files.

/** @type {import('tailwindcss').Config} */
module.exports = {
   content: ["./pages/**/*.{js,ts,jsx,tsx}", "./ui/**/*.{js,ts,jsx,tsx}"],
   theme: {
     extend: {},
   },
   plugins: [],
};

4. Code

Now that everything is setup, you can utilize react components alongside tailwind utility functions to quickly put together the wireframe layout to your site.

Now What? §

Coming up, we need to integrate contentlayer1 with our site so we can actually host the content that we write. Follow along as we create the type-safe schema for our content.

Inspirations §

Software Engineering and Web Development wouldn't be where it is today without the collaboration and community that exists between engineers. I wouldn't be able to create what I have without the following influences.