NEXT.jsのStatic Site Generatorでexportした静的サイトをサブディレクトリへデプロイして運用、Emotionも導入【備忘録】
category:web
Web アプリで開発で React を使うことはほとんどになってきた。
案件によってはクライアントとサーバーサイドで完全に異なる環境に分けた設計、開発運営していくことも増えてきた。
Web アプリ開発以外でちょっとしたサイトの制作依頼を受けたときも TypeScript + React (CSS in JS)を使ってしばらく自分の中でスキルのスタンダードにしたい、というのもあって NEXT.js をチョイスした。
Static Site Generator(SSG)を使って依頼に対して柔軟に対応できるように、ハマったところなども加えて覚書として残しておきたい。
TypeScript を使った NEXT.js を使ったプロジェクト作成
yarn create next-app --typescript
デフォルトでは root に export されるようになっているので、 next.config.js
設定で basePath を定義していく。
SSG export のディレクトリ設定
next.config.js 設定
export 時は production になる。 assetPrefix の設定でアセットファイルと、css 内部の画像、フォント指定などもパス指定される。 publicRuntimeConfig の設定で、コンポーネントからの読み込みが可能になる。
/* デプロイ先のディレクトリ */ const DIRECTORY = "/directory"; /* 本番/開発環境、export時はproduction */ const isProduction = process.env.NODE_ENV == "production" module.exports = { // 公開先と開発でディレクトリを分けるのであれば、basePathの設定 basePath: isProduction ? DIRECTORY : "", // アセットファイルのパス指定 assetPrefixの設定 assetPrefix: isProd ? DIRECTORY : "", // リンク/画像のパス設定 tsxコンポーネント内呼び出し用 publicRuntimeConfig: { basePath: isProd ? DIRECTORY : "", }, }
tsx コンポーネント config を読み込み、パス指定
next/image Image
は export 時に error になるので、img タグを使用。
Link
タグは as を指定
import getConfig from "next/config"; import Link from "next/link"; const { publicRuntimeConfig } = getConfig(); export const SomeComponent = () => { const basePath = (publicRuntimeConfig && publicRuntimeConfig.basePath) || ""; return (<img src={`${basePath}/vercel.svg`} alt="Vercel Logo" /> <Link href="/about" as={`${basePath}/about`}> リンク </Link>); }
build ファイルのディレクトリ指定
package.json
の build コマンドに && next export
を加え、さらに build ファイルもディレクトリ指定する場合は -o out/directory
のように追記する。
"scripts": { "build": "next build && next export -o out/xxxxx", },
CSS in JS Emotion の導入
ついでに CSS in JS の Emotion の導入も。
Emotion のパッケージと、Emotion の babel 用プラグインを導入
yarn add @emotion/react @emotion/babel-plugin
JSX プラグマ ディレクティブを追記
css prop を使うため JSX から JavaScript へのコンパイル設定。 emotion を読み込むコンポーネント毎に記述が必要。
/** @jsxImportSource @emotion/react */ import { css } from "@emotion/react"
それか Babel Condig を設定する方法がある
Babel の Config を設定
NEXT.js の roor に .babelrc
を作成。
{ "presets": [ [ "next/babel", { "preset-react": { "runtime": "automatic", "importSource": "@emotion/react" } } ] ], "plugins": ["@emotion/babel-plugin"] }
TypeScript の型定義ファイルを読み込む
TypeScript 用に Emotion の型定義ファイルも必要。
tsconfig.json
の compilerOptions に Emotion の型定義ファイルを指定。
"compilerOptions": { "types": ["@emotion/react/types/css-prop"], }