Ajouter la date de la dernière modification
Apprenez à créer un module d’extension mdast qui ajoute la date de la dernière modification en tant que propriété personnalisée du frontmatter de vos fichiers Markdown et MDX. Utilisez cette propriété pour afficher la date de modification dans vos pages.
Cette recette calcule la date en fonction de l’historique Git de votre dépôt, et celle-ci peut ne pas être précise sur certaines plateformes de déploiement. Votre hébergeur peut effectuer des clones superficiels qui ne récupèrent pas l’historique Git complet.
-
Installez les paquets suivants en fonction du processeur Markdown utilisé :
Day.jspour modifier et formater les dates@astrojs/markdown-satteripour configurer le processeursatteri()satteripour créer un module d’extensionmdastpour Sätteri
Terminal window npm install dayjs @astrojs/markdown-satteri satteriTerminal window pnpm add dayjs @astrojs/markdown-satteri satteriTerminal window yarn add dayjs @astrojs/markdown-satteri satteriDay.jspour modifier et formater les dates@astrojs/markdown-remarkpour utiliser le processeurunified()
Terminal window npm install dayjs @astrojs/markdown-remarkTerminal window pnpm add dayjs @astrojs/markdown-remarkTerminal window yarn add dayjs @astrojs/markdown-remark -
Créez un module d’extension mdast.
Ce module d’extension utilise
execSyncpour exécuter une commande Git qui renvoie l’horodatage du dernier commit au format ISO 8601. L’horodatage est ensuite ajouté au frontmatter du fichier.src/mdast/mdast-modified-time.ts import { execSync } from "node:child_process";import { fileURLToPath } from "node:url";import { defineMdastPlugin } from "satteri";export const mdastModifiedTimePlugin = defineMdastPlugin({name: "mdast-modified-time",before(root, context) {if (!context.fileURL) return;const filepath = fileURLToPath(context.fileURL);const result = execSync(`git log -1 --pretty="format:%cI" "${filepath}"`);if (context.data.astro !== undefined) {context.data.astro.frontmatter.lastModified = result.toString();}},});remark-modified-time.mjs import { execSync } from "node:child_process";export function remarkModifiedTime() {return function (tree, file) {const filepath = file.history[0];const result = execSync(`git log -1 --pretty="format:%cI" "${filepath}"`);file.data.astro.frontmatter.lastModified = result.toString();};}Utiliser le système de fichiers au lieu de Git
Bien que l’utilisation de Git soit la méthode recommandée pour obtenir l’horodatage de la dernière modification d’un fichier, il est possible d’utiliser la date de modification du fichier dans le système de fichiers. Ce module d’extension utilise
statSyncpour obtenir la date de modification (mtime) du fichier au format ISO 8601. L’horodatage est ensuite ajouté au frontmatter du fichier.src/mdast/mdast-modified-time.ts import { statSync } from "node:fs";import { fileURLToPath } from "node:url";import { defineMdastPlugin } from "satteri";export const mdastModifiedTimePlugin = defineMdastPlugin({name: "mdast-modified-time",before(node, context) {if (!context.fileURL) return;const filepath = fileURLToPath(context.fileURL);const result = statSync(filepath);if (context.data.astro !== undefined) {context.data.astro.frontmatter.lastModified = result.mtime.toISOString();}},});remark-modified-time.mjs import { statSync } from "node:fs";export function remarkModifiedTime() {return function (tree, file) {const filepath = file.history[0];const result = statSync(filepath);file.data.astro.frontmatter.lastModified = result.mtime.toISOString();};} -
Ajoutez le module d’extension à votre configuration :
astro.config.mjs import { satteri } from "@astrojs/markdown-satteri";import { defineConfig } from "astro/config";import { mdastModifiedTimePlugin } from "./src/mdast/mdast-modified-time";export default defineConfig({markdown: {processor: satteri({mdastPlugins: [mdastModifiedTimePlugin],}),},});astro.config.mjs import { unified } from "@astrojs/markdown-remark";import { defineConfig } from "astro/config";import { remarkModifiedTime } from "./remark-modified-time.mjs";export default defineConfig({markdown: {processor: unified({remarkPlugins: [remarkModifiedTime],}),},});Désormais, tous les documents Markdown auront une propriété
lastModifieddans leur frontmatter. -
Affichez la date de la dernière modification
Si votre contenu est stocké dans une collection de contenu, accédez à
remarkPluginFrontmatterdepuis la fonctionrender(). Ensuite, affichezlastModifieddans votre modèle à l’endroit où vous souhaitez qu’il apparaisse.src/pages/posts/[slug].astro ---import { getCollection, render } from "astro:content";import dayjs from "dayjs";import utc from "dayjs/plugin/utc";dayjs.extend(utc);export async function getStaticPaths() {const blog = await getCollection("blog");return blog.map((entry) => ({params: { slug: entry.id },props: { entry },}));}const { entry } = Astro.props;const { Content, remarkPluginFrontmatter } = await render(entry);const lastModified = dayjs(remarkPluginFrontmatter.lastModified).utc().format("HH:mm:ss DD MMMM YYYY UTC");---<html><head><meta charset="utf-8" /><title>{entry.data.title}</title></head><body><title>{entry.data.title}</title><p>Dernière modification : {lastModified}</p><Content /></body></html>Si vous utilisez une mise en page Markdown, utilisez la propriété
lastModifieddu frontmatter accessible depuisAstro.propsdans votre modèle de mise en page.src/layouts/BlogLayout.astro ---import dayjs from "dayjs";import utc from "dayjs/plugin/utc";dayjs.extend(utc);const lastModified = dayjs().utc(Astro.props.frontmatter.lastModified).format("HH:mm:ss DD MMMM YYYY UTC");---<html><head><meta charset="utf-8" /></head><body><p>{lastModified}</p><slot /></body></html>