Добавьте время последнего изменения
Узнайте как создать плагин remark, который добавляет время последнего изменения к frontmatter ваших Markdown и MDX файлов. Используйте это свойство для отображения времени последнего изменения на ваших страницах.
:::note[Использует историю Git]Этот рецепт вычисляет время на основе истории Git вашего репозитория и может быть неточным на некоторых платформах. Ваш хостинг может выполнять shallow clones, которые не получают полную историю Git.:::
Рецепт
Установите необходимые пакеты
Установите
Day.jsдля модификации и форматирования времени:npm install dayjspnpm add dayjsyarn add dayjsСоздайте плагин Remark
Этот плагин использует
execSyncдля запуска комманды Git, которая возвращает временную метку последнего коммита в формате ISO 8601. Далее временная метка добавляется к frontmatter файла.import { execSync } from "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(); }; }Использование файловой системы вместо Git
Хотя использование Git является рекомендуемым способом получения времени последнего изменения, возможно использование времени последнего изменения из файловой системы.Этот плагин использует
statSyncдля полученияmtime(время изменения) файла в формате ISO 8601. Далее временная метка добавляется к frontmatter файла.import { statSync } from "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(); }; }Добавьте плагин в свой конфиг
import { defineConfig } from 'astro/config'; import { remarkModifiedTime } from './remark-modified-time.mjs'; export default defineConfig({ markdown: { remarkPlugins: [remarkModifiedTime], }, });Сейчас все документы Markdown будут иметь свойство
lastModifiedв своём frontmatter.Отобразите время последнего изменения
Если ваш контент находится в коллекции контента (EN), получите
remarkPluginFrontmatterиз функцииrender(entry). Далее, отобразитеlastModifiedв вашем шаблоне там, где вы хотите.--- 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>...</head> <body> ... <p>Last Modified: {lastModified}</p> ... </body> </html>Если вы используете макет Markdown, используйте свойство frontmatter
lastModifiedизAstro.propsв вашем шаблоне макета.--- 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>...</head> <body> <p>{lastModified}</p> <slot /> </body> </html>