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.
<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.
<template>
  <div class="p-4 mb-4 text-white bg-blue-500">
    <p><slot name="info-box">default</slot></p>
  </div>
</template>
 <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.
<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.
<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 add prism-themes
 npm install prism-themes
 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.
<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.
generate avec le module @nuxt/content de manière programmatique.Prochaine étape
 
        N3-rd
       
 
        Adrien Zaganelli
       
 
        Mag
       
 
        Stefan Huber
       
 
        Olga Bulat
       
 
        Maciek Palmowski
       
 
        Sébastien Chopin
       
 
        Daniel Roe
       
 
        Clément Ollivier
       
 
        Paiva
       
 
        Florian Reuschel
       
 
        Rishi Raj Jain
       
 
        Savas Vedova
       
 
        Steven Soekha
       
 
        Vinícius Alves
       
 
        Kareem Dabbeet
       
 
        Valentín Costa
       
 
        Ryan Skinner
       
 
        Alex Hirzel
       
 
        Ajeet Chaulagain
       
 
        René Eschke
       
 
        Nico Devs
       
 
        Muhammad
       
 
        Nazaré da Piedade
       
 
        Naoki Hamada
       
 
        Tom
       
 
        Yann Aufray
       
 
        Anthony Chu
       
 
        Nuzhat Minhaz
       
 
        Lucas Portet
       
 
        Richard Schloss
       
 
        bpy
       
 
        Antony Konstantinidis
       
 
        Hibariya
       
 
        Jose Seabra
       
 
        Eze
       
 
        Florian LEFEBVRE
       
 
        Lucas Recoaro
       
 
        Julien SEIXAS
       
 
        Hugo
       
 
        Sylvain Marroufin
       
 
        Spencer Cooley
       
 
        Piotr Zatorski
       
 
        Vladimir Semyonov
       
 
        Harry Allen
       
 
        kazuya kawaguchi
       
 
        Unai Mengual
       
 
        Hyunseung
       
 
        Alexandre Chopin
       
 
        pooya parsa
       
 
        Nick Medrano
       
 
        Mosaab Emam
       
 
        Ilja
       
 
        Heitor Ramon Ribeiro
       
 
        Nero
       
 
        Yoon Han