You are browsing Nuxt 2 docs. Go to Nuxt 3 docs, or learn more about Nuxt 2 Long Term Support.

Page traduite Le contenu de cette page peut être déprécié.

content

Augmentez le potentiel de votre application Nuxt avec le module @nuxt/content grâce auquel on peut écrire dans un répertoire content/ et récupérer du Markdown, JSON, YAML et des fichiers CSV à travers une API dans le style de MongoDB, qui remplit donc le rôle d'un CMS headless basé sur Git.


Rechargement à chaud lors du développement

En développement, le module content est super rapide quand il s'agit de rechargement à chaud car il ne doit pas passer par Webpack lorsque l'on fait des changements à nos fichiers markdown. On peut aussi écouter l'événement content:update et créer un plugin qui à chaque fois que l'on va mettre à jour un fichier dans le répertoire content, va propager une méthode fetchCategories par exemple.

Afficher le contenu

On peut directement utiliser le composant <nuxt-content> dans notre template pour afficher le corps de la page.

pages/blog/_slug.vue
<template>
  <article>
    <nuxt-content :document="article" />
  </article>
</template>

Styliser votre contenu

En fonction de ce que l'on va utiliser pour styliser notre application, on pourrait avoir besoin d'écrire un peu de style pour afficher notre markdown proprement.

Le composant <nuxt-content> va automatiquement ajouter une classe .nuxt-content, afin que nous puissions personnaliser nos styles.

<style>
  .nuxt-content h2 {
    font-weight: bold;
    font-size: 28px;
  }
  .nuxt-content p {
    margin-bottom: 20px;
  }
</style>

Gérer les formats Markdown, CSV, YAML, JSON(5)

This module converts your .md files into a JSON AST tree structure, stored in a body variable. You can also add a YAML front matter block to your markdown files or a .yaml file which will be injected into the document. You can also add a json/json5 file which can also be injected into the document. And you can use a .csv file where rows will be assigned to the body variable.

Ce module convertit nos fichiers .md en une structure arborescente de type JSON AST , stockée dans une variable body.

---
title: Mon premier article de blog
description: Apprendre à se servir de @nuxt/content pour créer un blog
---

Composants Vue dans le markdown

On peut utiliser les composants Vue directement dans les fichiers markdown. Il faudra cependant utiliser les composants sous leur écriture kebab-case et non avec des balises auto-fermantes.

components/global/InfoBox.vue
<template>
  <div class="p-4 mb-4 text-white bg-blue-500">
    <p><slot name="info-box">default</slot></p>
  </div>
</template>
content/articles/my-first-blog-post.md
<info-box>
  <template #info-box>
    This is a vue component inside markdown using slots
  </template>
</info-box>

API entièrement recherchable

On peut utiliser $content() pour lister, filtrer et chercher notre contenu facilement.

pages/blog/index.vue
<script>
  export default {
    async asyncData({ $content, params }) {
      const articles = await $content('articles', params.slug)
        .only(['title', 'description', 'img', 'slug', 'author'])
        .sortBy('createdAt', 'asc')
        .fetch()

      return {
        articles
      }
    }
  }
</script>

Articles précédents et suivants

Le module content inclut un .surround(slug) qui nous permet de récupérer facilement les articles précédents et suivants.

async asyncData({ $content, params }) {
    const article = await $content('articles', params.slug).fetch()

    const [prev, next] = await $content('articles')
      .only(['title', 'slug'])
      .sortBy('createdAt', 'asc')
      .surround(params.slug)
      .fetch()

    return {
      article,
      prev,
      next
    }
  },
<prev-next :prev="prev" :next="next" />

Recherche par texte complet

Le module content possède une recherche par texte complet afin que l'on puisse rechercher simplement dans nos fichiers markdown sans avoir à installer quoi que ce soit d'autre.

components/AppSearchInput.vue
<script>
  export default {
    data() {
      return {
        searchQuery: '',
        articles: []
      }
    },
    watch: {
      async searchQuery(searchQuery) {
        if (!searchQuery) {
          this.articles = []
          return
        }
        this.articles = await this.$content('articles')
          .limit(6)
          .search(searchQuery)
          .fetch()
      }
    }
  }
</script>

Surbrillance de la syntaxe

Ce module va automatiquement envelopper les blocks de code et y appliquer les classes de PrismJS . On peut bien sûr ajouter un thème PrismJS différent voire même le désactiver totalement.

Yarn
yarn add prism-themes
NPM
npm install prism-themes
nuxt.config.js
content: {
  markdown: {
    prism: {
      theme: 'prism-themes/themes/prism-material-oceanic.css'
    }
  }
}

Personnaliser le parsing du markdown

À l'origine, le markdown ne supporte pas la surbrillance des lignes que ce soit dans les blocks de code ou dans les noms de fichiers. Le module content permet cela avec sa propre syntaxe. Les lignes numérotées seront ajoutées à une balise pre dans l'attribut data-line et le nom du fichier sera converti en un span avec une classe filename, afin d'être stylisé.

Génération d'une table des matières

Une propriété toc (pour Table of Contents) contenant un tableau, sera injectée dans notre document, listant tous les entêtes avec leurs titres et identifiants, afin que l'on puisse les lier.

pages/blog/_slug.vue
<nav>
  <ul>
    <li v-for="link of article.toc" :key="link.id">
      <NuxtLink :to="`#${link.id}`">{{ link.text }}</NuxtLink>
    </li>
  </ul>
</nav>

Un QueryBuilder d'API puissant

Le module content possède un puissant QueryBuilder d'API (similaire à MongoDB) qui nous permet de facilement voir le JSON de chaque répertoire à l'URL http://localhost:3000/_content/. L'extrémité est accessible via des requêtes GET et POST, on peut donc utiliser des query params.

http://localhost:3000/_content/articles?only=title&only=description&limit=10

Personnaliser avec des hooks

On peut utiliser des hooks pour personnaliser le module afin d'ajouter de la data au document avant que ce dernier ne soit stocké.

Intégration avec @nuxtjs/feed

Dans le cas d'articles, le contenu peut être utilisé pour générer un fil d'actualité en utilisant le module @nuxtjs/feed .

Support pour la génération de site statique

Ce module marche avec la génération de site statique en utilisant nuxt generate. Toutes les routes seront automatiquement générées grâce à la fonctionnalité du crawler de Nuxt.

Si on utilise Nuxt avec une version <2.13 et que l'on a besoin de spécifier des routes dynamiques, il faut utiliser la méthode generate avec le module @nuxt/content de manière programmatique.

Prochaine étape