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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
sumiren
January 24, 2024
Programming
4k
3
Share
React ViteからNext.jsへ切り替えたプロセスとApp Router化のボトルネック | 株式会社ヘンリー
株式会社ヘンリーからFindy様のイベントに登壇した際の記事です。
https://findy.connpass.com/event/306714/
sumiren
January 24, 2024
More Decks by sumiren
See All by sumiren
OpenTelemetryの位置づけと高度なオブザーバビリティオペレーション
sumiren
3
1.4k
HoneycombとOpenTelemetryでオブザーバビリティに入門してみる
sumiren
2
2.8k
フロントエンドパフォーマンスの変遷とNext.jsに見る次の時代
sumiren
26
9.4k
クラウドへのOpenTelemetry導入のハマりどころ
sumiren
0
300
ローコード自動テストを1ヶ月半で導入した話
sumiren
0
1k
スタートアップでのmabl導入事例とリーディングテクニック
sumiren
0
370
Next.js 13 Layout / Streaming SSR 仕組み解説
sumiren
3
2k
Other Decks in Programming
See All in Programming
AWS re:Invent 2025の少し振り返り + DevOps AgentとBacklogを連携させてみた
satoshi256kbyte
1
110
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.5k
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
180
RSAが破られる前に知っておきたい 耐量子計算機暗号(PQC)入門 / Intro to PQC: Preparing for the Post-RSA Era
mackey0225
3
110
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
580
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
140
Geminiをパートナーに神社DXシステムを個人開発した話(いなめぐDX 開発振り返り)
fujiba
0
130
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
130
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
750
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
270
条件判定に名前、つけてますか? #phperkaigi #c
77web
2
910
AI 開発合宿を通して得た学び
niftycorp
PRO
0
190
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
290
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Docker and Python
trallard
47
3.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
Unsuck your backbone
ammeep
672
58k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
240
Site-Speed That Sticks
csswizardry
13
1.1k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
420
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Design in an AI World
tapps
0
190
SEO for Brand Visibility & Recognition
aleyda
0
4.4k
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! 私たちは、ヘンリーのミッションに共感する
新しいメンバーを求めています。 • 個人個人に合わせた勤務時間とフルリモート可で、 半数以上のメンバーが育児と仕事を両立しており、 海外からの勤務も可能です。 • 社員以外にも、フリーランスや副業などで 多くのスペシャリストが参加しています。