使用するバージョン
react : 17.0.2
linaria : 3.0.0-beta

プロジェクトの作成

Create React Appでプロジェクトを作成します。
今回はTypeScriptで作成。

$ npx create-react-app linaria-test --template typescript

作成したlinaria-test をカレントにします。

$ cd linaria-test

Linariaのインストール

$ yarn add @linaria/core @linaria/react @linaria/babel-preset @linaria/shaker

webpack-loaderもインストールします。

$ yarn add -D @linaria/webpack-loader

Create React App用のWebpack設定ライブラリ

Linariaはwebpack.config.jsを編集する必要があります。
Create React App 環境ではwebpack.config.jsが隠蔽されているので、これを編集できるようにします。
(Create React App を使用していなく、webpack.configを編集できる環境の場合は飛ばしてください)

ejectして編集する方法もありますが、今回はライブラリを導入して上書きで動作させます。

$ yarn add -D customize-cra react-app-rewired

package.jsonを編集してreact-app-rewiredから起動するようにします。

package.json

  1. "scripts": {
  2. "start": "react-app-rewired start",
  3. "build": "react-app-rewired build",
  4. "test": "react-app-rewired test --env=jsdom",
  5. "eject": "react-scripts eject"
  6. },

webpack.configの編集

通常はwebpack.config.jsを編集しますが、先ほどreact-app-rewiredを使えるようにしたので、config-overrides.jsというファイルを作成します。
このファイルを編集することで、Create React App 標準のwebpack.config.jsを生かしつつ上書きで設定ができるようになります。

config-overrides.js

  1. const { useBabelRc, override, addWebpackModuleRule } = require('customize-cra')
  2.  
  3. module.exports = override(
  4. useBabelRc(),
  5. addWebpackModuleRule({
  6. test: /\.(tsx|ts)$/,
  7. use: [
  8. { loader: 'babel-loader' },
  9. {
  10. loader: '@linaria/webpack-loader',
  11. options: {
  12. cacheDirectory: 'src/.linaria_cache',
  13. sourceMap: process.env.NODE_ENV !== 'production',
  14. },
  15. },
  16. ],
  17. }),
  18. )

jsの場合はtsx|tsjsx|jsに置き換えてください。

次に、.babelrcを下記のように新たに作成します。

.babelrc

  1. {
  2. "presets": [
  3. ["react-app", { "flow": false, "typescript": true }],
  4. "@linaria"
  5. ]
  6. }

これで設定は完了です。Linariaを使う準備ができました。

$ yarn start

で、開発をはじめましょう。

スタイルの書き方

styled-componentsのようにコンポーネントとして作成する方法と通常のスタイルのようにclassNameで指定する方法があります。

最初はコンポーネントの書き方。

  1. import { styled } from '@linaria/react'
  2. const Title = styled.h1`
  3. font-size: 23px;
  4. `
  5. function App() {
  6. return (
  7. <div className="App">
  8. <Title>タイトル</Title>
  9. </div>
  10. )
  11. }

次は、classNameに指定する書き方。
インポートするファイルが違うのに注意しましょう。

  1. import { css } from '@linaria/core'
  2. const title = css`
  3. font-size: 30px;
  4. `
  5. function App() {
  6. return (
  7. <div className="App">
  8. <h1 className={title}>タイトル</h1>
  9. </div>
  10. )
  11. }

HTMLの出力はこのようにクラス名が変換されます。

  1. <h1 class="tuwg8pj">スタイル設定</h1>

ファイルの書き出し

ビルドしてファイルの確認をしてみましょう。

$ yarn build

デフォルト設定の場合build/static/cssにCSSファイルが書き出されいてると思います。