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
Sébastien Chopin
Nazaré da Piedade
Nobu
川音리오
Maciek Palmowski
Nestor Vera
Daniel Roe
Yue Yang
Jeronimas
Clément Ollivier
Alexander Lichter
N3-rd
Adrien Zaganelli
Mag
Stefan Huber
Olga Bulat
Paiva
Florian Reuschel
Savas Vedova
HIJACK
Vinícius Alves
Kareem Dabbeet
Valentín Costa
Ryan Skinner
Alex Hirzel
Ajeet Chaulagain
René Eschke
Nico Devs
Muhammad
Naoki Hamada
Tom
Yann Aufray
Anthony Chu
Nuzhat Minhaz
Lucas Portet
Richard Schloss
Bobby
bpy
Antony Konstantinidis
Hibariya
Jose Seabra
Eze
Florian Lefebvre
Lucas Recoaro
Julien SEIXAS