技術選定書 ― 採用技術・バージョン・選定理由

令和8年度 千葉県地域医療提供体制データ分析チーム構築支援事業 / 宛先:開発チーム(情報システム課への説明資料を兼ねる) / 関連:システム構成案データパック仕様書
県回答から導かれる制約 ―― (1) 庁内統合サーバへの配置(Node.js実行可否は確認中) (2) 全アセット同梱(CDN非依存を標準) (3) Edge(Chromium・自動更新)単一ターゲット (4) 1366×768・メモリ8GBの職員PC (5) 県担当者による年1回の更新運用 (6) 搬入は転送サービス/物理メディア(GitHub不可) ―― を満たすことを第一基準に、 実績・ライセンス(OSS・恒久無償)・保守継続性で選定した。成果物は「ビルド済み静的一式(閲覧側SPA)」+「Node.js+Expressのサーバ(認証・管理画面・静的配信)」で、 認証は自前実装で確定(統合サーバのBasic/フォーム認証には依存しない。§3)。

1 選定方針判断基準

基準内容
① 制約適合閲覧側はビルド済み静的一式で動く/同梱可能(ライセンス上も技術上も)/Edge安定版で動作。サーバ側の依存はNode.js(LTS)1つに限定
② 軽量性低スペックPC・低解像度で快適に動く。バンドル合計目標 1.5MB以下(地図データ除く)、初期表示3秒以内
③ 保守継続性年度更新・指標追加を長期に支える。特定ベンダーのSaaS・有償ライセンスに依存しない(県回答Q5-5:BIライセンスなし)
④ 資産流用既存プロトタイプ(自前SVG描画のSPA)のコード・デザインを最大限流用し、開発量とリスクを抑える
⑤ ライセンスMIT/BSD/ISC/SIL OFL のみ採用。GPL系・商用は不採用。納品物に同梱ライセンス一覧を含める

2 フロントエンド(Webアプリ本体)静的SPA

領域採用選定理由不採用とした代替案(理由)
言語TypeScript 5系(strict)データ駆動UI(型=single/comp/flow/point で分岐)は型検査の恩恵が大きい。any/unknown 不使用、判別可能ユニオンで dtype を表現素のJS(規模拡大時の回帰リスク)
UI構成React 19(関数コンポーネント+フック。状態は useReducer+Context)+描画は純TSレンダラのハイブリッドフィルタ8軸以上×複数パネルの連動・お気に入り復元など「状態→画面の同期」が本番の複雑性の中心であり、宣言的UIに任せるのが最も安全。保守要員の調達性(国内市場でReact経験者が最多)を優先。SVGは全てJSXで宣言的に生成し、.svgファイルのインポートを行わない設計(インポート起因のビルド問題を構造的に排除)。複雑図形のパス計算は純TS関数に分離し、プロトタイプの描画資産を温存フレームワークレス(当初案。状態同期の手動管理が保守リスクのため改訂)、Preact(軽量だが調達面でReact優先)、Vue/Svelte(同等成立するが同上)、Next.js(SSR不要・静的1画面に過剰)
ビルドVite 7系base:'./' 相対パス出力)+ esbuild/Rollup(内蔵)静的一式の出力が容易・高速。相対パス出力のため、統合サーバの任意ディレクトリ配下に置ける(※file://での直接起動は不可:データのfetch読込とログインが成立しないため)webpack(設定コスト)、ビルドなし素配布(TS・分割・最適化を諦めることになる)
地図描画topojson-client 3 + d3-geo 3(投影・パス生成のみ)+ 自前SVGTopoJSON展開と正距円筒/メルカトル投影だけ借り、描画は既存プロトタイプのSVG方式を継続。合計~30KB程度と軽量MapLibre GL(WebGL・タイル基盤前提で低スペックPCと閉域配布に不向き)、Leaflet(ラスタタイル前提。背景地図が不要な塗り分け中心の本件では過剰)
グラフ描画自前SVG(プロトタイプ流用)+ d3-scale / d3-shape(軸・スケール計算のみ)14ビュー中サンキー・二変量・OD行列など汎用ライブラリで作れない図が多く、既に自前実装が存在。ライブラリは計算ユーティリティに限定Chart.js(特殊図非対応で二重実装になる)、ECharts(~1MBでバンドル目標超過・Apache-2.0は可だが過剰)
CSV解析Papa Parse 5RFC 4180・BOM・引用符の実績あるパーサ。データパックのCSVをブラウザ内で直接読む本設計の要自前パーサ(モックでは使用したが、本番はエッジケース実績を優先)
ローカル保存localStorage + IndexedDB(idb 8系ラッパ)+ File System Access API(非対応時は通常ダウンロードにフォールバック)県回答Q2-2-3で両ストレージ利用可を確認済み。設定ファイルの「前回の場所へ上書き保存」はEdgeがFile System Access API対応のため成立サーバ保存(要件で明示的に除外)、Cookie(容量不足)
フォント・配色BIZ UDPゴシック(SIL OFL)同梱/CUD配慮パレットUD書体で可読性確保。JIS X 8341-3(要否確認中)に先回りしコントラスト比4.5:1以上を基準化システムフォント任せ(端末差で表崩れ)
実行時のランタイム依存:React/ReactDOM(gzip後 約50KB)+ Papa Parse・topojson-client・d3(geo/scale/shape)・idb(合計~100KB台)。すべてMIT/BSD/ISC系で、ビルド時にバンドルへ同梱され、実行時の外部通信は発生しない。バンドル合計目標1.5MB以下(§1②)に対し十分収まる。
選定変更の経緯(令和8年7月改訂):当初案は「プロトタイプ資産流用」を理由にフレームワークレスとしていたが、 (1) 流用価値の実体は描画関数・CSS・UX設計でありフレームワーク選定と独立に温存可能なこと、(2) 本番で複雑化するのは状態→画面同期でありReactの得意領域であること、 (3) SVGの取り回し(インポート・再利用)で実際に問題が発生したこと、(4) 将来の保守要員調達、を踏まえReact採用に改訂した。

3 サーバ・配置確定構成

区分採用技術備考
アプリサーバ(確定)Node.js 24 LTS + Express 5自前のID/PW認証・セッションCookie・アカウント管理・管理画面静的SPAとデータパックの配信を同梱統合サーバのBasic/フォーム認証には依存しない。パスワードはソルト付きハッシュ(bcrypt/Argon2id)で保管、アカウント情報・版数履歴はSQLite等の単一ファイルDB。管理画面の実装はモック apps/06_admin、認証はクラウド版モック apps/03_cloud-web の実装を流用。通信はHTTPSのGET/POSTのみ(WebSocket・SSE不使用)
設置先第一候補=庁内の統合サーバ/Node.jsを実行できない場合は国内リージョンのクラウド(ISMAP登録事業者を優先)+ Docker + HTTPS/TLS1.2以上唯一の残確認事項。県回答上443直接アクセス可・ホワイトリスト不要のためクラウド設置の障壁も小さい(機密性区分の正式確認後に事業者選定)。どちらでもアプリの構成・機能・運用手順は同一
サーバ側に依頼する設定HTTPS(庁内向け証明書)・URLの固定・MIMEタイプ(.topojson→application/json)・管理画面URLへの接続元IP制限(任意)認証設定の依頼は不要になった(アプリ側で実装するため)
認証を自前実装とする理由:統合サーバ製品の認証機能に依存すると、可否・仕様・変更手続きが庁内サーバ側の事情に左右され、アカウントの発行・パスワード再発行のたびに情報システム課への依頼が発生する。 自前実装なら県担当者が管理画面からアカウントを新規登録・パスワード再発行・ID削除でき、設置先が統合サーバでもクラウドでも同じ動作になる。

4 データ整備・検証ツール(分析班側)パック発行系

領域採用選定理由代替案
検証ツールPython 3.12以上 + pandas + jsonschema(CLI。単一コマンド validate-pack分析班の既存スキル(Python/R系)に合わせる。列照合・コード整合・秘匿チェックは表演算が中心で pandas が最適Node製CLI(開発側スタックには合うが分析班が触れない)
ツール配布uv(または pipx)での配布・実行、依存固定(lock)分析班PCへの導入を1コマンド化。オフライン導入用に wheel 同梱zipも用意Docker(分析班環境に要求が重い)
地図データ生成国土数値情報 N03(行政区域)→ mapshaper CLI で融合・簡略化 → TopoJSON市町村→医療圏 dissolve と位相保持簡略化の定番。生成手順はスクリプト化して再現可能に(新地域分けの追加が定型作業になる)QGIS手作業(再現性が担保できない)
座標付与施設は国土数値情報 医療機関データ(P04)の座標を基準、不足分のみジオコーディング公的データ優先で精度と出典を明確化

5 開発・品質管理開発側内部

領域採用備考
テストVitest(ロジック単体)+ Playwright(E2E)E2Eは1366×768ビューポートを標準ケースに含め、全14ビュー×代表フィルタを自動巡回(モック検証で実績のある方式を継続)
Lint/整形ESLint 9(typescript-eslint)+ Prettierno-explicit-any 等を error 運用
バージョン管理Git(開発側内部リポジトリ)県への搬入はビルド済みzipを転送サービスで(GitHub経由の取得は行わない=県回答Q4-2)
成果物①閲覧側アプリ静的一式(dist/)②Expressサーバ一式(認証・管理画面)③データパック ④検証ツール ⑤同梱ライセンス一覧 ⑥運用手順書サーバ障害時の復旧はExpressの再起動と版数履歴からのロールバックで行う(file://での予備起動は、CSV読込とログインが成立しないため行わない)

6 不採用としたもの(総括)説明用

候補不採用の理由
Power BI/Tableau 等のBI製品県にライセンスなし(Q5-5)。職員全員分の継続ライセンス費が発生し、データパック後入れ・ローカル保存要件との適合も低い
Next.js 等のSSRフレームワーク静的1画面のSPAにSSR・ファイルルーティング基盤は過剰(ReactそのものはSPAとして採用。ビルドはViteで静的出力)
.svgファイルのインポート(svgr等のローダ経由)ビルド設定依存でトラブルが多い(実際に発生)。地図・図形はTSデータモジュール+JSX生成に統一し、本番はTopoJSONからの実行時生成へ移行するためSVGファイル自体を持たない
MapLibre/Leaflet(地図基盤)背景タイル前提・WebGL負荷。本件は境界塗り分け+点+フローのみで、TopoJSON→SVGで十分軽い
サーバサイドDB(PostgreSQL等のRDBMS)分析データは集計値CSV数MBでファイル配信のまま扱える。サーバが保持するのはアカウント情報とデータパックの版数履歴だけで、SQLite等の単一ファイルDBで足りる(別プロセスのDBサーバを庁内に増やさない)
WebSocket/SSE によるライブ機能SSLインスペクション実施(Q2-3-2)で遮断リスク。要件上も不要
バージョン方針:本書の版数(Node 24 LTS・Vite 7・TypeScript 5 等)は令和8年7月時点の安定版。実装着手時に各系列の最新安定版へ読み替え、メジャー更新は追従せずLTS・安定系列に固定(依存はlockファイルで固定し、更新は年度改修時にまとめて実施)。