nuxtでmdの読み込もうとしたら、いろいろでてきたため、めもしておきます。最終的に@nuxt/contentを採用しました。
nuxtでmdの読み込み比較
ぐぐったらいろいろとでてきました。
- rontmatter-markdown-loader
- raw-loader
- markdown-it
- markdown-to-vue-loader
- nuxt/content
軽く口コミを調査しました。
frontmatter-markdown-loader
nuxt/content試したいなぁー。もうfrontmatter-markdown-loaderいらないかも。
— たかもそ/Web Developer (@takamosoo) May 23, 2020
raw-loader
npmをみると、ダウンロード数は多そうです。
WebPack 5 からは raw-loader とか file-loader いらなくなったのか。
— Tomoyuki Hata (@hata6502) June 1, 2021
markdown-it
nuxtでmarkdownブログ作ってるけど、markdown-itは結局うまくいかなかった🤔
かわりにnuxt/contentを使ったら全部うまくいったどころか記事取得の条件指定が便利すぎて、カテゴリー・タグ検索の実装からページング高速化、全文検索まで全てのかゆいところに手が届くという代物だった
つよい。— yusuke (@uskcr8) November 3, 2021
nuxt/content
raw-loaderの記事をQiitaに書いていたきらぷかさん、のちほどnuxt/contentをおしています。
書いた!ブログ作らないからnuxt/content使わないかな〜と思ったけど、ヘルプや利用規約とかにすごくよかった(*´ω`*)
マークダウンでかけて、自分のコンポーネントも使えるので便利(*´ω`*)#はてなブログ
@nuxt/contentでヘルプや使い方のページをサクッと作る – くらげ…https://t.co/tijwhe7Mfc— きらぷか@積読&スプシAPI化のサービス運営中🔥 (@kira_puka) August 24, 2021
CSSオレオレフレームワークのドキュメントを
Vuepress から Nuxt/content に載せ替え作業中。
良かった点は以下の通り。・マークダウンのホットリロードが爆速
・カスタマイズが簡単(Vuepressだと結構ブラックボックスになっている箇所があってカスタマイズが面倒くさい) pic.twitter.com/0tQayTMP5z— tyai-a (@tyai_a) May 30, 2020
悪評もなかったし、Nuxtに備わった機能なのでNuxt/Contentにしました。
目次や全文検索など気になる機能もあったのも後押ししました。
開発モードでのビックリするほど高速なホットリロード
Markdownの中でVueコンポーネントを利用できます
全文検索
静的サイト生成(SSG)のサポートnuxt generate
強力なクエリビルダーAPI (MongoDBライク)
PrismJSを利用した、Markdown内コードブロックのシンタックスハイライト
目次の自動生成
Markdown, CSV, YAML, JSON(5)
XMLを適切に処理します
hooksによる拡張
npm install @nuxt/content
インストール。
npm install @nuxt/content
nuxt.configを設定。ここまでは公式のまんま。
{
modules: [
'@nuxt/content'
],
content: {
// Options
}
}
nuxt/contentの使い方(ブログも作れる)
単純にmdの読み込み
今回はヘルプページ を作成します。まずテスト読み込み。
contentのフォルダが生成されているため、とりあえず、フォルダ直下にtext.mdを作成します。
---
title: タイトル
---
# テスト
テストです。
次はvue側。表示はこう。await $content(‘test’).fetch()で取得しています。
async asyncData({ $content }) {
const helps = await $content('test').fetch()
return {
helps
}
}
<article>
<h1>{{ helps.title }}</h1>
<nuxt-content :document="helps" />
</article>
v-forで一覧取得
しかし、今回はヘルプページ の作成のためv-forで一覧取得にしたいです。
フォルダを掘ってmdファイルを配置します。testをhelpsというフォルダ名に変更します。
async asyncData({ $content }) {
const helps = await $content('helps')
.sortBy('title')
.fetch()
return { helps }
}
並び順がおかしかったため、sortByを追加しました。
html側もv-forで回して一覧表示に変えます。
<div v-for="help in helps" :key="help.slug">
<nuxt-link :to="'/helps/' + help.slug">
{{ help.title }}
</nuxt-link>
</div>
slug.vueを追加
slugにあたるところがありません。_slug.vueを作成します。
params.slugはnuxtのリファレンスを参照しましょう。
htmlです。helps.titleはタイトルを表示しなければなくてもかまいません。
<template>
<article>
<h1>{{ helps.title }}</h1>
<nuxt-content :document="helps" />
</article>
</template>
javascriptです。
export default {
async asyncData({ $content, params }) {
const helps = await $content('helps/', params.slug).fetch()
return { helps }
}
}
フォルダ構造
├── content
│ └── helps
│ ├── qa1.md
│ ├── qa2.md
│ └── qa3.md
~
├── pages
│ ├── helps
│ │ ├── _slug.vue
│ │ └── qa-list.vue
│ └── index.
最初リンク切れをおこしました。contentとpagesの直下にあるhelpsというフォルダ名が同名じゃないとダメでした。
nuxt/contentのcssの読み込み
_slug.vueにcssをかけばOKです。
<style>
.nuxt-content h1 {
font-size: 50px;
color: green;
}
</style>
ただ、ヘルプの場合、_slug.vue側でレイアウトを作る方が早い気がします。
<template>
<article>
<b-container fluid="xl">
<b-row class="mx-5 my-0 py-0">
<b-col cols="12">
<div class="qa-q">
<h2 class="help-title">{{ helps.title }}</h2>
</div>
<div class="qa-a">
<nuxt-content :document="helps" />
</div>
</b-col>
</b-row>
</b-container>
</article>
</template>
ご参考になれば幸いです。