Next.js 13 - What are the new features?

necatiozmen

Necati Özmen

Posted on November 12, 2022

Next.js 13 - What are the new features?

Author: Michael Hungbo

Introduction

Next.js is a popular React.js framework for building complex and performant web applications. Since its launch in 2016, Next.js has been constantly improved and updated for better performance and a great developer experience. Next.js 13 was announced at the just concluded Next.js Conference by Next.js and Vercel CEO, Guillermo Rauch. The announcement also re-affirms Next.js commitment and mission to revolutionize web development.

This new release comes with upgrades and new additions that let you create dynamic applications without limits and supports the latest features in React.js 18. Some even say Next.js 13 is the real React.js 18 (well, that's true to some extent).

This article will explore the latest features and also take you through installing and upgrading your codebases to Next.js 13. Let's dive in!

Steps we'll cover:

Installing Next.js 13

To create a Next.js 13 app, you need to have Node.js 14 or later installed on your computer. Next, run any of the commands below to install Next.js 13:

npx create-next-app@latest --experimental-app
# or
yarn create next-app --experimental-app
# or
pnpm create next-app --experimental-app
Enter fullscreen mode Exit fullscreen mode

With the exception of a new app folder, the generated files and folders are almost the same as before in older versions.

Next, run npm run dev to start the development server and you're good to go!

Latest Features in Next.js 13

Now, let's look at some of the latest and most interesting features in the new release.

A brand new app/ directory

One of the notable features in Next.js 13 is a brand new app directory (beta). The app directory file-system based router is an upgrade to Next.js page routing system. The app folder comes with a few special files that can be used for different states and UI of your application. For example, you can use an optional error.tsx file to isolate errors to specific parts of your application.

The app directory supports nested layouts, streaming, React's Server Components - the app directory will treat components inside of it as Server Components by default - nested routing and more. It works well alongside the pages folder so it can be adopted incrementally.

Turbopack (Alpha)

Next.js 13 is built on top of Turbopack, a native, rust-based compiler, and successor to Webpack. Turbopack takes only 1.8 seconds during startup compared to Webpack, which takes 16.5 seconds. It's also 700x faster during updates than Webpack, 10x faster updates than Vite, and 4x faster cold starts than Webpack.

It's interesting to note that Turbopack development is being led by the creator of Webpack, Tobias Koppers. Turbopack alpha is currently supported only in development. You can run the following command to try it out next dev --turbo.

A new way to fetch data

Another cool feature in Next.js 13 is a new data fetching method built on top of the native fetch() Web API. It allows you to use async/await to asynchronously fetch data in Server Components created with JavaScript await syntax, with performance benefits such as automatic caching and data re-validation.

It also comes with a use hook for unwrapping values from a Promise. The use hook can be used inside normal components, hooks and on the client. Think of it like a React-only version of await. use is being developed by the React team and uses Suspense under the hood.

Below is an example taken from here showing how to fetch data with async/await in Server Components.

// app/page.tsx

async function Note({id, isEditing}) {
  const note = await db.posts.get(id);
  return (
    <div>
      <h1>{note.title}</h1>
      <section>{note.body}</section>
      {isEditing ? <NoteEditor note={note} /> : null}
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Brand new next/font for font optimization

Next.js 13 introduces a brand new font module, next/font, that automatically optimizes your local and Google fonts for performance, prevents layout shifts using the CSS size-adjust property and many other performance benefits.

CSS and font files are downloaded at build time with the rest of your static assets, and no requests are sent to Google by the browser.

Example usage:

import { Inter } from '@next/font/google';

const inter = Inter();

<html className={inter.className}>
Enter fullscreen mode Exit fullscreen mode

Newly improved next/link and next/image components

The next/link and next/image components are some of the core features in Next.js that got an upgrade in Next.js 13. next/image saw new performance upgrades such as less client-side JavaScript, faster image load times and a required alt attribute for accessibility.

The next/link component used for client-side transition now has a built-in <a> element by default. This means you won't have to manually add <a> like before.

Before:

import Link from 'next/link'
...
<Link href="/about">
  <a>About</a>
</Link>

Enter fullscreen mode Exit fullscreen mode

Next.js 13:

import Link from 'next/link'
<Link href="/about">
  About // <a> will be added automatically in Next.js 13
</Link>
Enter fullscreen mode Exit fullscreen mode

Is your CRUD app overloaded with technical debt?

Meet the headless, React-based solution to build sleek CRUD applications. With refine, you can be confident that your codebase will always stay clean and boilerplate-free.

Try refine to rapidly build your next CRUD project, whether it's an admin panel, dashboard, internal tool or storefront.


refine blog logo


@vercel/og for Open Graph Image Generation

Next.js 13 ships with a new library, @vercel/og that optimizes the generation of social media cards via the Open Graph Protocol. The library exports an ImageResponse function that generates a static image which you can then use in your <meta> tags.

For example, given an api route pages/api/og.tsx, you can generate a social card image with HTML and CSS like below:

import { ImageResponse } from '@vercel/og';

export const config = {
  runtime: 'experimental-edge',
};

export default function () {
  return new ImageResponse(
    (
      <div
        style={{
          fontSize: 128,
          background: 'white',
          width: '100%',
          height: '100%',
          display: 'flex',
          textAlign: 'center',
          alignItems: 'center',
          justifyContent: 'center',
        }}
      >
        Hello world!
      </div>
    ),
    {
      width: 1200,
      height: 600,
    },
  );
}
Enter fullscreen mode Exit fullscreen mode

Now, if you navigate to http://localhost:3000/api/og, you should see an image generated with the text Hello World!.

You can read more about OG image generation here.

Some other new upgrades and additions include Streaming and Middleware API updates.


discord banner

Upgrading to Next.js 13

In one of the previous sections, we talked about creating a new Next.js 13 app. In this section, we'll look at how you can upgrade your existing codebases to Next.js 13. The easiest way to upgrade your app to Next.js 13 is to run any of the following commands using your preferred package manager:

npm i next@latest react@latest react-dom@latest eslint-config-next@latest
# or
yarn upgrade next react react-dom eslint-config-next --latest
# or
pnpm up next react react-dom eslint-config-next --latest
Enter fullscreen mode Exit fullscreen mode

If you want to only upgrade specific features, you can run a codemod transformation for those particular features. For example, the following command will upgrade links in your pages folder to Next.js 13 when run from the root of your app:

npx @next/codemod new-link ./pages
Enter fullscreen mode Exit fullscreen mode

You can check the documentations here for the available Next.js codemods.

Conclusion

Next.js is one of the popular tools for building the Web and it's constantly evolving. This article summarized the latest features in Next.js 13 and you learned how to upgrade your codebases to use these new features.

The documentation for Next.js 13 is currently in Beta and can be found here, and there is now also a dark mode available! :)

With Next.js the possibilities are endless and I can't wait to see the cool stuff you build next. Happy coding! you build next. Happy coding!s and I can't wait to see the cool stuff you build next. Happy coding!

💖 💪 🙅 🚩
necatiozmen
Necati Özmen

Posted on November 12, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related