Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nuxt 3でJamstackテンプレートを作るときの考え方

Chinen
October 28, 2023

Nuxt 3でJamstackテンプレートを作るときの考え方

Vue Fes Japan 2023の登壇資料です。

Chinen

October 28, 2023
Tweet

More Decks by Chinen

Other Decks in Programming

Transcript

  1. 株式会社TAM/TAMTO:フロントエンドエンジニア 兼 個人事業主 知念 昌史 / まぁし X(Twitter)@chocodogmagic • 職歴:大学新卒

    → 美容師 → エンジニア12年くらい • 2019年に東京 → 沖縄へ帰省してフルリモート • Vue.js/Nuxt/Jamstack/セマンティックなHTML/PWA/ アクセシビリティ/SEO/パフォーマンス改善/Movable Type
  2. 個人的な活動 • 平日9:00〜朝活:おはようエンジニア #ohayo_engineer ◦ X(旧Twitter)SpacesでWeb関連の情報発信中、フォローしてね ◦ 540回継続しているがいまだに早起きは苦手、一緒にがんばろ? • コミュニティ運営

    ◦ PWA Night(東京) / v-okinawa(沖縄) / CSS福笑い(東京) • 好き ◦ スプラトゥーン3(トライストリンガー XP1980) ◦ ポケモンSV スカーレット
  3. WebサイトとWebサービス(Webアプリ)で二極化 • HTML/CSS/jQuery → 運用はある ------------------------------ • Pug/EJS、Sass(Gulp) • JavaScript(ES6〜)

    • WordPress等の従来のCMS ------------------------------ • Next.js/Nuxt • Jamstack • React / Vue • Next.js / Nuxt • コンポーネント開発 • デザインシステム → 素のHTMLで作っていない → TypeScriptが基本 → CSS設計の概念が不要 → マイクロサービス化 Webサイト Webサービス/Webアプリ 制作パターンが 複雑化 制作パターンが 固定化
  4. WebサイトとWebサービス(Webアプリ)で二極化 • HTML/CSS/jQuery → 運用はある ------------------------------ • Pug/EJS、Sass(Gulp) • JavaScript(ES6〜)

    • WordPress等のCoupled CMS ------------------------------ • Next.js/Nuxt • Jamstack • React / Vue • Next.js / Nuxt • コンポーネント開発 • デザインシステム → 素のHTMLで作っていない → TypeScriptが基本 → CSS設計の概念が不要 → マイクロサービス化 Webサイト Webサービス/Webアプリ 制作パターンが 複雑化 制作パターンが 固定化 ← 今回はここに注目
  5. 1. Jamstackテンプレートとは(まとめ) • Webサイト・コーポートサイトのような静的サイトをHeadless CMS等のAPI 経由で更新できる仕組みで構築するためのテンプレート • コンポーネント開発の知見が増えている今の潮流に乗るために、Nuxtで開発 する •

    Webサイトでは状態管理ライブラリをがっつり活用するケースは多くない ※Nextはすでに事例がたくさんあるがNuxtの事例は少ない ※App Router登場でカオスみがある(Server ActionsもStableに)
  6. どのプロジェクトでもだいたい使いそうなもの • Googleアナリティクス等の解析タグ、タグマネージャー • sitemap.xml • CMSでの更新 • ページネーション •

    テスト • Storybookのようなスタイルガイド管理ツール もっとあるかも、ご意見募集中 (ただし機能を盛りすぎると逆に扱いが難しくなるので注意、Nextさん)
  7. 注意するポイント • Googleアナリティクス等の解析タグ、タグマネージャー ◦ NuxtLinkを使用する場合はSPAのようにコンテンツが切り替わるため、画面の遷移を解析タ グに伝える必要がある • sitemap.xml ◦ 大抵はプラグインがやってくれるが、不要なファイルまで載ってしまう

    ◦ 特定のページを追加・除外したい状況が発生するので、設定できるようにしておく • Headless CMSとの連携 ◦ どのサービスとも組み合わせやすいように、CMS特有の処理はフェッチの ロジック内でまとめる ◦ 下書きプレビューの実装
  8. Jamstackでは考慮する範囲が増える • 開発 → デプロイ環境 ◦ レンタルサーバー?オンプレミス? ◦ クラウド? ▪

    AWS:S3、Netlify、Vercel、Cloudflareなどなど ◦ GitHub?GitLab? • Headless CMSとbuildコマンドの連携 ◦ 日時指定の公開、非公開 ◦ 下書きプレビューはリアルタイムで確認したい
  9. コンポーネント名・ファイル名の決め方 • コンポーネントは大文字から始める ◦ 🙆 <Button /> ◦ 🙅 <button

    /> • layoutに関わるような一度しか使わないcomponentはTheをつけていたが公 式ドキュメントからなくなった? ◦ 例)<TheHeader /> • ディレクトリ構造がコンポーネントを呼び出すときの名前になる ◦ components/Parts/Button.vue → <PartsButton /> Nuxt公式ドキュメントより参照 https://nuxt.com/docs/guide/directory-structure/components
  10. Nuxt 3で複数のBuildに対応 • Static Site Generate(SSG) • Server Side Rendering(SSR)

    • Client Side Rendering(CSR) • Incremental Static Regeneration(ISR) • Stale While Revalidate(SWR) WebサイトではSSGで足りることも多いが、 ページ数が大量になると比例してGenerate時間 も膨大になるため、SSR等の検討も必要 nuxt.config.tsでディレクトリごとに設定可能 参照 https://nuxt.com/docs/guide/concepts/rendering
  11. 3. 汎用的にするための工夫(まとめ) • 引き継ぎしやすいように複雑化を避ける、独自ルールを作らない • 公式ドキュメントを参考にしよう • ディレクトリ構造はNuxtのデフォルトをベースにしつつ、コンポーネント分 割は参考文献をあたろう •

    WebサービスやWebアプリの設計も参考になる(ただし同じにするのは難し いので良いところを取り入れる) • 運用フェーズの更新頻度や体制に合わせてBuild方法を検討する