aliaset
Version:
twind monorepo
176 lines (118 loc) • 4.09 kB
Markdown
---
section: Use With
title: Next.js
package: '@twind/with-next'
example: true
excerpt: |
Setting up Twind for seamless integration in a [Next.js](https://nextjs.org) project.
next: ./with-remix.md
---
## 🤝 Compatibility
| @twind/with-remix | next |
| ------------------- | ------ |
| `>=1.0.0-next.1 <1` | `12.x` |
## 📦 Installation
1. :::cols-12{.gap-4}
::col-span-4
**Install from npm**
`twind` and `@twind/with-next` are available on npm and need to be installed together.
::col-span-8
```sh
npm install @twind/core @twind/with-next
```
:::
1. :::cols-12{.gap-4}
::col-span-4
**Define the configuration**
Using an extra file, `twind.config.js`, allows some tools like [IntelliSense](./installation) to find your configuration.
::col-span-8
```js title="twind.config.js"
import { defineConfig } from '@twind/core'
export default defineConfig({
/* @twind/with-next will use hashed class names in production by default
* If you don't want this, uncomment the next line
*/
// hash: false,
})
```
:::
1. :::cols-12{.gap-4}
::col-span-4
**Load Twind in the [App component](https://nextjs.org/docs/advanced-features/custom-app)**
`install` creates and registers a twind instance that will generate the styles. This allows third-party packages to import `tw` from the twind package and get the same instance.
::col-span-8
```js title="pages/_app.js"
import install from '@twind/with-next/app'
import config from '../twind.config'
export default install(config)
```
::col-span-4
If you are using a custom App component you need to pass the it to `install`.
::col-span-8
```diff title="pages/_app.js"
+ import install from '@twind/with-next/app'
+ import config from '../twind.config'
function MyApp({ Component, pageProps }) {
/* ... */
}
- export default MyApp
+ export default install(config, MyApp)
```
:::
1. :::cols-12{.gap-4}
::col-span-4
**Enable Twind [in Document component](https://nextjs.org/docs/advanced-features/custom-document)**
Enable server-side rendering of all the styles that are used within the HTML and sending them to the client.
::col-span-8
```js title="pages/_document.js"
export { default } from '@twind/with-next/document'
```
::col-span-4
If you are using a custom Document component you need to pass the it to `install`.
::col-span-8
```diff title="pages/_document.js"
import Document, { Html, Head, Main, NextScript } from 'next/document'
+ import install from '@twind/with-next/document'
class MyDocument extends Document {
/* ... */
}
+ export default install(MyDocument)
```
:::
1. <details>
<summary><strong>Optional</strong>: Install and configure the recommended presets <a href="./preset-autoprefix"><code>@twind/preset-autoprefix</code></a> and <a href="./preset-tailwind"><code>@twind/preset-tailwind</code></a>.</summary>
:::cols-12{.gap-4}
::col-span-4
**Install the presets**
All presets are [available on npm](https://www.npmjs.com/search?q=keywords:twind-preset).
::col-span-8
```sh
npm install @twind/preset-autoprefix @twind/preset-tailwind
```
:::
:::cols-12{.gap-4}
::col-span-4
**Configure the presets**
Each preset must be added to the `presets` array in the configuration.
::col-span-8
```js title="twind.config.js" [2-3,6]
import { defineConfig } from '@twind/core'
import presetAutoprefix from '@twind/preset-autoprefix'
import presetTailwind from '@twind/preset-tailwind'
export default defineConfig({
presets: [presetAutoprefix(), presetTailwind()],
})
```
:::
</details>
1. :::cols-12{.gap-4}
::col-span-4
**Start using Twind in your components**
Start using Twind classes to style your content.
::col-span-8
```jsx title="pages/index.js"
export default function Hello() {
return <h1 className="text-3xl font-bold underline">Hello world!</h1>
}
```
:::