Release

Nuxt Content v3

Content v3 发布——引入基于 SQL 的存储、集合、预览 API 以提升 Studio 集成体验,以及大量性能改进。
Baptiste Leproux

Baptiste Leproux

@larbish

Ahad Birang

Ahad Birang

@farnabaz

Sébastien Chopin

Sébastien Chopin

@atinux

发布 Nuxt Content 3.0

我们非常激动地宣布 Nuxt Content 3.0.0 的首个稳定版本 ✨

🚀 性能提升

Nuxt Content v3 放弃了基于文件的存储方式,转而采用 SQL 数据库系统。使用数据库代替基于文件的存储可减少查询大规模数据集时的许多 I/O 操作。

全新的数据库系统优化了数据文件的存储和结构方式,确保更佳的性能和可扩展性。此更新完全是幕后进行,不影响您在 Content 中可使用的文件类型(yml、json 和 markdown)。

这一切对用户透明,Nuxt Content 依然支持零配置下的开发模式、服务器托管和静态生成。

此外,现在支持无服务器托管,客户端导航性能也得到提升。

无服务器兼容性

Nuxt Content v2 的一个关键挑战是为了存储所有内容文件导致捆绑包体积过大。这在部署到无服务器或边缘平台如 Netlify、NuxtHub 或 Vercel 时是个问题。

在无服务器环境中,每个用户请求都会触发 Nuxt 服务器的新实例,每次都是从零开始。此“无状态”特性意味着无法在服务器内存中存储数据,亦不能使用基于文件的数据库如 SQLite。因此,我们实现了数据库适配器,可以独立于你的服务器实例持久化数据。

我们会根据你配置中的数据库类型手动切换到对应的服务提供者(如 Vercel / Postgres,NuxtHub / D1……)。

浏览器端的 WASM SQLite

对于客户端导航,模块使用类似的方法。当应用执行第一条内容查询时,会从服务器下载生成的转储文件,并在浏览器内初始化本地 SQLite 数据库。从此之后,所有查询都在本地执行,无需再调用服务器:极大提升了应用响应速度,带来无缝的用户体验。

🗄️ 内容集合

集合是 Nuxt Content 项目中相关内容项的分组。它们帮助更高效地组织和管理大型数据集。

定义集合

你现在可以在 content.config.ts 文件中定义集合,以配置数据库结构、实用类型以及查找、解析和查询内容的方法。

集合模式

模式确保集合内数据的一致性,并提升 TypeScript 的类型推断,以更好地集成 Nuxt Content 工具。

content.config.ts
import { defineCollection, z } from '@nuxt/content'

// 导出集合
export const collections = {
  // 使用 `defineCollection` 工具定义集合
  posts: defineCollection({
    // 指定此集合中的内容类型
    type: 'page',
    // 加载匹配此模式的所有文件
    source: 'blog/**/*.md',
    // 为此集合定义自定义模式
    schema: z.object({
      date: z.date(),
      image: z.object({
        src: z.string(),
        alt: z.string()
      }),
      badge: z.object({
        label: z.string(),
        color: z.string()
      })
    })
  }),
}
在文档中了解更多关于集合的内容。

🔧 简化的 Vue 工具

我们简化了工具,现暴露:

这四个工具允许你在 Vue 页面和组件中高效获取和查询内容:

pages/blog.vue
<script setup lang="ts">
const { data: posts } = await useAsyncData('blog', () => {
  return queryCollection('blog').all()
})
</script>

<template>
  <div>
    <h1>博客</h1>
    <ul>
      <li v-for="post in posts" :key="post.id">
        <NuxtLink :to="post.path">{{ post.title }}</NuxtLink>
      </li>
    </ul>
  </div>
</template>

📦 内置组件

我们更新了组件,只包含必要的部分:

  • ContentRenderer 用于渲染解析后的 Markdown 为 HTML 和 Vue 组件
  • Slot 取代了 ContentSlot,因我们现在支持用指令解包,使你的 Vue 组件能完美兼容 Vue 和 Markdown 中的使用
  • Prose 组件 是为 MDC 语法量身打造的预设计组件,集成了样式以提升外观表现

以下是显示 Markdown 文件内容的示例:

pages/about.vue
<script lang="ts" setup>
const { data: page } = await useAsyncData(() => {
  return queryCollection('content').path('/about').first()
})
</script>

<template>
  <ContentRenderer v-if="page" :value="page" />
  <p v-else>关于页面尚未编写。</p>
</template>

🔷 TypeScript 集成

新的集合系统为所有数据自动提供 TypeScript 类型。每个工具和 API 均基于你的集合定义实现强类型,确保开发过程中的类型安全。

⬆️ 从 V2 迁移

迁移尽可能简便,因此我们编写了 迁移指南。

注意,我们决定移除基于文档的驱动模式,以简化模块使用。

🖼️ Studio 集成

Nuxt Studio 是一个可视化编辑运行中 Nuxt Content 项目的平台。支持 Markdown、YAML 和 JSON 文件,编辑器确保灵活与易用。

预览 API

之前独立的模块 Studio 模块 已升级得更加通用,现直接集成在 Nuxt Content 作为一个 预览 API。

启用 Studio 的预览功能比以往更简单 —— 只需在 Nuxt Content 配置中将 Studio API 设置为你的 Preview API:

nuxt.config.ts
export default defineNuxtConfig({
  content: {
    preview: {
      api: 'https://api.nuxt.studio'
    }
  }
})

这一简化意味着不再需要额外安装模块来支持 Studio,设置更快更简便。此外,预览 API 现已泛化,支持其他服务提供提供顶级的编辑体验。

统一文档

除了集成,我们还将 Content 和 Studio 的文档与网站统一成一个全面的资源。仅 Studio 平台(用户登录后可用)保持为一个独立站点。

我们现在可以在 Studio 中利用数据结构和集合。Studio 平台支持并适配 集合 和 用户自定义模式。此改进将支持针对 YAML 和 JSON 文件及 Markdown 文件中的 front-matter 自动生成表单。