内部向けシステムを SPA(React)で作るときのプロジェクトのベースを考える

React
Reactフロントエンド

この記事では内部向けシステムは、社内システム/業務システムなどある特定範囲内で目的をもって利用されるものを想定しています。

目的や会社の背景やポリシーによるため唯一の解がないのは大前提ですが、フロントエンド関連で調べたとき、toC 向けの記事は多く、SEO や性能が非常に重要というシーンが大半なのですが、そうではない場合には何がよいのか?と思う人もいるかと思います。

筆者もその一人で、この記事はその検討と見解です。

内部向けシステムの特性

外部/toC向けのシステムと大きく違うのは以下と思っています。

  • SEO 対策は基本不要(使う人は決まっており、好き嫌いの問題ではなく利用される)。
  • 初期読み込みも早いに越したことはないけど、シビアではない(常識的な範囲で応答が返ればOKなことが多い)。
  • よほど機能強化が活発なシステムでもない限りライブラリのバージョンアップをする頻度は低い。

なので SSR や SSG、ISR といった仕組みがなくても正直問題にはなることはあまりないと思っています。ではそのときにどの プロジェクトをベース を使うのがよいか?個人的に特に悩ましいのが最後の観点です。

プロジェクトのベース

ここで考えたいのは主にビルドシステムでした。

Typescript の採用や、ルーター/状態管理などの必須ライブラリ、コンポーネント開発には必要な Storybook など、実開発では普通に利用すべきものは当然必要で、これら下回りがどうであろうと必要なものはここでは割愛。

プロジェクトベースの選択肢

上の特性から、CSR でも十分と思われるので、プロジェクトのベースとして選択肢にあげたのは以下4点。現時点でメジャーどころをピックアップしたつもり(Next.js は厳密には同じレイヤで並べられるものではないですが)。

  1. create-react-app
  2. Webpack + React
  3. Vite + React
  4. Next.js

1. は React 公式、2 は長年デファクトである Webpack、3 は高速な HMR で開発体験が Webpack 時よりも劇的に向上した Vite, 4 は React 界隈で非常に人気のあるフレームワーク。

create-react-app

React 公式が提供しているプロジェクト作成の方法。予め必要な Webpack などの設定がされており、すぐに React プロジェクトを起動することができる。ただ最新の公式のドキュメントには、以下の記述があり、React を学ぶ場合 となっています。

If you’re learning React, we recommend Create React App. It is the most popular way to try out React and build a new single-page, client-side application. It’s made for React but isn’t opinionated about routing or data fetching.

Getting started with a minimal toolchain

ドキュメントの続きにも本番向けには Next.js が良いとされています。

そのため、CSR で十分といえども create-react-app を利用するのは微妙と感じました。ただ、create-react-app 自体は無くならない or 無くなるにしても公式なので何らかの対応手段は提供されるだろうなと思います(eject も可能ですし)。

Webpack + React

依存度という意味では最もシンプルかつ実績はある組み合わせ。0 から始める場合は下回りの設定が色々必要になりそうだけど、Webpack に関しては調べればヒットするだろうし書籍もあるので情報には困らないと思われる。

ただ、Vite や TurboPack など登場しており、Webpack は今度は少しずつシェアが下がっていく可能性が高そう。あとは縛りがない分書き方/構成含めちゃんと決めないと好き勝手なものができる可能性が高いので注意が必要。別のシステムへも展開、みたいなことを想定するなら特に。

Vite + React

Vite の恩恵を受けられるので開発体験はよい。SSG したい場合には別のライブラリが必要にはなるが難しくはなさそう。

Webpack 同様、Vite 自体はフレームワークじゃないので、実際の開発時の自由度は高い。注意点も Webpack で書いたものと同じ傾向はあるはず。将来性はこちらのほうがある(と思っています)。

ただ、調査時点では Google 検索時のヒット件数/記事量は当然 Webpack には劣る。

Next.js

上の選択肢と違い、フレームワークなのでルーティングとかファイル分割とか機能が搭載済み、書き方もある程度決まっている。お作法があることの良し悪しは捉え方次第だが、自由度がありすぎるよりはよい。CSRだけじゃなく、SSG,SSR,ISR も用意に実現する機能をもつ。検討時点では内部では Webpack が動いている。

Next.js は非常に人気で 2021/2022 時点では React 開発時のデファクト的な位置づけに思われる。上で述べたように、React 公式でも Next.js が良い選択肢と言及されている。

ただ、フレームワークを使うことに対する懸念は継続性。寿命が長いシステムを作る場合は、その分 OSS としての活動も継続性があるものを選ぶことが望ましい。

が、ここ数年の流れをみるとフロントエンドの技術自体が10年20年後には全くの別物になっている可能性のほうが高いため、気にしてもしょうがない感覚もあり。

比較

調査時点(2022/11)のもの。

観点create-react-appwebpack + reactvite + reactNext.js
レンダリングCSRCSR
SSG/SSR できるかもだけど、それを考えるなら選択肢はこれではない気が
CSR/SSG
SSG は vite-ssg でできるとのこと
CSR/SSG/SSR/ISR
が標準でいずれも実現可能
習得難易度
仕組みの中で使うには簡単

0 から使いこなすのは大変だが、調べれば情報は多くある
?
パッと使うのはすぐできる。使いこなすほどは使ってないので学習コスト不明

専用のお作用を覚える。と言ってもそんな難しくない印象
Github star98,067
(create-react-app)
62,117
(webpack)
49,847
(vite)
96,931
(Next.js)
npm trend
※下図
4位
下降傾向
1位
断トツ 
3位
増加傾向
2位
増加傾向
Google trend
※下図
4位
停滞
2位
少しずつ下降
3位
増加傾向
1位
増加傾向
State of JavaScript 2021
Tier
BSS
コミュニティ活性度
※コミット数判断

更新は非常に少ない

右肩下がり

活発

非常に活発
依存度
フレームワークという意味で他よりは。
その他公式が本番開発で推奨してないフレームワークの作法である程度、書き方が統一できる
比較(create-react-app vs webpack + react vs vite + react vs Next.js)
npm trends でみると、webpack, next, vite, create-react-app の順番
npm trends
Google Trend だと、nextjs, webpack, vite が僅差で create-react-app
Google Trends

まとめ

調べておいて元も子もないですが、結局何を大事にするかなので状況によりそうです。

上の結果を見る限りでは、今新しく作るなら Next.js や Vite がよさそうです。が、数年前には全く予想できない結果です。なので、数年後も予想できないと思った方がよいのかなと思います。

そういう意味では当たり前のことですが、何を選ぶかも重要ですが、継続的に変化に対応できる/させてもらえる状況を作ることがより重要ですね(一度作ったあとに塩漬けにするという選択肢もありますが)。