嘿,欢迎来到我的博客开发历程分享!这篇文章将带你了解我如何从零开始,使用Docusaurus构建这个你现在正在浏览的个人博客网站。从最初的技术选型纠结,到一步步实现各种功能,再到最终部署上线,我会分享整个过程中的思考、挑战和解决方案。
为什么我最终选择了Docusaurus
说实话,选择一个合适的博客框架真的让我头疼了好一阵子。市面上有太多选择,每个都有各自的优缺点。在做决定之前,我花了不少时间研究和对比了几个主流的静态站点生成器:
我考虑过的其他选择
- Next.js:
- ✅ 极其强大的React框架,几乎能实现任何功能
- ✅ 支持SSR/SSG/ISR等多种渲染方式
- ❌ 需要从头开始搭建博客功能,工作量大
- ❌ 配置相对复杂,学习曲线陡峭
- ❌ 对于"只是想要一个博客"来说有点大材小用
- Hugo:
- ✅ 构建速度惊人(Go语言编写)
- ✅ 部署简单,不依赖Node.js环境
- ❌ 使用Go模板语言,不是我熟悉的技术栈
- ❌ 自定义组件相对困难
- ❌ 主题定制需要深入了解Hugo的模板系统
- Hexo:
- ✅ 专为博客设计,中文社区活跃
- ✅ 主题和插件生态丰富
- ❌ 很多主题质量参差不齐,需要大量修改
- ❌ EJS模板不如React组件灵活
- ❌ 文档质量不够高,有些功能需要自己摸索
- VuePress/VitePress:
- ✅ 基于Vue生态,界面美观
- ✅ 文档支持良好
- ❌ 主要针对文档网站,博客功能是次要的
- ❌ 我更熟悉React而非Vue
为什么Docusaurus最终胜出
经过一番对比和实验,我最终选择了Docusaurus,主要基于以下几点考虑:
- React驱动的开发体验:作为一名React开发者,我可以直接利用已有的技能和组件库。不需要学习新的模板语言,直接用JSX就能自定义任何部分。
// 举个例子,我可以轻松创建自定义React组件
function Hero() {
return (
<div className={styles.hero}>
<div className={styles.intro}>
<h1>王起哲的博客</h1>
<p>在这里分享我的技术探索之旅</p>
</div>
</div>
);
}
- 开箱即用的完整功能:Docusaurus提供了博客所需的几乎所有功能,包括:
- 文章列表和分类
- 标签系统
- 全文搜索(集成Algolia)
- 代码高亮
- 暗黑模式
- 国际化支持
- SEO优化
这意味着我可以专注于内容和定制,而不是从头实现这些基础功能。
- MDX的强大表现力:能在Markdown中直接使用React组件是一个巨大的优势。这让我可以在保持内容简洁的同时,在需要的地方添加交互式元素。
# 我的文章标题
这是普通的Markdown内容。
<CodeSandbox slug="react-demo" />
继续写Markdown内容...
-
灵活的主题定制机制:Docusaurus的swizzling机制让我可以精确地覆盖和定制任何组件,而不需要fork整个主题。
-
文档与博客的完美结合:我不仅需要写博客文章,还想整理一些技术笔记和教程。Docusaurus的文档+博客双模式正好满足这一需求。
-
活跃的社区和持续维护:由Meta(Facebook)团队维护,更新频繁,文档详尽,这给了我长期使用的信 心。
-
性能优化:内置了很多现代Web性能优化,如代码分割、预加载、PWA支持等。
总的来说,Docusaurus提供了一个平衡的解决方案——足够简单,可以快速上手;又足够灵活,能满足各种定制需求。对于像我这样既想要一个漂亮的博客,又希望能充分发挥前端技术的开发者来说,它是一个理想的选择。
开发环境搭建:从零开始的第一步
好啦,既然决定用Docusaurus了,那就赶紧动手搭建环境吧!说实话,刚开始我也是一头雾水,但实际操作起来比想象中简单多了。
前置准备
首先,得确保电脑上装了这些东西(没装的话赶紧补上):
-
Node.js:v18或更高版本就行(我用的v18.16.0,老版本可能会有奇怪的问题)
-
npm或yarn:我习惯用npm,主要是懒得再装一个yarn😂
-
Git:这个必须有,不然后面部署和版本控制会很头疼
创建项目
Docusaurus的脚手架工具真是太方便了,敲一行命令就搞定,完全不用手动配置那堆烦人的东西:
# 创建项目(classic是模板名称)
npx create-docusaurus@latest my-blog classic
# 进到项目目录
cd my-blog
# 启动开发服务器看看效果
npm start
敲完这几行命令后,浏览器会自动打开http://localhost:3000,然后...哇!一个模板网站就这么出现了!虽然长得有点丑,但基本功能都有了,这就是我喜欢用框架的原因——先跑起来再说,看到成果心里才有底。
不过说实话,这个默认模板离我心目中的博客差得还挺远的,后面得下不少功夫改造它。但至少有个基础,总比从零开始写HTML/CSS强多了,对吧?
项目结构一览
创建好的项目结构大概长这样:
my-blog/
├── blog/ # 博客文章目录(我的文章都扔这里)
├── docs/ # 文档内容目录(不怎么用,但先留着)
├── src/ # 源代码(重头戏在这里)
│ ├── components/ # 自定义React组件(后面会加很多东西)
│ ├── css/ # 样式文件(调整样式的地方)
│ └── pages/ # 自定义页面(首页、关于我之类的)
├── static/ # 静态资源(图片、字体 什么的)
├── docusaurus.config.js # 主配置文件(超级重要!)
├── sidebars.js # 侧边栏配置(文档用的,不太管它)
└── package.json # 项目依赖(装插件的时候会动它)
看起来挺多文件的,但别被吓到!实际上大部分时间只会修改其中几个。我刚开始也是一脸懵,但摸索了一会儿就大概知道该去哪里改东西了。
网站配置:开始搭建我的小窝
Docusaurus最让我惊喜的一点就是配置超级简单!所有重要的设置都集中在一个文件里:docusaurus.config.ts。这对我这种经常忘记"我到底在哪个文件里改过这个设置"的人来说简直是救星。
基础配置
首先得把网站的基本信息改一改,默认的那些placeholder看着就别扭:
const config = {
// 网站标题(浏览器标签上显示的那个)
title: '王起哲的博客',
// 网站URL(部署后的地址,先随便填一个,反正后面会改)
url: 'https://20030727.xyz',
// 基础路径(一般不用动)
baseUrl: '/',
// 网站图标(必须换掉默 认的,太丑了)
favicon: 'img/favicon.ico',
// GitHub用户名(用于部署和评论系统)
organizationName: 'wwwqqqzzz',
// 仓库名(就叫blog好了,简单明了)
projectName: 'blog',
// 自定义字段(这个超好用,可以在任何组件里拿到这些数据)
customFields: {
bio: '技术探索之路', // 个人简介
description: '这是王起哲的个人博客,主要分享编程、游戏开发和Web3技术等领域的知识和项目,该网站基于 React 驱动的静态网站生成器 Docusaurus 构建。',
},
// ...还有一堆配置,先不管它们
}
老实说,刚开始我根本不知道这些配置项都是干嘛用的,就是照着文档和别人的博客抄了一遍,然后慢慢调整。有些字段看起来无关紧要,但后面才发现原来它们会影响SEO和社交媒体分享效果!
导航栏与页脚
接下来,我定制了网站的导航栏和页脚,这是用户与网站交互的重要界面元素:
themeConfig: {
// 导航栏配置
navbar: {
logo: {
alt: '王起哲',
src: 'img/logo.webp',
srcDark: 'img/logo.webp',
},
hideOnScroll: true, // 滚动时隐藏导航栏
items: [
{ label: '博客', position: 'right', to: 'blog' },
{ label: '项目', position: 'right', to: 'project' },
{ label: '友链', position: 'right', to: 'friends' },
{ label: '关于', position: 'right', to: 'about' },
{
label: '更多',
position: 'right',
items: [
{ label: '归档', to: 'blog/archive' },
{ label: '技术笔记', to: 'docs/docusaurus-guides' },
{ label: '私密博客', to: 'private' },
],
},
],
},
// 页脚配置
footer: {
style: 'dark',
links: [
{
title: '技术',
items: [
{ label: '博客', to: 'blog' },
{ label: '归档', to: 'blog/archive' },
{ label: '项目展示', to: 'project' },
],
},
{
title: '社交媒体',
items: [
{ label: '关于我', to: '/about' },
{ label: 'GitHub', href: 'https://github.com/wwwqqqzzz' },
],
},
// ...更多链接
],
copyright: `Copyright © 2024 - ${new Date().getFullYear()} 王起哲 | Built with Docusaurus.`,
},
}
这样配置后,我的网站有了清晰的导航结构,用户可以轻松找到各个部分的内容。
博客模式配置
Docusaurus默认是文档优先的,但我想要一个以博客为主的网站。为此,我做了一些特殊配置:
// 在plugins配置中添加自定义博客插件
plugins: [
[
'./src/plugin/plugin-content-blog', // 自定义博客插件路径
{
path: 'blog',
editUrl: ({ locale, blogDirPath, blogPath, permalink }) =>
`https://github.com/wwwqqqzzz/blog/edit/main/${blogDirPath}/${blogPath}`,
editLocalizedFiles: false,
blogDescription: '代码人生:编织技术与生活的博客之旅',
blogSidebarCount: 10,
blogSidebarTitle: '博文',
postsPerPage: 12, // 每页显示的文章数
showReadingTime: true, // 显示阅读时间
readingTime: ({ content, frontMatter, defaultReadingTime }) =>
defaultReadingTime({ content, options: { wordsPerMinute: 300 } }),
feedOptions: { // RSS订阅配置
type: 'all',
title: '王起哲',
description: '个人博客RSS订阅',
copyright: `Copyright © ${new Date().getFullYear()} 王起哲 Built with Docusaurus.`,
},
},
],
// ...其他插件
]
这里我使用了自定义的博客插件,而不是默认的@docusaurus/plugin-content-blog,这是因为我需要对博客功能进行一些特殊定制,比如将博客数据设置为全局可访问,以便在其他组件中使用。
预设与插件
Docusaurus的强大之处在于它的插件系统。我配置了以下预设和插件:
// 预设配置
presets: [
[
'classic',
{
docs: {
path: 'docs',
sidebarPath: 'sidebars.ts',
},
blog: false, // 禁用默认博客插件,使用自定义插件
theme: {
customCss: ['./src/css/custom.css', './src/css/tweet-theme.css'],
},
sitemap: {
priority: 0.5,
},
gtag: { // Google Analytics配置
trackingID: 'G-S4SD5NXWXF',
anonymizeIP: true,
},
},
],
],
// 插件配置
plugins: [
'docusaurus-plugin-image-zoom', // 图片缩放
'@docusaurus/plugin-ideal-image', // 图片优化
[
'@docusaurus/plugin-pwa', // PWA支持
{
debug: process.env.NODE_ENV === 'development',
offlineModeActivationStrategies: ['appInstalled', 'standalone', 'queryString'],
pwaHead: [
{ tagName: 'link', rel: 'icon', href: '/img/logo.png' },
{ tagName: 'link', rel: 'manifest', href: '/manifest.json' },
{ tagName: 'meta', name: 'theme-color', content: '#12affa' },
],
},
],
[
'vercel-analytics', // Vercel分析
{
debug: process.env.NODE_ENV === 'development',
mode: 'auto',
},
],
// ...其他插件
]
主题定制:让我的博客看起来不那么"模板化"
配置完基本设置后,接下来就是最有趣的部分了——让这个网站看起来像是"我的",而不是千篇一律的Docusaurus默认样式。说实话,默认主题虽然干净,但实在是太...普通了,看起来就像是官方文档。