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
Next.jsとNuxtが混在? iframeでなんとかする!
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ypresto
November 23, 2024
Technology
4.4k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Next.jsとNuxtが混在? iframeでなんとかする!
ypresto
November 23, 2024
More Decks by ypresto
See All by ypresto
TypeScriptはどのようにどこまで推論できるのか ─ とにかく as は禁止で
ypresto
3
1.1k
バクラク最古参プロダクトで重ねた技術投資を振り返る
ypresto
0
260
Why React!?? Next.jsそしてReactを改めてイチから選ぶ
ypresto
12
5.2k
ts-morph実践:型を利用するcodemodのテクニック
ypresto
1
1.2k
状態と共に暮らす:ステートフルへの挑戦
ypresto
3
2.8k
Cancel Next.js Page Navigation: Full Throttle
ypresto
1
4.8k
Next.js のページ遷移を全力で止める
ypresto
15
12k
TypeScriptの型とパフォーマンス (TSKaigi 2024)
ypresto
24
9.8k
アクセシビリティとE2Eテスト
ypresto
0
180
Other Decks in Technology
See All in Technology
Genie Ontologyは銀の弾丸かを考える / Is Genie Ontology a Silver Bullet?
nttcom
0
310
型は壁、Rustでもバグを直すな、表現できなくせよ
nwiizo
13
2.1k
Claude Codeとハーネスについて考えてみる
oikon48
19
9.5k
Claude Code 珍プレー好プレー
shinyasaita
0
330
あなたの『Site』はどこですか? — xREという考え方
miyamu
0
1.2k
AI、CDK と協働する Full TypeScript アプリケーション開発 / Full TypeScript Application with AI and CDK
geekplus_tech
2
210
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
250
脱金融のフューチャー・デザイン / Future Design Beyond Finance
ks91
PRO
0
150
SRE Lounge Hiroshimaへの招待
grimoh
0
670
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
370
第67回コンピュータビジョン勉強会CVPR2026読会前編
tsukamotokenji
0
130
ガバナンスの「ちょうどいい落とし所」を探れ!開発スピードを妨げない運用判断の勘所 / SRE NEXT 2026
genda
1
160
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.5k
Un-Boring Meetings
codingconduct
0
340
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
830
How to build a perfect <img>
jonoalderson
1
5.8k
Odyssey Design
rkendrick25
PRO
2
730
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Docker and Python
trallard
47
3.9k
Transcript
© LayerX Inc. Next.jsとNuxtが混在? iframeでなんとかする! ypresto @ JSConf 2024 Sponsor
LT (2024/11/23)
⾃⼰紹介 ypresto (プレスト) @yuya_presto
© LayerX Inc. 5 バクラクのマルチプロダクトとNext.js NuxtとNext.jsを混在させたい話 将来的にNext.jsへの移⾏を検討中 ⼀部Next.jsにしたい 検証やっていき!
© LayerX Inc. 7 1プロダクトでNuxtとNext.jsを混ぜる⽅法 Next.js Nuxt Next.js Nuxt ハードナビゲーション
(ページ読み込み) が発⽣ JSのグローバル ステートも失われる /foo /bar /foo /bar 埋め込みできれば 回避できる!
© LayerX Inc. 8 じゃあ埋め込めばええやん。しかし‧‧‧ 話⻑くなるから省略! • 要件:アプリ側を変更しないで対応 (⼯数節約) •
Next.jsアプリに、Nuxtアプリを直接埋め込む (e.g. Module Federation) ◦ エントリポイントのbundleにNuxtの起動コードがベタ書きなのでそのままでは無理 • Next.jsアプリから、NuxtアプリのPage Componentなどをimportする ◦ Nuxtの機能に依存するコードがNG、dependenciesの問題 • マイクロフロントエンド系フレームワークを使う (e.g. SAP/luigi、single-spa) ◦ やりたいことに対して学習と運⽤のコストが⾼そう ◦ Nuxtの機能に依存するコードがNG (なはず) • iframeで読み込む ◦ routerやHistoryがNext.jsとNuxtの2つになることへの対処が⾯倒そう チョット⾯倒なだけ では???
© LayerX Inc. 10 提案⼿法 Next.js 内で、Nuxtのiframeを出し分ける iframe Next.js iframe
Nuxt app router router 普通のNext.jsアプリ React使⽤可能 条件を満たすURLなら iframeを全画⾯で描画 条件を満たしていない間は 空ページに遷移して隠す
© LayerX Inc. 11 提案⼿法 Next.js と Nuxt で URL
の同期を取る iframe Next.js iframe Nuxt app router router Next.jsでURLを変える Nuxt側でリンククリックや 戻る進むしたら、 postMessage()
© LayerX Inc. 12 提案⼿法 Next.js の URL を Nuxt
に反映する iframe Next.js iframe Nuxt app router router Nuxtで router.replace() Next.js側でURLが 変わったら postMessage() Next.jsのrouterを 正にすることで、 戻る‧進むの対応も容易に ※ iframeの中でのrouter.push() は、リロードした後にハードナビゲーションになりました
© LayerX Inc. 13 Nuxt の Custom History を実装する https://nuxt.com/docs/guide/recipes/custom-routing#custom-history-advanced
window.historyじゃないのを 使える!
© LayerX Inc. 14 Nuxt の Custom History を実装する Next.jsに送って、
Next.jsでrouter.push() ※ history.go() は、Nuxt側ではhistory stackの概念を発生させたくないので未対応
© LayerX Inc. 15 Nuxt の Custom History を実装する Next.jsに送って、
Next.jsでrouter.push() ※ history.go() は、Nuxt側ではhistory stackの概念を発生させたくないので未対応 Next.jsからmessage来たら listener経由で popstate or pushしたことにする
やったか??
問題発⽣
© LayerX Inc. 24 戻る‧進むされるとき「保存していない変更があります」を表⽰できるNuxtの機能 Next.jsにはそんなものない Navigation Guard
© LayerX Inc. 25 Next.jsのページ遷移を全⼒で⽌める!! https://speakerdeck.com/ypresto/hack-to-prevent-page-navigation-in-next-js 5分じゃ無理なので こちらもぜひ! 戻る→URL書き換え next-navigation-guard
popstateイベント (キャンセル不可) Next.js側 History API history.go(差分) Next.jsが知らぬ間に URLを元に戻す Nuxt側 Custom History Next.jsのrouterが拾う前に stopImmediatePropagation() で握りつぶす popstateされたよ postMessage() キャンセルされたよ postMessage() ユーザーに 確認
© LayerX Inc. 27 iframe内に描画しても無駄無駄ァァ! '@unhead/vue' を上書きし、 titleを親windowに送信 Nuxt内の <title>
タグ対応 ReactでいうContextProviderを ネストさせて上書き titleタグを描画せずに postMessage() で送信
URL同期できた、ページ遷移⽌められた、<title>同期できた 検証完了! できた!!
※ 今はnuxt generateでstatic buildしたものを配信しています NuxtをSSRしたらハードナビゲーションが 爆速になったのでいらんかも
制作‧著作:LayerX 終
(npm|yarn|pnpm) install next-navigation-guard https://github.com/LayerXcom/next-navigation-guard このとき作った next-navigation-guard が 実際導⼊されたのでヨシ! ※「保存されてない変更があります」表示は、 Next.jsで作る場合も必要なことを見越して作っていた
ライブラリ、フレームワーク、APIの仕様を把握しコードを読めば、 だいたいなんでも解決できる! 懇親会でもぜひお話しましょう‧‧! プログラミング超楽しい!!