这是我们《Astro 的未来》系列文章的第二部分,涵盖了我们为 Astro Web 框架在 2024 年计划的三项重大改进。本文介绍了 Astro 更强大的内容层(Content Layer):一种处理本地和远程内容源的新方式。
在 Astro 2.0 中,我们发布了最初的“内容集合 API”(Content Collections API)。内容集合的设计灵感源于我们自己在现代 Web 框架(包括当时的 Astro)中,难以扩展大型 Markdown 项目的经验和遇到的挫折。我们的目标是让在 Astro 中处理本地内容(Markdown、MDX 等)比在任何其他 Web 框架中都更容易。
内容集合为 Astro 带来了内置的内容管理功能,例如内容模式(content schemas)、前置元数据验证(frontmatter validation)和完全支持 TypeScript 的查询 API(query API)。
import { getCollection, getEntry } from 'astro:content';
// Get all entries from a collection.// Requires the name of the collection as an argument.// Example: retrieve `src/content/blog/**`const allBlogPosts = await getCollection('blog');
// Get a single entry from a collection via the request URL.// Requires the name of the collection and an entry ID slug.// Example: retrieve `src/content/blog/future-of-astro-content-layer.mdx`const blogPostEntry = await getEntry('blog', Astro.params.slug);
内容是 Astro 中的基本要素。但是,无论您的内容存储在哪里,使用 Astro 构建内容驱动的网站都应该轻松简单。我们已经解决了本地 Markdown 的问题,那么对于内容存储在仓库外部、远程 API 或您喜欢的 CMS(内容管理系统)中的大型项目,又该如何处理呢?
我们正在开始探索一种为 Astro 设计的全新、更强大的内容层(Content Layer)API。 新的内容层将基于我们现有的内容集合功能,让您在 Astro 中处理内容变得前所未有的轻松。让我们深入了解它的工作原理。
更强大的内容引擎
内容集合当前的一个限制是,我们的数据结构完全存储在内存中。这对于静态网站来说足够好用,但在无服务器 SSR(服务器端渲染)环境中,将所有数据加载到内存中可能会严重影响冷启动时间。
我们目前正在探索将 LibSQL(SQLite)作为 Astro 中内容的新底层存储机制。通过在 Astro 内部嵌入 SQLite,我们可以在一个项目中轻而易举地扩展到数百万个内容条目。此外,SQLite 的文件存储通过允许我们在多次构建中缓存内容,将显著提升开发和构建性能。
对于开发者而言,直接访问 SQL 数据库也将为有需要的人提供更强大的查询 API。我们特意将自己的 getCollection
和 getEntry
API 设计得非常简单,这些 API 不会消失。然而,这总是将过滤和排序的责任留给了用户。一个内部 SQL 数据库将帮助我们弥补这一空白,并为任何有需要的人提供更高级的内置查询功能。
更灵活的内容源
将内容从当前的 src/content
目录中分离出来,需要我们重新思考如何在 Astro 中定义集合。我们正在探索为 defineCollection()
API 提供一种新的、更灵活的数据加载器,而不是像目前 Astro 中内置的硬编码文件系统加载器那样。
defineCollection({ name: 'my-portfolio', data: (db: DB, watcher: FileSystemWatcher) => { // 1. fetch your data // 2. insert it into the database // 3. optional: handle content updates during development // (a file change, CMS websocket notification) },})
通过这个新的 API,您可以
- 从文件系统读取文件(就像我们今天所做的那样)
- 提供一个简单的硬编码内联数据数组
- 使用
fetch()
从远程 API 加载数据 - 从 Storyblok 等外部 CMS 加载内容
这也将使更广泛的 Astro 开发者生态系统实现可组合性。任何人都可以将加载器发布到 npm。作为一名 Astro 开发者,这意味着您将能够利用一个充满可插拔和可重用内容加载器的社区生态系统。
// Example: An (imagined) Instagram profile loader for Astroimport instagram from 'some-instagram-astro-content-loader';
defineCollection({ name: 'my-portfolio', data: instagram({ /* ... */ }),})
我们将与新的内容层 API 同时探索这种可插拔的生态系统方案。我们很高兴能为 Astro 用户提供一些能够开启可组合内容全新可能性的功能,同时不牺牲您所熟悉和喜爱的当前内置 Markdown 支持的易用性。
后续步骤
请留意今年晚些时候 Astro 将推出的实验性支持。我们经常在功能稳定之前通过实验性标志发布新功能,这为我们的开发者社区提供了充足的时间来试用新的 API 并留下反馈。
要了解更多关于内容层提案并提供早期反馈,您可以访问我们开放路线图仓库中的持续讨论。在开始官方实现工作时,我们将继续在那里和我们的 Discord 中发布更新。