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

Document-Driven 概念を知りたい

Document-Driven 概念を知りたい

nuxt/content v2 の Document-Driven Mode がどういうものなのか、実際に Document-Driven Mode にするとどうなるのかというのが何もわからなかったのでざっと調べてまとめたもの。社内のテックランチで発表した内容。

Ryuhei Shikanai

November 29, 2022
Tweet

More Decks by Ryuhei Shikanai

Other Decks in Technology

Transcript

  1. (その前に)nuxt/content はいいぞ ざっくり言うと nuxt に内臓された Headless CMS レイアウトを作ってしまえば、コンテンツは markdown ベースでモ

    リモリ書ける 最終的なアウトプットが静的なメディアや個人ブログ、ドキュメ ントなどを作る際に強い
  2. 抜本的なコンテンツ表示方法の変更 v1 だと markdown の中身表示用の page を作って、script 内で fetch してきたものを表示する、みたいな言ってしまえば他の

    Headless CMS とあまり変わらない心地だった v2 だとテンプレートに <ContentDoc /> を書くだけで markdown の 中身を出すだけなら終わる ※その他にも <ContentList> とか <ContentNavigation> みたいな よくあるものを生成するコンポーネントが用意されていて強い
  3. <template> <article> <h1>{{ page.title }}</h1> <nuxt-content :document="page" /> </article> </template>

    <script> export default { async asyncData ({ $content }) { const page = await $content('home').fetch() return { page } } } </script>
  4. markdown スタイルのカスタマイズ v1 のときは <nuxt-content :document="page"> で markdown を渡す と

    <div class="nuxt-content">(中身)</div> という HTML が吐き出 されるのでそのクラス( .nuxt-content )の中で各要素の CSS を書 いていた markdown 用の CSS テーマをどっかからもってくる場合は別に良 いが、自分で調整するとなると面倒な仕様だった
  5. markdown スタイルのカスタマイズ v2 は各 HTML 要素( <p> とか <h1> とか)ごとにデフォルトのコ

    ンポーネントが用意されている。 それをオーバーライドすることで CSS だけでなくコンポーネント単位でカスタマイズできるようにな っている
  6. MDC Syntax MDC = Markdown Components。 components/content/ 以下のコン ポーネントを明示的なインポート無しで(若干気持ち悪い構文で記 述すると)

    markdown 内でしゅっと使える機能。 markdown だけだと表現しにくい見た目とか動きをコンポーネント として切り出してそこだけ SFC で管理できる
  7. MDC Syntax v1 でも一応利用可能ではあったが、markdown内で <component-name></component-name> という記法で記述し、「その markdown ファイルを使うページ」の script 内で

    import してきて components に登録する、という手順を踏まなければならなかった ので使い勝手が悪かった
  8. MDC Syntax <template> <div class="card"> <slot /> </div> </template> <style

    scoped> .card { padding: 1.5rem; border-width: 1px; border-style: solid; border-color: #000; border-radius: 0.25rem; } </style>
  9. MDC Syntax # ページタイトル この辺は通常の markdown だよ。本文本文本文。 - リスト -

    リスト ::card ← これ カードコンポーネントの中身をここに記述できる(コンポーネント側の `<slot />` に渡る) ::
  10. Document-driven モードとは ドキュメントによると The Document-driven development mode gives a lot

    more power to Markdown-based websites. とのことら しい The Document-driven development mode が give する a lot more な power とはなんなのかを調べるために我々は南米へ飛んだ
  11. Document-driven モードにするには nuxt.config.ts で content: { documentDriven: true } にするだけ

    export default defineNuxtConfig({ modules: ['@nuxt/content'], content: { documentDriven: true // ← これ } })
  12. Document-driven モードにすると... ルートが app.vue (ないし pages/index.vue )ではなく、 content/index.md になる content/

    以下のディレクトリが直接ページにバインドされる 例: content/page1.md は /page1 に対応する
  13. Document-driven モードにすると... ルートが app.vue (ないし pages/index.vue )ではなく、 content/index.md になる content/

    以下のディレクトリが直接ページにバインドされる 例: content/page1.md は /page1 に対応する useContent() によるグローバル変数の提供 特に何も記述しなくても現在のコンテンツに基づいた参照情報を もってこれる ナビゲーション、前後のページのタイトル・パス、抜粋、目 次、など...