返回首页

用 Nuxt 3 搭建个人博客:从设计稿到 Cloudflare 上线

技术
2025-10-18 512 0 2 min

这个博客从一张设计稿开始,到部署上线,总共花了不到一周的业余时间。这篇文章记录技术选型和实现细节,也当作给自己的一份文档。

为什么不用现成的博客主题

我试过三个流行的博客主题,最后都放弃了。原因很简单:它们都在解决别人的问题。

我需要的是:

  • 首屏要有一个能承载情绪的视觉区域
  • 文章列表要能同时展示「精选」和「常规」两种密度
  • 分类、标签、归档三种浏览方式并存
  • 移动端不能只是「能看」,要好用

这些需求用现成主题改,比自己写还慢。

内容层:Markdown 即数据库

文章就是仓库里的 .md 文件,frontmatter 存元信息:

yaml
---
title: "文章标题"
description: "用于列表和 SEO 的描述"
date: 2025-10-18
category: 技术
tags: [Nuxt, Vue]
views: 512
featured: true
---

构建时用 Vite 的 import.meta.glob 把所有 Markdown 内联进产物:

typescript
const rawFiles = import.meta.glob('~~/content/posts/*.md', {
  query: '?raw',
  import: 'default',
  eager: true,
})

这样做的最大好处是:不需要数据库,也不需要运行时文件系统,因此可以直接跑在 Cloudflare Workers 上。

渲染:marked + highlight.js

Markdown 转 HTML 用 marked,代码高亮用 highlight.js 的核心包,只注册用得到的语言:

typescript
import hljs from 'highlight.js/lib/core'
import typescript from 'highlight.js/lib/languages/typescript'

hljs.registerLanguage('typescript', typescript)

只注册需要的语言,能把高亮部分的体积从 900KB 压到 80KB 左右。

样式:Tailwind v4 + CSS 变量

配色不写死在类名里,而是定义成 CSS 变量,再由 @theme inline 映射给 Tailwind:

css
:root {
  --c-surface: #ffffff;
  --c-text: #0d1526;
}

.dark {
  --c-surface: #0c1322;
  --c-text: #e9eefb;
}

@theme inline {
  --color-surface: var(--c-surface);
  --color-ink: var(--c-text);
}

这样切换深色模式只需要在 <html> 上加一个 dark 类,所有组件自动适配。

部署:一个 wrangler 配置搞定

jsonc
{
  "name": "yunmasoft-blog",
  "main": ".output/server/index.mjs",
  "compatibility_date": "2026-01-01",
  "compatibility_flags": ["nodejs_compat"],
  "assets": {
    "directory": ".output/public",
    "binding": "ASSETS"
  }
}

构建命令 nuxt build,部署命令 wrangler deploy。所有页面在构建时预渲染成静态资源,Workers 只负责兜底路由。

性能数据

上线后跑了一次 Lighthouse:

指标 分数
Performance 99
Accessibility 96
Best Practices 100
SEO 100

首屏 HTML 只有 28KB(gzip 后 9KB),没有任何阻塞渲染的外部字体请求。

小结

这个博客的核心设计原则是:能静态就静态,能构建期做就构建期做。

没有数据库、没有运行时依赖、没有第三方服务,一个 wrangler deploy 就能上线。对个人项目来说,这是最省心的架构。

评论

友善交流,邮箱不会公开

发表评论

未配置人机验证,已启用频率限制与内容过滤