Discover the key differences between `next export` and `next build` in Next.js, and learn which approach is best suited for your project's needs.
This article delves into the differences between two key Next.js commands: next build and next export. While both prepare your application for deployment, they serve distinct purposes and result in different output structures. Let's explore each command and understand when to use them effectively.
Next.js offers two main commands for preparing your application for deployment: next build and next export. While they might seem similar, they serve distinct purposes and result in different output structures. Let's break down each command and explore when to use them:
1. next build
.next directory containing optimized JavaScript, CSS, and HTML files. This directory is designed to be served by a Node.js server, allowing for dynamic rendering and server-side functionality.next build is the way to go. It enables SSR and SSG, ensuring optimal performance and SEO.next build is essential.next build is required to enable ISR.Example (JavaScript):
// This code snippet demonstrates fetching data on the server-side using getServerSideProps
function MyPage({ data }) {
// ...
}
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data } };
}2. next export
out directory (configurable) containing static HTML files and any necessary assets. This directory can be served directly by any web server, without needing a Node.js environment.next export is a good choice. It offers simplicity and fast loading times.Example (JavaScript):
// This code snippet demonstrates a simple static page
function MyPage() {
return (
<div>
<h1>Welcome to my static page!</h1>
<p>This content is pre-rendered at build time.</p>
</div>
);
}
export default MyPage;Key Differences and Considerations:
next build allows for dynamic rendering and server-side functionality, while next export creates a purely static website.next export might have a slight edge for static content due to its simplicity.next build requires a Node.js server, while next export can be deployed on any web server.next build.Choosing the Right Approach:
The choice between next build and next export depends on your application's specific needs and complexity. If you require dynamic rendering or server-side features, next build is the way to go. For simple static websites, next export offers a lightweight and efficient solution.
This code demonstrates Next.js features for dynamic and static content generation. The first example uses next build and getServerSideProps to fetch product data from an API on each request, enabling dynamic rendering. The second example uses next export, getStaticProps, and getStaticPaths to pre-render blog posts at build time, creating static HTML files for faster loading. The choice between these approaches depends on the nature of the content and the desired level of dynamism.
While the provided article explains the concepts well, let's illustrate them with more concrete JavaScript examples:
next build Example - Dynamic Content with API Calls:
// pages/products/[id].js
function Product({ productData }) {
// Render product details using productData
return (
<div>
<h1>{productData.name}</h1>
<p>{productData.description}</p>
{/* ... */}
</div>
);
}
export async function getServerSideProps(context) {
const { id } = context.query;
const res = await fetch(`https://api.example.com/products/${id}`);
const productData = await res.json();
return { props: { productData } };
}
export default Product;Explanation:
[id].js defines a dynamic route, allowing us to fetch and display different products based on the ID in the URL.getServerSideProps: This function runs on the server during each request. It fetches product data from an external API based on the product ID.productData is passed as a prop to the Product component, enabling dynamic rendering of product details.next export Example - Static Blog Page:
// pages/blog/[slug].js
function BlogPost({ postData }) {
// Render blog post content using postData
return (
<div>
<h1>{postData.title}</h1>
<div dangerouslySetInnerHTML={{ __html: postData.content }} />
{/* ... */}
</div>
);
}
export async function getStaticProps(context) {
const { slug } = context.params;
// Fetch blog post data from a CMS or local markdown files
const postData = await getBlogPostData(slug);
return { props: { postData } };
}
export async function getStaticPaths() {
// Get a list of all blog post slugs
const slugs = await getAllBlogPostSlugs();
return {
paths: slugs.map((slug) => ({ params: { slug } })),
fallback: false,
};
}
export default BlogPost;Explanation:
getStaticProps and getStaticPaths to pre-render blog posts at build time.getStaticPaths: This function defines the list of paths (slugs) to be statically generated.getStaticProps: For each path, this function fetches the corresponding blog post data.Choosing the Right Approach:
next build when you need dynamic content, server-side rendering, or features like API routes and ISR.next export for static websites with content that doesn't change frequently, prioritizing simplicity and fast loading times.Hybrid Approaches and Incremental Static Regeneration (ISR):
getStaticProps and getServerSideProps in your application. This enables a hybrid approach where some pages are statically generated, while others are rendered dynamically on the server.Deployment Considerations:
next build: Requires a Node.js environment. Popular options include Vercel, Netlify (with Node.js support), AWS EC2, and Heroku.next export: Can be deployed on any static hosting platform, such as Netlify, GitHub Pages, AWS S3, or Firebase Hosting.next build.Performance Optimization:
Additional Features:
Community and Resources:
By understanding the nuances of next build and next export, you can make informed decisions about the best approach for your Next.js projects, ensuring optimal performance, scalability, and developer experience.
| Feature | next build |
next export |
|---|---|---|
| Purpose | Creates optimized production build for SSR or SSG. | Generates a static HTML version of your app. |
| Output |
.next directory with optimized JS, CSS, and HTML. |
out directory (configurable) with static HTML files and assets. |
| Use Cases | Dynamic content, server-side functionality, ISR. | Static content, simple deployments. |
| Performance | Excellent, especially with SSR and SSG. | Excellent, especially for static content. |
| Deployment | Requires a Node.js server. | Can be deployed on any web server. |
| Features | Supports all Next.js features, including API routes and ISR. | Limited to static features; no API routes or ISR. |
| Example | Server-side data fetching with getServerSideProps. |
Simple static page with pre-rendered content. |
Choosing the right command depends on your application's needs:
next build.next export.Next.js provides developers with powerful options for building and deploying web applications. Understanding the core differences between next build and next export is crucial for making informed decisions that align with your project's specific requirements.
Dynamic Content and Server-Side Features:
If your application demands dynamic content generation, server-side rendering, or utilizes features like API routes and Incremental Static Regeneration (ISR), next build is the optimal choice. It empowers you to create interactive and data-driven experiences while maintaining excellent performance and SEO benefits.
Static Websites and Simplicity:
For projects that primarily consist of static content and prioritize simplicity and fast loading times, next export offers a compelling solution. By generating static HTML files, you can easily deploy your website on a wide range of hosting platforms without the need for a Node.js environment.
Hybrid Approaches and Flexibility:
Next.js also allows for hybrid approaches, combining static site generation with server-side rendering to cater to diverse content needs within a single application. This flexibility empowers developers to tailor their strategies based on the specific requirements of each page or section.
Ultimately, the choice between next build and next export hinges on your project's unique goals and technical demands. By carefully considering the trade-offs and leveraging the strengths of each approach, you can build high-performance, scalable, and user-friendly web applications with Next.js.
Build fails Next.js - Render | Hi 👋 Has anyone been successfully in deploying a Next.js site to Render? I have tried Deploy a Next.js App | Render · Cloud Hosting for Developers as well as a few other things but either the build always fails or I receive a page with ‘Not Found’. Really keen to use Render for the frontend. Thanks!
Let's Build Micro Frontends with NextJS and Module Federation! | by ... | How to use one of the new features of Webpack 5 - Module Federation with NextJS. Game changing architecture for a game changing framework.
Failed: an internal error occurred - Cloudflare Pages - Cloudflare ... | I am trying to setup my nextjs application for the first time. I am keep getting “Failed: an internal error occurred”. Since i am new to the Cloudflare, can someone help me to identify the issue. Command i executed next build & next start. I was under the assumption the issue could be due to the wrong out out folder and still the issue exists. Can you please help me to fix the same.
Blank page showing up for Next.js deployment - Support - Netlify ... | Site name: https://chimerical-fudge-9e7f81.netlify.app/
Nextjs Prismic new build API preview build errors - Developing with ... | Hi, Nextjs newbie here. I have a new Nextjs app connected with Prismic (npx create-next-app@latest ). At first I could build the app (npm run build ), but after adding Prismic Slicemachine with npx @slicemachine/init@latest I get two errors regarding the build-in API preview of Prismic (see screenshots). Can anybody help me please? Thank you! Error occurred prerendering page "/api/preview". Read more: Prerender Error | Next.js Error: Page with dynamic = "error" couldn't be rendered statically b...