🌏 本站/博客部署+SEO 优化+测试样例,全流程打包教程 cover image

🌏 本站/博客部署+SEO 优化+测试样例,全流程打包教程

我选择 Notion 搭建博客,其实是出于一种平衡:

我希望写作流程尽可能轻便、界面美观、内容管理足够灵活,同时也不想花太多时间在复杂的前端框架上打转。Notion 配合静态生成工具(比如 Astro 或 Super),看起来是一个理想解。

Notion 在写作体验上的流畅感,让我坚持更新比以往任何一次都久;我也逐步建立起自己的知识分类体系,内容架构越来越清晰。这更像是一种“写给未来的准备”,而不是急功近利的内容发布。


术语 白话翻译 类比解释
SSG 静态站点生成 印刷厂:一次性印好所有页面成品
集成方案 接入第三方工具(如Notion) 让印刷厂能使用外部设计的素材

sequenceDiagram
    participant 你的Notion
    participant Astro
    participant 用户
    你的Notion->>Astro: 1. 写作时:在Notion编辑内容
    Astro->>你的Notion: 2. 构建时:一次性拉取全部数据
    Astro->>Astro: 3. 生成静态HTML文件(像拍照定格)
    Astro->>用户: 4. 用户访问时:直接发送HTML文件

关键限制

⚠️ 用户看到的永远是 构建时 的 Notion 内容快照

⚠️ 用户无法在网站上 实时交互(如评论/点赞)

⚠️ Notion 内容更新后需 重新构建部署 才能同步


模式 用户何时看到更新? 技术代价 适用场景
SSG 你重新部署网站之后 低(免费托管可用) 博客/作品集等静态内容
SSR 用户访问时实时生成 高(需服务器常驻) 电商/社交等动态站点
CSR 用户浏览器里动态加载 中(依赖JS性能) 后台管理系统
💡 为什么 Astro 默认用 SSG?

为了 速度与性价比

  • 生成静态文件 → CDN 全球秒开
  • 无需服务器 → 托管在 Vercel/Netlify 永久免费

  • 把 Notion 当 无头CMS(内容管理系统)
  • 自动生成博客/作品集/文档站
  • 享受 极快的加载速度(页面已是成品)
  • 用户在网站留言 → 实时保存回 Notion
  • 显示 Notion 数据库的 实时更新数据
  • 需要登录才能查看的 私有内容

# 用 GitHub Actions 设置每日自动构建
name: Update Notion Content
on:
  schedule:
    - cron: '0 0 * * *'  # 每天UTC 0点执行
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - run: npm run build
      - run: vercel deploy --prod

→ 用户每天看到的是 昨日 Notion 快照

---
// 静态生成主页面
import Counter from '../components/Counter.astro'
---
<!-- 在静态页面嵌入动态评论组件 -->
<Counter client:load />

→ 用 React/Vue 写交互部件,通过 client:load 激活

graph LR
    A[用户点击点赞] --> B(调用 Vercel Edge Function)
    B --> C{更新数据库}
    C --> D[Notion API]
    D --> E[返回结果到前端]

→ 通过 无服务器函数 中转动态操作


  1. 内容分层策略
    • 用 SSG 生成 核心展示页(作品集/博客)
    • 用动态组件实现 轻交互(点赞/订阅按钮)
  2. 更新提示设计
    <!-- 在页面顶部显示提示 -->
    <div class="update-alert">
      内容更新于:<span id="build-time">2024-07-25</span>
      <button onclick="location.reload()">检查更新</button>
    </div>
    
  3. 拥抱 SSG 优势
    → 把网站部署在 Vercel
    → 开启 Incremental Static Regeneration 功能(增量更新)

「Astro集成方案仅支持SSG」=

你的 Notion 网站本质是「自动印刷机」

  • ✅ 高效生产精美手册
  • ❌ 不能变成实时对讲机
  • 🔧 但可通过 外挂设备 实现有限互动

后期可以做的:

  1. 定制 SSG 优化方案(根据你的项目痛点)
  2. 手写动态组件代码(评论/点赞功能)
  3. 设计更新提示 UI(我身为设计师的专属优势) 👨💻
我从哪买域名服务器?

看了很多方案,最终购买地点:阿里云买了.Top 只需要188元10年,对比下来最有性价比

域名注册_域名查询_域名申请_域名购买_域名续费_国际域名-万网-阿里云品牌

AI233 - 个人博客 - Home

还看到另外一个日本的也比较便宜:


Com域名5年到手仅需144!首年免费,续费仅需36元每年
首年免费,之后一年仅需750日元,4年+1年免费的只需3000日元(143元人民币)

服务器:问了后端开发朋友,推荐了Ucloud, 我暂时没买,但可以作为未来升级的备选

没阿里腾讯好用,而且资源镜像不好,要改系统配置,新手不友好

我从哪插入谷歌分析?

Google Analytics | 首页

Vercel—>Setting—>Environment—>Variables

需要配置如下变量:
NEXT_PUBLIC_ANALYTICS_GOOGLE_ID:G-6************7

SEO_GOOGLE_SITE_VERIFICATION:G-6************7

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9669713886681501"
     crossorigin="anonymous"></script>
robots.txt 的设置:
创建并提交 robots.txt 文件 | Google 搜索中心  |  Documentation  |  Google for Developers
我从哪看SEO分析数据?
我从哪看对网站的安全扫描情况?
我怎么给网站测速?
我怎么查看域名解析的情况?

在你本地的命令行(CMD、PowerShell、Terminal、WSL、Mac/Linux 终端)手动运行


dig www.ai233.top +short
  • 作用:查看你的域名解析到哪个 IP(应该是 Vercel 的 IP)。
  • Windows:如果你用的是 Windows CMD 或 PowerShell,默认没有 dig 命令,可以用:
    nslookup www.ai233.top
    
  • Mac/Linux/WSL:直接用 dig

# 使用 Invoke-WebRequest(别名 curl)
Invoke-WebRequest -Uri "https://www.ai233.top" -Method Head

# 或简化版(自动选择方法)
curl -Method Head "https://www.ai233.top"

# 使用系统原生工具,兼容性更好
cmd /c "curl -I https://www.ai233.top"
  • 作用:只请求头部,检查 HTTPS 是否通、返回码是不是 200。
  • Windows:如果你没装 curl,可以用 PowerShell 7+ 自带的 curl,或者用:
  • Mac/Linux/WSL:直接用 curl -I

  • dig/nslookup 应该返回 Vercel 的 IP(如 76.76.21.21)。
  • curl -I 应该看到 HTTP/2 200HTTP/1.1 200 OK

  • 这两句是本地手动测试域名解析和站点可用性的常用命令。
  • 不是 workflow 步骤,也不是 npm 脚本。
  • 你可以随时在本地终端运行,检查你的域名和站点状态。

  1. 符号冲突

    PowerShell 将 <> 视为重定向运算符未来保留字,不能直接包裹 URL。

  2. 命令别名混淆
    • 在 PowerShell 中,curl 实际上是 Invoke-WebRequest 的别名
    • 真正的 curl 需要调用 curl.exe
  3. 参数解析差异

    PowerShell 需要显式命名参数(如 -Uri),而传统终端允许位置参数。


  1. 代理问题

    如果公司网络有代理,需先配置:

    $proxy = New-Object System.Net.WebProxy("<http://proxy.example.com:8080>", $true)
    [System.Net.WebRequest]::DefaultWebProxy = $proxy
    
  2. HTTPS 证书验证

    忽略证书错误(仅测试用):

    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
    
  3. 超时设置
    Invoke-WebRequest -Uri "<https://www.ai233.top>" -TimeoutSec 10
    

工具/语法 适用场景 示例命令
PowerShell 原生 深度处理响应 Invoke-WebRequest -Uri ...
curl.exe 兼容传统 Linux 命令 curl.exe -I "https://..."
.NET 方法 高性能场景 [System.Net.WebRequest]::Create()

# 一键检查 CSP 并输出彩色结果
$response = Invoke-WebRequest -Uri "<https://www.ai233.top>" -Method Head
if ($response.Headers["Content-Security-Policy"]) {
    Write-Host "✅ CSP 已配置: " -ForegroundColor Green
    $response.Headers["Content-Security-Policy"]
} else {
    Write-Host "❌ 缺少 CSP 头" -ForegroundColor Red
}
  • 确保安装Node.js
  • 下载并安装适用于操作系统的 Node.js 和 npm:https://nodejs.org/
  • 确认安装成功,可以通过在终端运行 node -v 和 npm -v 命令来检查版本号。
我不是很推荐安装特别新的版本,因为可能会导致一些不兼容,18.20.8 LTS 是我安装的,TS 是稳定版本的缩写,代表 Long Term Support。Node.js® 的 LTS 版本提供长期的维护和支持,通常包含重要的安全更新和关键修复,但不会引入新的功能。LTS 版本适合需要长期稳定运行的 Node.js 应用程序。

如果换到另一台电脑上工作,需要重新安装Vercel CLI。Vercel CLI是一个全局工具,需要在使用它的每台计算机上单独安装。

从终端输出可以看到,您之前尝试运行vercel --version命令时收到了错误消息,表明Vercel CLI尚未安装。然后您成功运行了npm install -g vercel命令来安装它,安装完成后您能够使用vercel命令进行部署。

  1. 确保新电脑上已安装Node.js和npm
  2. 运行npm install -g vercel命令安装Vercel CLI
  3. 运行vercel login命令登录您的Vercel账户
  4. 然后您就可以使用vercel命令部署您的项目了

安装完成后,您可以使用vercel --version命令验证安装是否成功。如果您想直接部署到生产环境,可以使用vercel --prod命令。

需要注意的是,Vercel CLI的安装是全局的(使用了-g标志),这意味着它会在您的用户目录下安装,而不是在项目目录中。这就是为什么您需要在每台新电脑上重新安装它。

在代码不变的情况下,通过定时部署来拉取 Notion 中的最新内容更新博客。这不是冲突而是必要的补充机制。

感谢Kindly给我的思路,部署notion的一些后台设置

graph LR
    A[Notion 内容更新] --> B{GitHub Actions}
    B -->|定时触发| C[调用 Vercel Hook]
    C --> D[Vercel 重新构建]
    D --> E[拉取最新 Notion 数据]
    E --> F[生成新静态页面]
    
    G[代码更新] --> H[Vercel 自动部署]
    H --> F

到这里我以为设置完了,但其实还没有,需要在vercel项目的设置里,同样创建hook,填入main后点create

可以把 GitHub Secrets 里的 NOTION_API_SECRET、DATABASE_ID、CUSTOM_DOMAIN 等删掉,只保留 DEPLOY_HOOK_URL(除非你有其它 workflow 用到)

👇生成后有个网址,打开后返回内容:

{
  "job": {
    "id": "XXXXXXXXXX",
    "state": "PENDING",
    "createdAt": 1750521279829
  }
}
字段 含义
id 本次部署任务的唯一 ID
state 当前部署状态,PENDING 表示已排队准备部署
createdAt 创建时间(Unix 时间戳)

astro-notion-blog-main/.github/workflows/deploy.yml at main · youxiaohanpian/astro-notion-blog-main

name: Deploy

on:
  schedule:
    - cron: '00 23 * * 1,3,5'  # UTC 每周一、三、五 23:00 → 北京时间每周二、四、六 7:00
  workflow_dispatch:

jobs:
  curl:
    name: Kick deploy hook
    runs-on: ubuntu-latest
    steps:
      - name: curl
        run: |
          curl -X POST \
          -H "Content-Type: application/json" \
          -d '{}' \
          '${{ secrets.DEPLOY_HOOK_URL }}'

name: Notion Content Refresh

on:
  schedule:
    # 每天北京时间7点运行 (UTC 23:00)
    - cron: '00 23 * * *'
  workflow_dispatch:

jobs:
  refresh-content:
    runs-on: ubuntu-latest
    steps:
      - name: Check Secrets
        run: |
          if [ -z "${{ secrets.NOTION_REFRESH_HOOK }}" ]; then
            echo "❌ 错误:未检测到 NOTION_REFRESH_HOOK"
            exit 1
          fi

      - name: Trigger Content Refresh
        run: |
          # 发送部署请求
          curl -X POST "${{ secrets.NOTION_REFRESH_HOOK }}"
          
          echo "✅ 已触发内容刷新部署"
          
      - name: Verify Update
        timeout-minutes: 10
        run: |
          # 等待部署完成
          sleep 300
          
          # 检查最新文章更新时间
          LATEST_UPDATE=$(curl -s "https://api.notion.com/v1/databases/${{ secrets.NOTION_DATABASE_ID }}/query" \
            -H "Authorization: Bearer ${{ secrets.NOTION_API_KEY }}" \
            -H "Notion-Version: 2022-06-28" | jq -r '.results[0].last_edited_time')
          
          echo "最新内容更新时间: $LATEST_UPDATE"

才点击打开这个 URL,就相当于“远程点了一下 Deploy 按钮”,Vercel 会立即开始重新构建并部署你的项目

graph TD
  A[自定义域名] --> B{生效条件}
  B --> C1[DNS 解析正确]
  B --> C2[Vercel 项目已绑定]
  B --> C3[SSL 证书有效]

查看状态:

✅ 如果成功,会变成绿色的 "READY"

❌ 如果失败,会显示红色 "ERROR",可以点击进去看详细日志

创建缓存规则

graph LR
   用户[国内用户] --> Cloudflare[Cloudflare CDN节点]
    Cloudflare --> |① 首次请求| Vercel[Vercel服务器]
    Vercel --> |② 获取| Notion[Notion图片]
    Cloudflare --> |③ 缓存图片| 用户
   用户 --> |④ 后续请求| Cloudflare

你已经有这个 Deploy Hook 网址,以后可以:

  • 在浏览器里打开这个链接就能重新部署
  • Notion 更新后自动调用:可以用 ZapierIFTTT 来实现「当 Notion 新增页面 → 调用这个 Hook」
  • 本地写脚本触发:比如加一个 deploy.sh 脚本自动 POST 请求这个 URL

既包括基础配置,也包括进阶优化。也方便每次发布新文章或优化站点时快速检查 ✅


项目 说明
设置 sitemap.xml ✅ 已经完成了,并自动更新。
提交 sitemap 到 Google Search Console ✅ 已完成
设置 robots.txt 推荐写清楚允许抓取 + 指定 sitemap 地址
设置 meta titlemeta description 每篇文章有独立的标题和描述,提升点击率
使用干净、简洁的 URL(slug) ✅ 比如 /posts/game-design 好于 /12345?id=1
所有页面都能在桌面+移动设备上良好展示 移动端体验很重要,Google 优先抓移动版本
网站加载速度优化(图片压缩、懒加载) 可测试:PageSpeed Insights

项目 说明
设置 Open Graph + Twitter Card 元标签 分享到微信/微博/朋友圈等时显示封面 + 摘要
自定义 404 页面 用一点设计感提示用户“页面不见了”,别冷冰冰
使用语义化标签(如 <article> <header> Astro 模板一般自带语义结构,利于搜索引擎
加入 Google Analytics 或其他统计工具 你可以看到访问数据、用户路径、点击来源等
每篇文章添加 tag 或分类结构 帮助构建主题权重,提升相关性推荐
增加内链(相关内容推荐) 比如“你可能还喜欢”放其他文章链接
每篇文章页有分享按钮 鼓励用户转发(你还可以加上打赏按钮 🍉)
网站有 favicon + manifest 浏览器标签页更专业,也支持添加到手机主屏幕
网站支持 RSS 虽然冷门了,但对少部分读者或自动订阅很重要

项目 说明
每篇文章标题里包含关键词 关键词前置+通俗易懂,帮助搜索引擎识别主题
正文自然包含关键词 不要堆砌关键词,但要有逻辑地融入核心词汇
文章有清晰的结构(小标题、列表) 结构清晰利于用户阅读,也提升搜索评分
文章有首图或封面图 有视觉吸引力,分享时更美观
每篇文章有结尾 Call to Action(CTA) 比如:留言评论、分享给朋友、订阅等

类型 工具 用途
SEO 检查 Ahrefs Webmaster Tools ✅免费查死链、SEO建议
实测确实能看到不少问题
网站测速 PageSpeed Insights 检测网站加载速度问题
标签生成 metatags.io 生成 Meta/OpenGraph 标签并预览
Robots 检查 robots.txt Tester 测试 robots 文件是否正确

确认 .env 里有正确的 NOTION_API_SECRETDATABASE_ID

  • 本地执行:
npm run build
npm run preview
build 生成静态文件,preview 本地起个静态服务器预览

  • 打开首页(通常是 http://localhost:3000 或你的本地预览地址)
  • 确认首页文章列表是否正常显示,文章标题、摘要、封面图加载正常
  • 观察首页是否有明显的样式错乱

  • 首页是否正确显示 Tag 分类列表
  • 点击不同 Tag,确认跳转到对应的 Tag 页面,文章列表正确过滤

  • 在浏览器切换不同屏幕尺寸(桌面、平板、手机)
  • 检查页面布局是否自适应,元素没有重叠或溢出
  • 交互按钮(分享、点赞)在不同尺寸下正常可用

  • 点击任意 Tag,确认页面跳转并显示该 Tag 下文章
  • 如果文章数超过分页限制(比如 10 篇),测试分页按钮是否工作正常,内容正确切换

  • 人为制造一个测试文章,在 Notion 中故意删除或留空 slug
  • 本地 build 时是否报错
  • 访问该文章对应页面时,页面是否正确显示错误或跳转(避免白屏)

  • 首页文章封面图和列表页缩略图是否全部正常加载
  • 文章内容页内嵌的图片是否显示正常,没出现断链

  • 进入任意一篇日志详情页
  • 标题、日期、标签、内容、封面图是否正确展示
  • 交互按钮(分享、点赞)功能是否正常
  • 页脚上一篇/下一篇文章链接是否有效

  • 错误捕获日志:留意终端是否有构建或运行时错误
  • 网络请求:用浏览器开发者工具检查是否有资源请求失败
  • SEO 预览:查看 meta 标签是否正确渲染

  • 用 Chrome DevTools 手动测试响应式
  • 用 Postman 或 curl 测试某些接口(如果有)
  • 将构建好的 dist 部署到临时环境验证线上表现(Vercel Preview 环境)
  • 用 GitHub Action 集成简单的构建和部署自动化

后续考虑写一个简单的测试脚本(比如用 Puppeteer 或 Playwright 自动化浏览器跑一遍核心页面测试),适合后续持续集成用。写自动化测试脚本的基础模板,或者搭建 GitHub Action 自动跑这些测试

💡
欢迎分享文章,或是 来信 与我交流