Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/dlehmhus/next-with-linaria

Linaria webpack loader for Next.js 13
https://github.com/dlehmhus/next-with-linaria

css linaria loader nextjs webpack

Last synced: 3 months ago
JSON representation

Linaria webpack loader for Next.js 13

Awesome Lists containing this project

README

        

# Next.js 13 + Linaria

## What is this?

The new Next.js 13 app directory feature doesn't work with the [@linaria/webpack5-loader](https://github.com/callstack/linaria/tree/master/packages/webpack5-loader) anymore, therefore the [next-linaria](https://github.com/Mistereo/next-linaria) package sadly also doesn't work. This package solves that issue with a custom linaria webpack loader and [Webpack Virtual Modules](https://github.com/sysgears/webpack-virtual-modules).

## Try it before you buy it

[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/edit/next-with-linaria?file=app%2Fpage.tsx)

## Installation

npm

```sh
npm install next-with-linaria @linaria/babel-preset @linaria/core @linaria/react
```

pnpm

```sh
pnpm install next-with-linaria @linaria/babel-preset @linaria/core @linaria/react
```

yarn

```sh
yarn add next-with-linaria @linaria/babel-preset @linaria/core @linaria/react
```

## Usage

```js
// next.config.js
const withLinaria = require('next-with-linaria');

/** @type {import('next-with-linaria').LinariaConfig} */
const config = {
// ...your next.js config
};
module.exports = withLinaria(config);
```

Now you can use linaria in all the places where Next.js also allows you to use [CSS Modules](https://beta.nextjs.org/docs/styling/css-modules). That currently means in every file in in the `app` directory. And the `pages` directory of course as well.

## Global Styles Restrictions

If you want to use linaria for [global styling](https://beta.nextjs.org/docs/styling/global-styles), you need to place those styles into a file with the suffix `.linaria.global.(js|jsx|ts|tsx)`:

```tsx
// app/style.linaria.global.tsx
import { css } from '@linaria/core';

export const globals = css`
:global() {
html {
box-sizing: border-box;
}

*,
*:before,
*:after {
box-sizing: inherit;
}

@font-face {
font-family: 'MaterialIcons';
src: url(../assets/fonts/MaterialIcons.ttf) format('truetype');
}
}
`;
```

```tsx
// app/layout.tsx
import './style.linaria.global';

export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (

{children}

);
}
```

This convention is needed because the loader needs to know which files contain global styles and which don't.