提问背景 Question:
哪链接就用 /baike/article/1024 类似这样的方案。接下来,讨论一下,模板中内容的展示用fetch的api去读取呢,还是直接用go模板展示。api呢就是方便,直接获取内容,但是seo就完了,因为页面中没有显示标题和链接。用go模板的方法去替换,就是死板些,循环读取内容程序写在go的渲染程序中。你有什么好的方案
Go模板与Fetch渲染抉择:AI百科SEO最佳实践
对于一个以内容价值为主、需要依靠搜索引擎带来流量的“AI百科”系统来说,强烈建议使用 Go 模板(服务端渲染/SSR)作为核心内容的渲染方案。
以下是深度对比分析以及为您推荐的“黄金折中”方案:
一、 核心抉择:SEO 决定技术走向
| 维度 | Go 模板 (服务端渲染 - SSR) | Fetch API (客户端渲染 - CSR) |
| :--- | :--- | :--- |
| SEO 友好度 | 极高。爬虫抓取时,HTML 源码中已包含完整的标题、内容和内链。 | 极差。初始 HTML 几乎是空的,依赖 JS 异步加载。国内爬虫(如百度、360)对 JS 渲染支持很弱。 |
| 首屏加载时间 | 极快。用户拿到 HTML 后直接展示,不需要二次请求 API。 | 较慢。需要先加载页面骨架,再通过网络发起 API 请求,有明显的“白屏”或加载动画。 |
| 开发复杂度 | 稍微传统、死板,每次改动需要重绘页面。 | 灵活,前后端彻底分离,适合高交互的应用。 |
由于您的核心目的是**“将有价值的内容展示出来,并利用这些内容做流量引流”**,SEO 是生死线。如果使用 Fetch 异步读取,搜索引擎抓取到的将是一个“空壳”页面,您精心积累的 AI 百科内容将无法在百度、谷歌中获得排名。
二、 完美的混合解决方案:Go 模板渲染主体 + Fetch 增强交互
我们不必非黑即白。最佳的工业界实践是:用 Go 模板渲染搜索引擎关心的静态内容,用 Fetch API 渲染用户交互和实时数据。
1. Go 模板直接渲染(保 SEO 与首屏):
- 页面 Title、Keywords、Description:必须在服务器端动态生成。
- 文章主体内容 (Content):由 Go 解析 Markdown 并直接输出到 HTML 中。
- 标签云 (Tags) 与面包屑导航:直接在模板中通过
{{range .Tags}}渲染成超链接,方便爬虫顺着链接抓取其他页面。
2. Fetch API 异步处理(保交互与体验):
- 点赞/收藏 (Like Count):用户点击“点赞”时,通过 Fetch 异步提交给 Go 后端 API,局部更新数字,无需刷新页面。
- 浏览量统计 (Click Count):页面加载完成后,Fetch 自动向后端发送一个
POST /api/article/view/:id请求,悄悄将阅读数 +1。 - 相关推荐/侧边栏:如果这些内容不影响核心 SEO,可以通过 Fetch 在页面加载完毕后延迟加载,减轻主页面的数据库查询负担。
三、 Go 模板实战结构示例
在 Go 后端,您可以将布局文件(Layout)和具体页面解耦,写起来一点也不死板:
<!-- templates/article.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{{.Article.Title}} - AI百科 - bbsgood.com</title>
<meta name="description" content="{{.Article.Description}}">
</head>
<body>
<article>
<h1>{{.Article.Title}}</h1>
<div class="tags">
{{range .Tags}}
<a href="/baike/tag/{{.ID}}">{{.Name}}</a>
{{end}}
</div>
<div class="content">
{{.Article.Content | safeHTML}} <!-- 渲染解析后的Markdown HTML -->
</div>
</article>
<script>
// 使用 Fetch 悄悄增加阅读数,并不影响 SEO 抓取
fetch('/api/article/click/{{.Article.ID}}', {method: 'POST'});
</script>
</body>
</html>
这种“主干 SSR,枝叶 CSR”的方案,既保证了 /baike/article/1024 拥有完美的 SEO 表现,又让页面具备了现代网页的高效交互能力。