クラシックなWebアプリケーション(Node.js + EJS)に、後付けで Vite + React 環境を追加し、さらにShadow DOMを使って既存ページの一部としてReactを表示するサンプルです。
このリポジトリでは、次の流れをまとめて確認できます。
- 既存のクラシックWebアプリ(Node.js + EJS)がある
frontend/にVite + Reactを追加する- ReactをShadow DOMに描画する
- TailwindをShadow DOM内で動かす
- 既存のWebアプリ(Node.js)に、フロントエンド環境を後付けする手順
- Viteの開発環境と本番ビルドの切り分け
- ReactをShadow DOMに描画する実装
- Shadow DOM内にCSSを適用する方法
/
├── server.js
├── lib/
│ └── random.js
├── views/
│ ├── random.ejs
│ └── random-react.ejs
├── public/
│ └── react/
│ ├── assets/
│ │ ├── index.js
│ │ └── frontend.css
│ └── ...
└── frontend/
├── src/
│ ├── build.tsx
│ ├── main.tsx
│ ├── RandomApp.tsx
│ ├── IsolatedScope.tsx
│ └── reactRenderer.tsx
├── vite.config.ts
└── package.json
npm install
npm run server- EJSの確認:
http://localhost:3000/random - React埋め込みページ:
http://localhost:3000/random-react
cd frontend
npm install
npm run dev- React単体の確認:
http://localhost:5173/
npm run frontend:build- 出力先:
public/react/ - その後、ルート側のサーバーを起動して
http://localhost:3000/random-reactを開くと、Node.jsアプリの中にReactが表示されます
- Expressサーバーの起点
- EJSテンプレートの表示
/api/randomの提供/random-reactの表示
- EJSのみで乱数を表示するページ
- React bundleを読み込むページ
- EJSで受け取った値をReactの初期値として渡す
- 画面に表示するReactコンポーネント
- ボタン押下で
/api/randomを呼び出す
- Shadow DOMを作成し、その中にReactを描画するためのコンポーネント
- ReactコンポーネントをShadow DOM内へ表示するためのヘルパー
- 本番ビルド用のエントリポイント
RandomAppとreactShadowDOMRendererをexportして、/react/assets/index.jsから利用できるようにする
- Viteの設定
- ビルド成果物の出力先を
../public/react(既存Webアプリ)にしている - 開発時は
http://localhost:3000に対して/apiをproxyしている
手順を順番に追いたい場合は、別ファイルのTUTORIAL.md参照してください。
このサンプルでは、開発用と本番用で入口を分けています。
- 開発用:
frontend/src/main.tsx - 本番用:
frontend/src/build.tsx
これは「Vite単体でReactを触る時」と「既存 Node.jsアプリへ埋め込む時」で役割を分けるためです。