Stalux Astro博客主题自荐

🕒 阅读时间:6 min read 👀 阅读量: Loading...

历经多次打磨和稍微的优化,终于完成了Stalux这一个astro主题,也就是当前xingwangzhe.fun所使用的主题.

展示主题图片

仓库: xingwangzhe/stalux

演示地址: https://stalux.needhelp.icu

主题特点

简洁美观

从背景图就能看到,极简主义Minimalism) + 微妙装饰subtle decorative)的设计风格,虽然背景图每次刷新都是繁杂的物品事物平铺,但又不失简约的线条风格,正所谓繁中有简,简中有繁,有没有让你回忆起找你妹这个游戏呢?. 背景图来自于figma-Telegram SVG Wallpapers(CC BY 4.0)

当然,主题为了保持简洁,只存在暗色主题,没有浅色主题的打算,很多DOM的组件几乎都是毛玻璃透明的,进一步简化了渲染的复杂度,让用户可以专注于内容本身

视图过渡

Astro有特点,那就是静态站点生成(SSG),所以在页面跳转时,会有白屏闪烁的问题,为了解决这个问题,主题使用了视图过渡动画的方式来实现页面的无刷新跳转,比如说导航和页脚,以及某些与页面内容无关的时间,作者信息等组件都保持状态,刷新页面时,只会更新中间的内容区域,从而达到无刷新跳转的效果

当然,某些脚本可能会出现问题,官方的astro:page-load事件监听解决了问题,使得在页面跳转后,评论,导航等脚本都能正常工作

内容优先

支持CommonMark语法,并且内置了很多实用的功能,比如说代码高亮,Mermaid,Katex(类似于Latex)等,让用户可以专注于内容的创作,而不是花费大量时间在排版上

注意,不同于固定的Astro模板定义,内容合集不在src/content目录下,而是在stalux/postsstalux/about下,这样用户可以更方便地管理自己的内容,而且也能更好地利用Astro的内容集合功能

hello world
function world(params: type) {
console.log("hello world");
}
graph TD
    A[Christmas] -->|Get money| B(Go shopping)
    B --> C{Let me think}
    C -->|One| D[Laptop]
    C -->|Two| E[iPhone]
    C -->|Three| F[fa:fa-car Car]

E=MC2E=MC^2

yaml配置

综合考量ts,json,toml等配置文件的优缺点,最终选择了yaml作为主题的配置文件格式,因为yaml相对于其他格式来说,更简洁易读,并且支持注释,方便用户理解和修改配置项

而且,Astro原生支持yaml作为内容合集,那么我就可以定义一个config.yaml文件,来集中管理主题的配置项,比如说站点标题,描述,作者信息,社交链接等

src/content.config.ts
import { defineCollection } from "astro:content";
...
const config = defineCollection({
loader: file("config.yml"),
schema: z.object({
title: z.string(),
url: z.string().url(),
description: z.string(),
canonical: z.string().url().optional(),
twitterSite: z.string().optional(),
noindex: z.boolean().optional().default(false),
nofollow: z.boolean().optional().default(false),
anyhead: z.string().optional(),
favicon: z.string().optional().default("/favicon.ico"),
author: z.object({
name: z.string(),
avatar: z.string(),
bio: z.string(),
}),
navs: z.array(
z.object({
title: z.string(),
icon: z.string(),
link: z.string(),
}),
),
typetexts: z.array(z.string()).optional(),
mediaLinks: z
.array(
z.object({
icon: z.string(),
link: z.string(),
}),
)
.optional(),
links: z.object({
title: z.string(),
description: z.string(),
sites: z.array(
z.object({
name: z.string(),
description: z.string(),
icon: z.string(),
link: z.string(),
}),
),
}),
footer: z
.object({
startYear: z.number().optional(),
icp: z.string().optional(),
pubsec: z.string().optional(),
pubsecNumber: z.string().optional(),
buildtime: z.string().optional(),
copyright: z
.object({
enabled: z.boolean().optional().default(true),
startYear: z.number().optional(),
customText: z.string().optional(),
})
.optional(),
theme: z
.object({
showPoweredBy: z.boolean().optional().default(true),
showThemeInfo: z.boolean().optional().default(true),
})
.optional(),
beian: z
.object({
icp: z
.object({
enabled: z.boolean().optional().default(false),
number: z.string().optional(),
})
.optional(),
security: z
.object({
enabled: z.boolean().optional().default(false),
text: z.string().optional(),
number: z.string().optional(),
})
.optional(),
})
.optional(),
badges: z
.array(
z.object({
label: z.string(),
message: z.string(),
color: z.string().optional(),
style: z.string().optional(),
alt: z.string().optional(),
href: z.string().optional(),
}),
)
.optional(),
custom: z.string().optional(),
})
.optional(),
comment: z
.object({
enabled: z.boolean().optional().default(false),
waline: z
.object({
serverURL: z.string().url().optional(),
lang: z.string().optional().default("zh-CN"),
locale: z.any().optional(),
emoji: z
.array(z.string())
.optional()
.default(["https://unpkg.com/@waline/emojis@1.1.0/weibo"]),
reaction: z.boolean().optional().default(false),
meta: z.array(z.string()).optional().default(["nick", "mail", "link"]),
requiredMeta: z.array(z.string()).optional().default([]),
login: z.string().optional().default("enable"),
recaptchaV3Key: z.string().optional(),
turnstileKey: z.string().optional(),
dark: z.union([z.string(), z.boolean()]).optional().default(true),
noCopyright: z.boolean().optional().default(false),
commentSorting: z.string().optional().default("latest"),
imageUploader: z.any().optional(),
highlighter: z.any().optional(),
texRenderer: z.any().optional(),
search: z.any().optional(),
wordLimit: z.number().optional().default(200),
pageSize: z.number().optional().default(10),
})
.optional(),
})
.optional(),
}),
});

看起来非常地多,但实际上写yaml配置的适合,还是很轻松的,而且得益于内容集合,配置项即使出现错误,丢失,也会有content.config.ts类型校验来保障配置的正确性

丰富的功能

waline评论区配置,社交媒体链接 使用simple-icons图标库,导航图标 使用feather图标库,多种徽章支持,等等就不一一列举

结语

总的来说,如果你喜欢SSG类型的博客,并且想要一个简洁美观,功能丰富的主题,那么Stalux绝对是一个不错的选择,希望大家能够喜欢这个主题,并且在使用过程中提出宝贵的意见和建议,让这个主题变得更加完善和优秀.

Stalux Astro博客主题自荐

作者:xingwangzhe

本文链接: https://xingwangzhe.fun/posts/stalux-astro/

本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

留言评论