1. 什么是CSR,SPA?
CSR = 客户端渲染,也就是将各种js所绘制的html在用户设备上进行渲染
SPA = 单页应用
2. 部署的工具
- vercel api
- vercel本身
由于CSR+SPA本身的限制,通过前端js修改meta是明显不现实的。Meta 主要用于被搜索引擎和社交媒体读取,从而生成分享卡片。
在 SPA 架构中,虽然我们可以用 document.title = item.name 来改变浏览器标签页的文字,但社交媒体爬虫(Discord, QQ, Twitter) 是不会运行 JavaScript 的,它们只会请求一次 HTML,并在几百毫秒内读取 <meta> 后直接结束。
它们眼中的页面永远是 index.html 里的那几行死代码。如果直接分享 archive.html?sub-xxx,卡片永远只会显示“OpenST 档案馆”这个统一的标题。
一般情况下,这种用SSR是最轻松的方式,但是OpenST并不是SSR,而是纯正的CSR,我们无法在爬虫请求 HTML 之前完成 meta 的动态注入。对于已有的纯 CSR 项目,引入 SSG / ISR 往往意味着:
- 需要改造路由结构
- 需要构建流程参与数据生成
- 甚至需要迁移到框架(如 Next.js)
因此在实际项目中,成本接近于重构。
那问题很明显:如何在CSR+SPA的情况下做到动态meta?
以下操作基于vercel,如果你的站点部署于其他pages,操作也应该大同小异。如果站点部署于本地/其他服务器则仅供参考
2.1 构建后端
假设database.json是这样的格式
{
"id": "Tom自出盒细雪展示",
"name": "【1.17+】Tom 自出盒细雪展示",
"author": "Unknown",
"tags": [
"自出盒展示",
"细雪展示",
"1.17+"
],
"description": "### 🚀 机器概览n- 核心功能: 一个使用 CUD 实现自出盒的潜影盒展示,其自出盒逻辑具备一定参考价值。\n- 适用版本: Java blahblahblah",
"preview": "archive/Tom自出盒细雪展示/preview.webp",
"filename": "Tom自出盒细雪展示.litematic",
"sub_id": "sub-1772643835289"
}
在项目根目录下,创建api文件夹,构建后端 API (/api/share.js)![]()
js的名称随你定,逻辑如下
// 核心逻辑简述
const item = database.find(i => i.sub_id === queryId);
const html = `
<head>
<meta property="og:title" content="${item.name}">
<meta property="og:image" content="${item.preview}">
</head>
<body>
<script>location.replace("/archive.html?${item.id}");</script>
</body>`;
上面的逻辑是:爬虫默认无法检测js,所以如果有真人访问会立刻跳转到档案馆内部,而爬虫则是只拿到了meta,不会跳转。
然后在前端将链接复制改成指向api
const shareLink = `https://openstmc.com/api/share?${item.sub_id}`;
结语
通过这套 “诱饵 + 转发” 的逻辑,我们达成了以下功能:
- 不需要搭建复杂的 SSR环境。
- 用户点开卡片,API 瞬间跳转回 SPA,自动打开对应详情弹窗。
- 这种方式可以看作是一种最小化 SSR:
仅在服务端生成 meta,而页面本身仍然完全由 CSR 驱动。
如果你对MC存储技术感兴趣,欢迎来到OpenST!QQ群号:440138916,官网:https://openstmc.com