Release

Nuxt Content v3

内容版本3发布——引入基于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 中可使用的文件类型(ymljsonmarkdown)。

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

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

无服务器兼容性

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

在无服务器环境中,每个用户请求都会触发 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 项目的平台。支持 MarkdownYAMLJSON 文件,编辑器确保灵活与易用。

预览 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 现已泛化,支持其他服务提供提供顶级的编辑体验。

统一文档

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

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

Start with Studio today

gradient cta