<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>azlove2112</title><description>这是执笔绘倾城的第一个博客</description><link>https://my-blog-xi-gilt.vercel.app/</link><language>zh_CN</language><item><title>从 Fuwari 到 Vercel：小白搭建个人博客完整记录</title><link>https://my-blog-xi-gilt.vercel.app/posts/my-blog/</link><guid isPermaLink="true">https://my-blog-xi-gilt.vercel.app/posts/my-blog/</guid><description>从创建仓库、克隆项目、本地调试，到使用 Git 分支发布并验证 Vercel 自动部署，一步一步完成自己的 Fuwari 博客。</description><pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇文章记录我第一次把 Fuwari 改成自己的博客并发布到互联网的全过程。它不是一张只有命令的速查表：每一步都会说明在哪里执行、为什么要做，以及替代方法的优缺点。&lt;/p&gt;
&lt;p&gt;最终网站地址是：&lt;a href=&quot;https://my-blog-xi-gilt.vercel.app/&quot;&gt;https://my-blog-xi-gilt.vercel.app/&lt;/a&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!important]
本文使用 Windows PowerShell。项目根目录是 &lt;code&gt;D:\AAA_Ai-Code\project-005-WebBlog\my-blog&lt;/code&gt;。除非特别说明，所有 &lt;code&gt;git&lt;/code&gt;、&lt;code&gt;pnpm&lt;/code&gt; 命令都在这里执行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;先弄清楚整个流程&lt;/h2&gt;
&lt;p&gt;Fuwari 是一个基于 Astro 的静态博客模板。我们写 Markdown，Astro 把它构建成网页，GitHub 保存源文件，Vercel 读取 GitHub 的 &lt;code&gt;main&lt;/code&gt; 分支并自动发布。&lt;/p&gt;
&lt;p&gt;完整链路是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;在本地修改文件
→ 本地开发服务器预览
→ 检查并生产构建
→ Git 工作分支提交
→ 合并进 main
→ 推送 main 到 GitHub
→ Vercel 自动构建
→ 打开正式网址验证
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中最容易混淆的一点是：&lt;strong&gt;保存本地文件并不会更新网站，commit 也不会。只有 GitHub 上与 Vercel 连接的生产分支更新后，Vercel 才能收到新版本。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;一、准备工具&lt;/h2&gt;
&lt;p&gt;需要安装：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git：保存版本并连接 GitHub；&lt;/li&gt;
&lt;li&gt;Node.js 22 LTS：运行 Astro；&lt;/li&gt;
&lt;li&gt;pnpm 9：安装依赖和执行项目命令；&lt;/li&gt;
&lt;li&gt;VS Code：编辑代码和 Markdown。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装后新开 PowerShell，逐行执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git --version
node --version
pnpm --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每条命令都应该输出版本号。若提示“不是内部或外部命令”，先关闭并重开终端，让新的环境变量生效。&lt;/p&gt;
&lt;h2&gt;二、从模板创建自己的 GitHub 仓库&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari 仓库&lt;/a&gt;；&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Use this template → Create a new repository&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;Owner 选自己的 GitHub 账号；&lt;/li&gt;
&lt;li&gt;Repository name 填 &lt;code&gt;my-blog&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;创建仓库。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;推荐使用模板，而不是直接 Fork。模板会生成一个更像“自己的新项目”的仓库；Fork 更适合持续向原项目贡献代码，但会保留明显的上下游关系。&lt;/p&gt;
&lt;h2&gt;三、明确目录和克隆位置&lt;/h2&gt;
&lt;p&gt;外层收纳目录是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;D:\AAA_Ai-Code\project-005-WebBlog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它可以通过 PowerShell 创建，也可以在资源管理器中手动创建，两种结果完全一样。PowerShell 做法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-Item -ItemType Directory -Force D:\AAA_Ai-Code\project-005-WebBlog
Set-Location D:\AAA_Ai-Code\project-005-WebBlog
Get-Location
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这三行分别是创建目录、进入目录、确认当前目录。接着克隆：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/azlove2021/my-blog.git
Set-Location .\my-blog
git rev-parse --show-toplevel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git clone&lt;/code&gt; 会在&lt;strong&gt;当前目录&lt;/strong&gt;自动新建 &lt;code&gt;my-blog&lt;/code&gt;，因此最终项目地址是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;D:\AAA_Ai-Code\project-005-WebBlog\my-blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Set-Location .\my-blog&lt;/code&gt; 必须在克隆成功后执行；它表示进入刚创建的子目录。以后每次新开终端，也先执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-Location D:\AAA_Ai-Code\project-005-WebBlog\my-blog
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;克隆时出现 Connection reset 或 443 超时&lt;/h3&gt;
&lt;p&gt;我遇到过：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Recv failure: Connection was reset
Failed to connect to github.com port 443
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这表示 Git 到 GitHub 的 HTTPS 网络连接失败，不是仓库目录写错，也通常不是权限错误。浏览器能打开 GitHub，不代表 Git 一定使用了浏览器代理。&lt;/p&gt;
&lt;p&gt;如果本机代理实际监听 &lt;code&gt;127.0.0.1:7897&lt;/code&gt;，可以只为 GitHub 配置 Git 代理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global http.https://github.com.proxy http://127.0.0.1:7897
git config --global --get http.https://github.com.proxy
git ls-remote https://github.com/azlove2021/my-blog.git HEAD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后一条能返回 commit 哈希后，再重新克隆。端口必须以代理软件实际显示为准，不能盲抄 &lt;code&gt;7897&lt;/code&gt;。若以后不用代理，删除配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global --unset http.https://github.com.proxy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;全局配置的优点是以后克隆其他 GitHub 仓库也能复用；缺点是代理软件没启动时 GitHub 访问也会失败。只配置单个仓库影响更小，但新仓库仍需重复设置。&lt;/p&gt;
&lt;h2&gt;四、安装依赖并本地运行&lt;/h2&gt;
&lt;p&gt;确认提示符位于项目根目录，然后执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm install --frozen-lockfile
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器打开终端显示的地址，通常是 &lt;code&gt;http://localhost:4321/&lt;/code&gt;。&lt;code&gt;pnpm dev&lt;/code&gt; 会持续运行；结束时按 &lt;code&gt;Ctrl + C&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;为什么用 &lt;code&gt;--frozen-lockfile&lt;/code&gt;：它严格按照仓库中的 &lt;code&gt;pnpm-lock.yaml&lt;/code&gt; 安装，避免第一次安装就擅自升级依赖。普通 &lt;code&gt;pnpm install&lt;/code&gt; 更灵活，但可能改写锁文件。&lt;/p&gt;
&lt;h2&gt;五、创建工作分支&lt;/h2&gt;
&lt;p&gt;先同步正式分支，再创建一条独立修改线：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git switch main
git pull --ff-only
git status
git switch -c feature/setup-my-blog
git branch --show-current
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后应该输出 &lt;code&gt;feature/setup-my-blog&lt;/code&gt;。分支名可以换成描述本次任务的英文短语。&lt;/p&gt;
&lt;p&gt;分支的优点是修改失败时不立刻污染正式版本，也便于在 GitHub 查看差异；直接改 &lt;code&gt;main&lt;/code&gt; 少几步，但每次推送都可能马上触发生产部署。&lt;/p&gt;
&lt;h2&gt;六、修改博客配置&lt;/h2&gt;
&lt;p&gt;主要配置在 &lt;code&gt;src/config.ts&lt;/code&gt;。修改标题、副标题、导航、头像等信息时，先保持字段结构不变，只改字符串值。&lt;/p&gt;
&lt;p&gt;本项目的语言代码应使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lang: &quot;zh_CN&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不要写成 &lt;code&gt;zh-CN&lt;/code&gt;。两者看起来接近，但 Fuwari 的类型定义使用下划线版本，写错会让 &lt;code&gt;pnpm check&lt;/code&gt; 报错。&lt;/p&gt;
&lt;p&gt;部署地址在 &lt;code&gt;astro.config.mjs&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;site: &quot;https://my-blog-xi-gilt.vercel.app/&quot;,
base: &quot;/&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vercel 站点部署在域名根目录，因此 &lt;code&gt;base&lt;/code&gt; 保持 &lt;code&gt;/&lt;/code&gt;。如果改用 GitHub Pages 的项目仓库地址，&lt;code&gt;base&lt;/code&gt; 往往要改成 &lt;code&gt;/my-blog/&lt;/code&gt;，不能直接照搬。&lt;/p&gt;
&lt;h2&gt;七、写文章与封面&lt;/h2&gt;
&lt;p&gt;推荐一篇文章一个文件夹：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/my-blog/
├── index.md
└── cover.jpeg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;index.md&lt;/code&gt; 的开头称为 Frontmatter：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 从 Fuwari 到 Vercel：小白搭建个人博客完整记录
published: 2026-06-21
description: 一步一步搭建并发布自己的 Fuwari 博客。
image: &quot;./cover.jpeg&quot;
tags: [Fuwari, Astro, GitHub, Vercel]
category: 建站教程
draft: false
lang: &quot;zh_CN&quot;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;封面与 &lt;code&gt;index.md&lt;/code&gt; 相邻，所以写 &lt;code&gt;./cover.jpeg&lt;/code&gt;。文件名大小写必须一致；Windows 本地可能不敏感，Linux 构建环境通常敏感。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;draft: true&lt;/code&gt; 表示草稿，生产构建不会发布；准备上线时改为 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;八、把演示文章隐藏但保留下来&lt;/h2&gt;
&lt;p&gt;不要把演示文章移入 &lt;code&gt;src/content/posts/temp&lt;/code&gt;，因为它仍位于 Astro 的内容目录，可能继续被扫描。&lt;/p&gt;
&lt;p&gt;推荐在项目根目录保存：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;temp/posts/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-Item -ItemType Directory -Force .\temp\posts
Move-Item .\src\content\posts\markdown.md .\temp\posts\
Move-Item .\src\content\posts\guide .\temp\posts\
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文章文件夹要整体移动，避免正文与图片分离。恢复时反向执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Move-Item .\temp\posts\markdown.md .\src\content\posts\
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种方式比永久删除更适合第一次建站：页面干净了，示例写法仍能从 &lt;code&gt;temp/posts&lt;/code&gt; 找回，而且 Git 会保存这些文件。&lt;/p&gt;
&lt;h2&gt;九、本地调试和上线前门禁&lt;/h2&gt;
&lt;p&gt;边写边看：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;准备发布时按 &lt;code&gt;Ctrl + C&lt;/code&gt; 停止开发服务器，然后依次执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm check
pnpm type-check
pnpm build
pnpm preview
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;四者职责不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;check&lt;/code&gt;：检查 Astro、Svelte 与内容类型；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type-check&lt;/code&gt;：检查 TypeScript；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;build&lt;/code&gt;：真正生成生产网站，是最重要的上线门槛；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preview&lt;/code&gt;：用生产构建结果启动本地网站，发现只在构建后出现的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不能只看首页能打开，还要检查文章页、封面、导航、深色模式、手机宽度和外链。&lt;code&gt;dev&lt;/code&gt; 正常不等于生产构建一定正常。&lt;/p&gt;
&lt;h2&gt;十、检查、提交和合并&lt;/h2&gt;
&lt;p&gt;先看改了什么：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git status
git diff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认没有密码、API Key、&lt;code&gt;.env&lt;/code&gt;、私人照片或不认识的文件，再提交：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add .
git status
git diff --cached
git commit -m &quot;Publish Fuwari setup tutorial&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git add&lt;/code&gt; 是选择下一次快照，&lt;code&gt;git commit&lt;/code&gt; 是在本地制作版本快照。两者都没有把文件发到 GitHub。&lt;/p&gt;
&lt;h3&gt;方法 A：GitHub Pull Request（推荐小白）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git push -u origin feature/setup-my-blog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 GitHub 点击 &lt;strong&gt;Compare &amp;amp; pull request&lt;/strong&gt;，查看 Files changed，确认后合并进 &lt;code&gt;main&lt;/code&gt;。最后同步本地：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git switch main
git pull --ff-only
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PR 多几步，但 GitHub 会把所有变化集中展示，最容易发现误提交。&lt;/p&gt;
&lt;h3&gt;方法 B：在本地合并&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git switch main
git pull --ff-only
git merge --no-ff feature/setup-my-blog
git push origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前三条只改变本机；最后一条才更新 GitHub 的 &lt;code&gt;main&lt;/code&gt;。本地合并更快，适合个人项目，但少了一次网页上的可视化复核。&lt;/p&gt;
&lt;h2&gt;十一、Vercel 自动部署到底怎样工作&lt;/h2&gt;
&lt;p&gt;第一次部署：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 GitHub 登录 Vercel；&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Add New → Project&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;导入 &lt;code&gt;azlove2021/my-blog&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;Framework Preset 选择或自动识别 Astro；&lt;/li&gt;
&lt;li&gt;Production Branch 设为 &lt;code&gt;main&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;点击 Deploy。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;仓库连接完成后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;推送工作分支通常生成 Preview Deployment；&lt;/li&gt;
&lt;li&gt;PR 合并到 &lt;code&gt;main&lt;/code&gt;，或执行 &lt;code&gt;git push origin main&lt;/code&gt;，会触发 Production Deployment；&lt;/li&gt;
&lt;li&gt;Vercel 状态为 &lt;strong&gt;Building&lt;/strong&gt; 时继续等待；&lt;/li&gt;
&lt;li&gt;状态为 &lt;strong&gt;Ready&lt;/strong&gt; 后，正式网址才应该出现新内容；&lt;/li&gt;
&lt;li&gt;状态为 &lt;strong&gt;Error&lt;/strong&gt; 时查看构建日志，修复后重新提交，不要只反复点 Redeploy。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上线验证不能只检查 HTTP 200，因为旧版本也会返回 200。应打开新文章地址，确认能看到这篇文章的独特标题，同时确认演示文章已经不再显示。&lt;/p&gt;
&lt;h2&gt;十二、以后每次发文章的固定流程&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Set-Location D:\AAA_Ai-Code\project-005-WebBlog\my-blog
git switch main
git pull --ff-only
git switch -c post-new-article
pnpm new-post new-article
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写完后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm check
pnpm type-check
pnpm build
git status
git diff
git add .
git diff --cached
git commit -m &quot;Add article: 文章标题&quot;
git push -u origin post-new-article
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 GitHub 合并 PR，再执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git switch main
git pull --ff-only
git branch -d post-new-article
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只有确认合并完成后才删除本地工作分支。普通写文章没有修改依赖，不必每次运行 &lt;code&gt;pnpm install&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;十三、上线出错如何回滚&lt;/h2&gt;
&lt;p&gt;先查看最近提交：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git log --oneline -5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果错误提交已经推送到 GitHub，优先创建一个撤销提交：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git revert &amp;lt;需要撤销的提交哈希&amp;gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git revert&lt;/code&gt; 会保留完整历史，Vercel 也会根据新的 &lt;code&gt;main&lt;/code&gt; 自动重新部署。不要把 &lt;code&gt;git reset --hard&lt;/code&gt; 当作线上回滚按钮，它可能直接丢弃本地修改并改写历史。&lt;/p&gt;
&lt;h2&gt;最后的完成标准&lt;/h2&gt;
&lt;p&gt;一次发布只有同时满足以下条件才算完成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pnpm check&lt;/code&gt;、&lt;code&gt;pnpm type-check&lt;/code&gt;、&lt;code&gt;pnpm build&lt;/code&gt; 全部成功；&lt;/li&gt;
&lt;li&gt;GitHub 的 &lt;code&gt;main&lt;/code&gt; 包含目标 commit；&lt;/li&gt;
&lt;li&gt;Vercel 对应部署状态是 &lt;strong&gt;Ready&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;正式首页和新文章地址可以打开；&lt;/li&gt;
&lt;li&gt;新标题和封面真实出现；&lt;/li&gt;
&lt;li&gt;被移走的演示文章不再显示。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当这条链路第一次完整跑通，以后发文章就不再是一场玄学仪式，而是一套可以重复、可以检查、也可以回退的小流程。&lt;/p&gt;
</content:encoded></item></channel></rss>