Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Next.jsとNuxtが混在? iframeでなんとかする!
Search
ypresto
November 23, 2024
Technology
4.5k
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.2k
バクラク最古参プロダクトで重ねた技術投資を振り返る
ypresto
0
290
Why React!?? Next.jsそしてReactを改めてイチから選ぶ
ypresto
12
5.2k
ts-morph実践:型を利用するcodemodのテクニック
ypresto
1
1.3k
状態と共に暮らす:ステートフルへの挑戦
ypresto
3
2.9k
Cancel Next.js Page Navigation: Full Throttle
ypresto
1
4.9k
Next.js のページ遷移を全力で止める
ypresto
15
13k
TypeScriptの型とパフォーマンス (TSKaigi 2024)
ypresto
24
9.9k
アクセシビリティとE2Eテスト
ypresto
0
200
Other Decks in Technology
See All in Technology
品質と信頼性を地続きにする
grimoh
2
810
データ_AIの事業の勝敗をわけるもの
nek0128
1
460
Claude Code本って、 読む必要あるの?
oikon48
2
480
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
460
CLIライブラリ開発を支える技術
htnabe
0
140
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
140
人間はどの意思決定を手放せるのか
kawasima
15
7.4k
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
2.1k
AIは推し活である。
kurazuuuuuu
1
830
`t*(42&t>>10)`だけで音楽が鳴る、Swiftで実装するBytebeat / iOSDC Japan 2026
yutailang0119
0
110
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
190
安心して変更できるWebフロントエンドの作り方
pirosikick
5
2.8k
Featured
See All Featured
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Designing for Timeless Needs
cassininazir
1
480
Un-Boring Meetings
codingconduct
0
420
Statistics for Hackers
jakevdp
799
230k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
530
How GitHub (no longer) Works
holman
316
150k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
65k
Code Review Best Practice
trishagee
74
20k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
360
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の仕様を把握しコードを読めば、 だいたいなんでも解決できる! 懇親会でもぜひお話しましょう‧‧! プログラミング超楽しい!!