Builder.io 与 Astro
Builder.io 是一个适用于构建网站的支持拖放内容编辑的可视化 CMS。
这个方案将向你展示如何不需要使用客户端 JavaScript,就能将你的 Builder 空间与 Astro 连接。
在开始之前,你需要准备以下内容:
- 一个 Builder 账号和空间 - 如果你还没有账号,可以免费注册并创建一个新的空间。如果你已经有了一个 Builder 的空间,直接使用即可,但请确保代码中的模型名称(
blogpost)和自定义数据字段与你的设置相匹配。 - 一个 Builder API 密钥 - 你将需要这个密钥来从 Builder 获取内容。查看 Builder 的指南以了解如何获取你的密钥。
为了在 Astro 项目中使用你的 Builder API 密钥和模型名称,请在项目根目录下创建一个 .env 文件(如果尚未存在),并添加如下环境变量:
BUILDER_API_PUBLIC_KEY=YOUR_API_KEYBUILDER_BLOGPOST_MODEL='blogpost'现在,你应该已经可以在你的项目中使用这个 API 密钥了。
在编写本文时,这个密钥是公开的,因此无需担心隐藏或加密它。
如果你希望你的环境变量具有类型智能提示,你可以在 src/ 目录下创建一个 env.d.ts 文件,并按照以下方式配置 ImportMetaEnv:
interface ImportMetaEnv { readonly BUILDER_API_PUBLIC_KEY: string;}你的项目现在应该包括这些文件:
文件夹src/
- env.d.ts
- .env
- astro.config.mjs
- package.json
.env 文件的内容。
使用 Astro 和 Builder 创建博客
Section titled “使用 Astro 和 Builder 创建博客”创建博客文章的模型
Section titled “创建博客文章的模型”接下来,我们将创建一个 Astro 博客,该博客将使用名为 blogpost 的 Builder 模型(类型:“Section”),并包含两个必填的文本字段:title 和 slug。
你可以在 Builder 的官方教程 中找到此过程的视频演示。
在 Builder 应用中,我们将创建一个代表博客文章的模型。请转到 模型(Models) 标签页,点击 + 创建模型(Create Model) 按钮,并按照以下指示填写字段和值:
- 类型: Section
- 名称: “blogpost”
- 描述: “这个模型是用于博客文章的”
在你的新模型中使用 + 新建自定义字段(New Custom Field) 按钮创建 2 个新字段:
-
文本字段
- 名称: “title”
- 必填: 是
- 默认值: “我忘了给它提供标题”
(其他参数保持默认)
-
文本字段
- 名称: “slug”
- 必填: 是
- 默认值: “some-slugs-take-their-time”
(其他参数保持默认)
然后点击右上角的 保存(Save) 按钮。
slug 字段需要注意以下几点:
-
避免使用纯数字作为 slug,这可能会干扰 Builder API 的请求。
-
确保每个 slug 都是唯一的,以保证网站路由的正确性。
为了使用 Builder 的可视化编辑器,我们需要创建一个名为 src/pages/builder-preview.astro 的页面,这个页面将会渲染一个特殊的 <builder-component>:
文件夹src/
文件夹pages/
- builder-preview.astro
- env.d.ts
- .env
- astro.config.mjs
- package.json
然后添加以下内容:
---const builderAPIpublicKey = import.meta.env.BUILDER_API_PUBLIC_KEY;const builderModel = import.meta.env.BUILDER_BLOGPOST_MODEL;---
<html lang="en"> <head> <title>预览 builder.io</title> </head> <body> <header>这里是页头</header>
<builder-component model={builderModel} api-key={builderAPIpublicKey} ></builder-component> <script async src="https://cdn.builder.io/js/webcomponents"></script>
<footer>这里是页脚</footer> </body></html>在上面的例子中,<builder-component> 元素指示 Builder 在页面的哪个位置插入 CMS 内容。
设置新路由作为预览 URL
Section titled “设置新路由作为预览 URL”-
复制完整的预览 URL,要包括协议,复制到你的剪贴板(例如
https://{your host}/builder-preview)。 -
进入你的 Builder 空间的 模型 标签页,选择你创建的模型,并将步骤 1 中的 URL 粘贴到 预览 URL 字段。确保 URL 是完整的,复制要包括协议,例如
https://。 -
点击右上角的 保存(Save) 按钮。
当你的网站部署到生产环境时,记得将预览 URL 更新为与你的正式网站地址相匹配,例如 https://myAwesomeAstroBlog.com/builder-preview。
测试预览 URL 设置
Section titled “测试预览 URL 设置”-
确保你的开发服务器正在运行,且网站在线。同时,确认
/builder-preview路由能够正常工作。 -
在你的 Builder 空间中,找到 内容(Content) 标签页,点击 新建(New) 来创建一个新的
blogpost模型的内容条目。 -
在新打开的 Builder 编辑器中,你应该能看到
builder-preview.astro页面,页面中间有一个显眼的 添加块(Add Block)。
在设置预览时,可能会遇到一些问题。如果出现任何异常,你可以尝试以下步骤:
- 确保网站处于在线状态 - 比如,你的开发服务器正在运行。
- 确保 URL 完全一致 - 你的 Astro 项目中的 URL 应与在 Builder 应用中设置的 URL 完全匹配。
- 确保使用的是完整的 URL,包括协议,如
https://。 - 如果你在像 IDX, StackBlitz 或 Gitpod 这样的虚拟环境中工作,每次重启工作区时可能需要重新复制并粘贴 URL,因为这些环境通常会为你的项目生成一个新的 URL。
了解更多信息,请参阅 Builder 的故障排除指南。
创建博客文章
Section titled “创建博客文章”-
在 Builder 的可视化编辑器中,创建一个新的内容条目,值如下:
- 标题: ‘第一篇文章,哇哦!’
- slug: ‘first-post-woohoo’
-
利用 添加块(Add Block) 功能来丰富你的文章内容,添加所需的文本字段。
-
在编辑器顶部的文本框中为你的内容条目命名,这个名称将用作在 Builder 应用中的显示名称。
-
准备就绪后,点击右上角的 发布(Publish) 按钮。
-
你可以随意创建更多文章,但需要确保每篇文章都有一个
title和一个slug字段,以及相应的文章内容。
显示博客文章列表
Section titled “显示博客文章列表”在 src/pages/index.astro 文件中添加以下代码,以便展示一个包含所有文章标题的列表,其中每个标题都链接到相应的文章页面:
---
const builderAPIpublicKey = import.meta.env.BUILDER_API_PUBLIC_KEY;const builderModel = import.meta.env.BUILDER_BLOGPOST_MODEL;
const { results: posts } = await fetch( `https://cdn.builder.io/api/v3/content/${builderModel}?${new URLSearchParams({ apiKey: builderAPIpublicKey, fields: ["data.slug", "data.title"].join(","), cachebust: "true", }).toString()}`) .then((res) => res.json()) .catch();---
<html lang="en"> <head> <title>博客目录</title> </head> <body> <ul> { posts.flatMap(({ data: { slug, title } }) => ( <li> <a href={`/posts/${slug}`}>{title}</a> </li> )) } </ul> </body></html>