feat: enhance blog and SEO features with new plugins and metadata
- Introduced rehypeLazyImages plugin for lazy loading images in blog posts. - Updated sitemap integration to include last modified dates for blog posts. - Enhanced Head and BaseLayout components to support additional Open Graph metadata. - Improved RSS feed generation with sanitized content and author information. - Updated manifest.json for a darker theme and standalone display mode. - Added support for language-specific attributes in various components. - Refactored blog post handling to include modified and published timestamps.
This commit is contained in:
@@ -1,17 +1,54 @@
|
||||
import { defineConfig } from "astro/config";
|
||||
import { globbySync } from "globby";
|
||||
import fs from "node:fs";
|
||||
import matter from "gray-matter";
|
||||
import path from "node:path";
|
||||
import rehypeExternalLinks from "rehype-external-links";
|
||||
import sitemap from "@astrojs/sitemap";
|
||||
|
||||
import { remarkReadingTime } from "./src/plugins/remarkReadingTime";
|
||||
import ogImages from "./src/integrations/ogImages";
|
||||
import sitemap from "@astrojs/sitemap";
|
||||
import rehypeLazyImages from "./src/plugins/rehypeLazyImages";
|
||||
|
||||
const blogDir = path.resolve("./src/content/blog");
|
||||
|
||||
const lastmodBySlug = Object.fromEntries(
|
||||
globbySync("*.md", { cwd: blogDir }).map((file) => {
|
||||
const slug = file.replace(/\.md$/, "");
|
||||
const { data } = matter(fs.readFileSync(path.join(blogDir, file), "utf8"));
|
||||
const date = data.dateModified ?? data.datePublished;
|
||||
return [slug, new Date(date).toISOString()];
|
||||
})
|
||||
);
|
||||
|
||||
const buildLastmod = new Date().toISOString();
|
||||
|
||||
export default defineConfig({
|
||||
site: "https://popov.link",
|
||||
output: "static",
|
||||
integrations: [sitemap(), ogImages()],
|
||||
integrations: [
|
||||
sitemap({
|
||||
serialize(item) {
|
||||
const url = new URL(item.url);
|
||||
const match = url.pathname.match(/^\/blog\/([^/]+)\/?$/);
|
||||
|
||||
if (match && lastmodBySlug[match[1]]) {
|
||||
item.lastmod = lastmodBySlug[match[1]];
|
||||
} else {
|
||||
item.lastmod = buildLastmod;
|
||||
}
|
||||
|
||||
return item;
|
||||
},
|
||||
}),
|
||||
ogImages(),
|
||||
],
|
||||
build: {
|
||||
inlineStylesheets: "always",
|
||||
},
|
||||
markdown: {
|
||||
remarkPlugins: [remarkReadingTime],
|
||||
rehypePlugins: [[rehypeExternalLinks, { target: "_blank", rel: ["noopener", "noreferrer"] }], rehypeLazyImages],
|
||||
shikiConfig: {
|
||||
theme: "vitesse-dark",
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user