Files
Jiwon ChoiandGitHub 5a4b56fb0f chore(docs): mention that next.config.js must have default export (#62341)
### What?

When the next config has no default export, it does not inform the user
correctly, but as:

```ts
// next.config.mjs

/** @type {import('next').NextConfig} */
export const config = {
  // ...
}
```

```sh
⚠ Invalid next.config.mjs options detected: 
⚠     Unrecognized key(s) in object: 'config'
⚠ See more info here: https://nextjs.org/docs/messages/invalid-next-config
```

### Why?

The options within the named exported config may be inactivated without
notice.

### How?

Since we use dynamic import for the config, check if `userConfigModule`
has a `default` export, and if not, throw an error.
Also, added to the docs to address by text that the config needs a
default export.
2024-02-22 15:37:13 -05:00

97 lines
2.9 KiB
Plaintext

---
title: next.config.js Options
description: Learn how to configure your application with next.config.js.
---
{/* The content of this doc is shared between the app and pages router. You can use the `<PagesOnly>Content</PagesOnly>` component to add content that is specific to the Pages Router. Any shared content should not be wrapped in a component. */}
Next.js can be configured through a `next.config.js` file in the root of your project directory (for example, by `package.json`) with a default export.
```js filename="next.config.js"
// @ts-check
/** @type {import('next').NextConfig} */
const nextConfig = {
/* config options here */
}
module.exports = nextConfig
```
`next.config.js` is a regular Node.js module, not a JSON file. It gets used by the Next.js server and build phases, and it's not included in the browser build.
If you need [ECMAScript modules](https://nodejs.org/api/esm.html), you can use `next.config.mjs`:
```js filename="next.config.mjs"
// @ts-check
/**
* @type {import('next').NextConfig}
*/
const nextConfig = {
/* config options here */
}
export default nextConfig
```
You can also use a function:
```js filename="next.config.mjs"
// @ts-check
export default (phase, { defaultConfig }) => {
/**
* @type {import('next').NextConfig}
*/
const nextConfig = {
/* config options here */
}
return nextConfig
}
```
Since Next.js 12.1.0, you can use an async function:
```js filename="next.config.js"
// @ts-check
module.exports = async (phase, { defaultConfig }) => {
/**
* @type {import('next').NextConfig}
*/
const nextConfig = {
/* config options here */
}
return nextConfig
}
```
`phase` is the current context in which the configuration is loaded. You can see the [available phases](https://github.com/vercel/next.js/blob/5e6b008b561caf2710ab7be63320a3d549474a5b/packages/next/shared/lib/constants.ts#L19-L23). Phases can be imported from `next/constants`:
```js
// @ts-check
const { PHASE_DEVELOPMENT_SERVER } = require('next/constants')
module.exports = (phase, { defaultConfig }) => {
if (phase === PHASE_DEVELOPMENT_SERVER) {
return {
/* development only config options here */
}
}
return {
/* config options for all phases except development here */
}
}
```
The commented lines are the place where you can put the configs allowed by `next.config.js`, which are [defined in this file](https://github.com/vercel/next.js/blob/canary/packages/next/src/server/config-shared.ts).
However, none of the configs are required, and it's not necessary to understand what each config does. Instead, search for the features you need to enable or modify in this section and they will show you what to do.
> Avoid using new JavaScript features not available in your target Node.js version. `next.config.js` will not be parsed by Webpack, Babel or TypeScript.
This page documents all the available configuration options: