🥝

[Vite, React] マルチページ(複数ページ)の対応方法

2024/01/24に公開

概要

Vite, React で構成されたSPAでのマルチページの対応方法です。
マルチ(複数)ページとは /index.html/second/index.html のような構成を指します。

基本的にはViteの公式ドキュメントと同様に設定します。

開発環境

以下の環境で構築するアプリケーションが対象です。

  • React
  • TypeScript
  • Vite

ディレクトリ構成

project/
├── package.json
├── tsconfig.json
├── vite.config.ts
├── second
│    ├── index.html
│    └── main.tsx
├── index.html
└── src/
     ├── components/
     │    └── ...
     ├── App.tsx
     ├── Second.tsx
     └── main.tsx

対応方法

1. vite.config.tsの設定

※ 関連箇所のみ抜粋

vite.config.ts
import { defineConfig } from "vite";
import path, { resolve } from "path";
import { fileURLToPath } from "url";

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// https://vitejs.dev/config/
export default defineConfig({
  root: resolve(__dirname, "./"),
  build: {
    outDir: resolve(__dirname, "dist"),
    rollupOptions: {
      input: {
        main: resolve(__dirname, "index.html"),
        second: resolve(__dirname, "second/index.html"),
      },
    },
  },
  ...
});

root: importを絶対パスで記述するために必要

2. tsconfig.jsonの設定

tsconfig.json
{
  ...
  "include": ["src", "second"],
  ...
}

3. 別ページのhtmlとエントリー

/second/index.html
<!doctype html>
<html lang="en">
  <head>
    ...
  </head>
  <body>
    <div id="second"></div>
    <script type="module" src="./main.tsx"></script>
  </body>
</html>

/second/main.tsx は/src/main.tsxとほぼ同じです。

/second/main.tsx
import React from "react";
import ReactDOM from "react-dom/client";
import Second from "../src/Second";

ReactDOM.createRoot(document.getElementById("second")!).render(
  <React.StrictMode>
    <Second />
  </React.StrictMode>
);

以上でマルチ(複数)ページの対応は完了です 🎉

例えば、 /second/index.html の場合、
開発環境であれば http://localhost:5173/second/ になります。

URLにパラメータを付けたい場合、
http://localhost:5173/second/?theme=dark&size=small などになります。

Discussion