Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
React ViteからNext.jsへ切り替えたプロセスとApp Router化のボトル...
Search
sumiren
January 24, 2024
Programming
3
3.8k
React ViteからNext.jsへ切り替えたプロセスとApp Router化のボトルネック | 株式会社ヘンリー
株式会社ヘンリーからFindy様のイベントに登壇した際の記事です。
https://findy.connpass.com/event/306714/
sumiren
January 24, 2024
Tweet
Share
More Decks by sumiren
See All by sumiren
OpenTelemetryの位置づけと高度なオブザーバビリティオペレーション
sumiren
2
1.1k
HoneycombとOpenTelemetryでオブザーバビリティに入門してみる
sumiren
2
2.4k
フロントエンドパフォーマンスの変遷とNext.jsに見る次の時代
sumiren
26
9.3k
クラウドへのOpenTelemetry導入のハマりどころ
sumiren
0
260
ローコード自動テストを1ヶ月半で導入した話
sumiren
0
920
スタートアップでのmabl導入事例とリーディングテクニック
sumiren
0
330
Next.js 13 Layout / Streaming SSR 仕組み解説
sumiren
3
2k
Other Decks in Programming
See All in Programming
AWS Serverless Application Model入門_20250708
smatsuzaki
0
120
KessokuでDIでもgoroutineを活用する / Go Connect #6
mazrean
0
110
モバイルアプリからWebへの横展開を加速した話_Claude_Code_実践術.pdf
kazuyasakamoto
0
230
Jakarta EE Core Profile and Helidon - Speed, Simplicity, and AI Integration
ivargrimstad
0
120
[FEConf 2025] 모노레포 절망편, 14개 레포로 부활하기까지 걸린 1년
mmmaxkim
0
860
管你要 trace 什麼、bpftrace 用下去就對了 — COSCUP 2025
shunghsiyu
0
450
新世界の理解
koriym
0
140
React 使いじゃなくても知っておきたい教養としての React
oukayuka
18
5.8k
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
580
CSC305 Summer Lecture 05
javiergs
PRO
0
100
オープンセミナー2025@広島LT技術ブログを続けるには
satoshi256kbyte
0
120
技術的負債で信頼性が限界だったWordPress運用をShifterで完全復活させた話
rvirus0817
1
2k
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
A Tale of Four Properties
chriscoyier
160
23k
Faster Mobile Websites
deanohume
309
31k
Visualization
eitanlees
146
16k
Music & Morning Musume
bryan
46
6.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
560
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Writing Fast Ruby
sferik
628
62k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Agile that works and the tools we love
rasmusluckow
329
21k
Transcript
Copyrights(c) Henry, Inc. All rights reserved. React ViteからNext.jsへ 切り替えたプロセスと App
Router化のボトルネック
Copyrights(c) Henry, Inc. All rights reserved. 自己紹介 @sumiren_t (発音:すみれん) 仕事
• プロダクトエンジニア @ 株式会社ヘンリー • 技術顧問 / SWE @ フリーランス副業 数社様 強み 1 • フロント、バック、インフラ • 自動テスト、オブザーバビリティ • 組織マネジメント、プロジェクトマネジメント
Copyrights(c) Henry, Inc. All rights reserved. 会社名 株式会社ヘンリー 事業概要 電子カルテ/レセプト会計システム
“Henry” を開発・販売及び、 コンサルティング事業 所在地 東京都品川区東五反田2丁目9 −5 サウスウィング東五反田 3F 創業 2018年5月 代表者 逆瀬川 光人、林 太郎 社員数 50名(正社員)+業務委託 認証取得 ISMS 国際規格「ISO 27001」 医療ISAC規定認証 Mission 社会課題を解決し続け、より良いセカイを創る Service 電子カルテ / レセプト会計システム「Henry」 株式会社ヘンリー |社会課題の解決を目的に設立 2
Copyrights(c) Henry, Inc. All rights reserved. アジェンダ 1. React ViteからNext.jsに乗り換えた流れ
2. App Router化のボトルネック 3
Copyrights(c) Henry, Inc. All rights reserved. アジェンダ 1. React ViteからNext.jsに乗り換えた流れ
2. App Router化のボトルネック 4 関連ブログ記事:https://dev.henry.jp/entry/replace-vite-with-nextjs
Copyrights(c) Henry, Inc. All rights reserved. React + Viteを使っていた際は、First load
JSが4MBほどもあり、通信とブラウザ でのJS処理に時間がかかっており、FCPに悪影響を与えていた オーバーヘッド 参考数値 原因 JSチャンクの取得 開発マシン / 良好な通信状況で 1000ms 以上 (ブラウザキャッシュがない場合) 4MBものチャンクサイズ。 チャンク分割をしていなかった ブラウザでのReact レンダリング処理 開発マシン / 良好な通信状況で 〜200ms 程度 (JSのみキャッシュありの場合) SPAではFCPまでにHTMLとJSを読 み込みJSを実行する3ステップが必 要 【React + Vite時代のHenryのFCP課題】 5
Copyrights(c) Henry, Inc. All rights reserved. Next.js Pages Routerを採用することで、課題の解決を狙った 課題
ソリューション Next.jsにしたことによる 改善の参考数値 4MBの First Load JS Next.jsであればpageごとにビルドされ、その中 でのチャンク分割も標準である程度行ってくれ る。よって特別な工夫をしなくてもチャンクサイズ を抑えやすい First Load JSが 4MB → 最大1MB 開発マシン / 良好な通信状況で 1000ms → 300ms にオーバーヘッド改善 SPA特有のReactレン ダリング完了までの リードタイム Next.jsのプリレンダリングを利用すれば、 HTMLを読み込む1ステップだけでFCPを達成 できる。ハイドレーションのための JS実行は存 在するが、画面の描画には影響しない 開発マシン / 良好な通信状況で 〜200ms → 50ms にオーバーヘッド改善 【HenryのFCP課題を解決するためのNext.js採用】 6
Copyrights(c) Henry, Inc. All rights reserved. 補足:以前ブログ記事でNext.js移行でFCPが大幅改善したと説明した。当該記事では FCPが8倍改善しているが、実はここには認証処理をレンダリングの前提にしない対応をつ いでに入れており、その影響も受けていると想定される 【ブログ記事の切り抜き】
https://dev.henry.jp/entry/replace-vite-with-nextjs 7
Copyrights(c) Henry, Inc. All rights reserved. 移行プロセスとして、ViteとNext.js両方で動かせるようにアプリを修正し、テスト環 境をVite版とNext.js版の両方作って並行運用した src pages
pages page1.tsx page1next .tsx … … import build build 8
Copyrights(c) Henry, Inc. All rights reserved. こうした並行運用により、開発を止めずに移行したり、じっくりQAを行うことができ た サマリ 一斉切り替えの課題
並行運用のメリット 開発を止めない ViteからNext.jsに切り替える大量の差分を一度に マージすると、その間 Viteベースで開発しているプロ ダクトエンジニアに大きな手戻りを起こしてしまう。 Viteベースで機能開発しつつ、手隙の際に Next.js側 にアダプターを書く形で対応することができ、手戻りを 起こしづらい オンボーディングの時間 を取れる ある瞬間いきなりNext.jsに切り替えると、サーバーサ イドで動作するReactを書いたりフレームワークに慣 れず、プロダクトエンジニアの混乱が予想される Next.jsについてオンボーディングしたり、切り替えま でに慣れることができる(急ぎの機能開発は一旦 Vite だけ対応し、後でNext.jsで動くようにじっくり直すな ど) じっくりQAできる ある程度開発を止めることになるため、大規模なアー キテクチャ変更にも関わらず QAを急ぐことになる 本番にデプロイされている Vite版をテスト環境でQAし つつ、並行でNext.js版のテスト環境もQAできる 移行を中断できる QAの結果やっぱりViteに戻りたいといったときに、リ バートするだけでは済まない(プロダクトエンジニアが Next.jsベースですでに開発してしまっているため) 並行運用期間中はNext.js部分のコードベースを捨て るだけでViteに戻れる 9
Copyrights(c) Henry, Inc. All rights reserved. アジェンダ 1. React ViteからNext.jsに乗り換えた流れ
2. App Router化のボトルネック 10
Copyrights(c) Henry, Inc. All rights reserved. App Router化したい 11
Copyrights(c) Henry, Inc. All rights reserved. Next.js Pages Routerを導入してFCPは改善したものの、LCPには課題がある。SPAから 移行する際、データフェッチ戦略はクライアントサイドのままにした。基幹システムのバー
ティカルSaaSであるため、画面が複雑でGraphQLリクエストが大量に発生している 最も複雑な画面では、LCPのためだ けに10個程度のGraphQLリクエスト が発生。帯域幅次第で大きくパ フォーマンスが落ちる他、リクエスト がウォーターフォールになる画面は 顕著にLCPが落ちる。 12
Copyrights(c) Henry, Inc. All rights reserved. Next.jsの場合、App RouterではStreaming Server Renderingを利用できる。サーバーサ
イドでデータフェッチしつつ、chunked responseで画面のデータに依存しない部分はブラウ ザでレンダリングできる。サーバー間に通信回数と通信量を集約することで、データフェッチ の通信オーバーヘッドを削減できる また、Next.js 14で追加されたPartial Rendering(experimental)ではこの 一番上のBの部分をプリレンダリング することに挑戦している。(参考まで に、10ms〜50ms程度のリードタイ ム削減になると予想) 【Next.js公式より引用】 https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming 13
Copyrights(c) Henry, Inc. All rights reserved. HenryにおけるApp Router化の最大のボトルネックはルーティングにある。複雑なルーティ ングとブラウザバックをサポートしており、そのためにPages RouterのAPIと挙動に大きく
依存している(Viteからの移行時も苦労した)。これらのサポートがまだ弱いApp Routerへ の移行が困難となっている next routerのrouteChangeイベント (添付コード)や、next routerが window.history.stateに書き込む遷 移ごとのkeyに依存している。 Next.js 14時点では、App Routerで はこれらの代替手段が現状ない。 14 ルーティングに関するヘンリーの過去発表内容:https://note.com/henry_app/n/n4a56775fb382
Copyrights(c) Henry, Inc. All rights reserved. HenryにおけるApp Router化の最大のボトルネックはルーティングにある。複雑なルーティ ングとブラウザバックをサポートしており、そのためにPages RouterのAPIと挙動に大きく
依存している(Viteからの移行時も苦労した)。これらのサポートがまだ弱いApp Routerへ の移行が困難となっている。 next routerのrouteChangeイベント (添付コード)や、next routerが window.history.stateに書き込む遷 移ごとのkeyに依存している。 Next.js 14時点では、App Routerで はこれらの代替手段が現状ない。 15 ルーティングに関するヘンリーの過去発表内容: https://note.com/henry_app/n/n4a56775fb382 【朗報】 Next.js 14.1で、nativeのpushState利用がサポートされた模様。 詳細見れていないが、ルーティング周りの柔軟性が上がり、 Pages Routerからの移行の裾野が広がった可能性あり https://nextjs.org/blog/next-14-1#windowhistorypushstate-and-wind owhistoryreplacestate
Copyrights(c) Henry, Inc. All rights reserved. まとめ 1. ViteからNext.js Pages
Routerへの移行はスムーズにでき、性能的も良くなったしトレンドとも 整合しててよかった 2. ルーティングをフレームワークのAPIや振る舞いを利用してカスタマイズしておりApp Router 化に苦しんでいるが、pushStateサポートなども来ておりNext.jsの今後に期待 a. とはいえ、仮にフィジビリティがあっても書き換えが大変なのは間違いない 16
Copyrights(c) Henry, Inc. All rights reserved. WE ARE HIRING! 私たちは、ヘンリーのミッションに共感する
新しいメンバーを求めています。 • 個人個人に合わせた勤務時間とフルリモート可で、 半数以上のメンバーが育児と仕事を両立しており、 海外からの勤務も可能です。 • 社員以外にも、フリーランスや副業などで 多くのスペシャリストが参加しています。