Back to Blog

从零学 Nuxt 全栈(6):NuxtHub 与 Cloudflare - Serverless 全栈部署

Archive

系列终篇。介绍 NuxtHub 如何无缝对接 Cloudflare:R2 对象存储、Workers AI、一键部署。回顾整个系列,为你的前端学习之旅划上句号。

Published on 12/16/2025

恭喜你来到系列的最后一篇!

经过前面六篇的学习,你已经掌握了:

  • 前端基础 (HTML/CSS/JS/Node.js)
  • Vue 3 (响应式/组件/通信)
  • Nuxt (SSR/路由/Server API)
  • 数据获取与状态管理

现在,让我们来看看 Atidraw 最后的秘密武器:NuxtHub

什么是 NuxtHub?

NuxtHub 是 Nuxt 团队推出的一站式全栈平台,让你可以零配置使用 Cloudflare 的各种服务:

NuxtHub 模块Cloudflare 服务用途
hub:blobR2对象存储 (图片、文件)
hub:databaseD1SQLite 数据库
hub:kvKV键值存储 (缓存)
hubAI()Workers AIAI 模型调用

类比 Spring Cloud

就像 Spring Cloud 帮你对接 AWS/GCP 的各种服务,NuxtHub 帮你无缝对接 Cloudflare。

区别在于:NuxtHub 本地开发时会模拟这些服务,你不需要真的配置 Cloudflare 账号就能开发测试。

hub:blob - 对象存储

在 Atidraw 中,用户上传的画作存储在 Cloudflare R2(兼容 S3 的对象存储)。

启用

nuxt.config.ts 中:

export default defineNuxtConfig({
  hub: {
    blob: true,  // 就这一行!
  },
})

使用

// server/api/upload.post.ts
import { blob, ensureBlob } from 'hub:blob'

// 上传文件
await blob.put('drawings/image.jpg', fileBuffer, {
  contentType: 'image/jpeg',
  customMetadata: {
    userId: '123',
    userName: 'Louis',
  },
})

// 列出文件
const { blobs } = await blob.list({
  prefix: 'drawings/',
  limit: 20,
})

// 读取文件信息
const info = await blob.head('drawings/image.jpg')

// 删除文件
await blob.del('drawings/image.jpg')

类比 Spring + S3

NuxtHubAWS S3 SDK
blob.put(key, data)s3Client.putObject(...)
blob.list({ prefix })s3Client.listObjectsV2(...)
blob.head(key)s3Client.headObject(...)
blob.del(key)s3Client.deleteObject(...)

区别是:NuxtHub 不需要配置 Access Key,本地开发自动使用内存/文件模拟,部署到 Cloudflare 后自动使用真正的 R2。

hubAI - 调用 AI 模型

Atidraw 的另一个亮点是使用 AI 生成”升华”画作。NuxtHub 集成了 Cloudflare Workers AI。

使用

// server/api/upload.post.ts
import { generateText } from 'ai'

// 1. 用 Vision 模型描述画作
const { text } = await generateText({
  model: hubAI('openai/gpt-5-nano'),
  prompt: [{
    role: 'user',
    content: 'Describe this drawing in one sentence.',
  }, {
    role: 'user',
    content: [{ type: 'image', image: drawingArrayBuffer }],
  }],
})

// 2. 用图像生成模型增强画作
const result = await generateText({
  model: hubAI('google/gemini-3-pro-image'),
  providerOptions: {
    google: { responseModalities: ['TEXT', 'IMAGE'] },
  },
  messages: [{
    role: 'user',
    content: [
      { type: 'text', text: 'Generate a more detailed and beautiful drawing...' },
      { type: 'image', image: drawingArrayBuffer },
    ],
  }],
})

const generatedImage = result.files[0]  // 获取生成的图片

hubAI() 是 NuxtHub 封装的 AI 模型工厂,自动处理 Cloudflare Workers AI 的认证和调用。

可用模型

Cloudflare Workers AI 提供了丰富的模型:

类型示例模型
文本生成meta/llama-3.1-8b-instruct
视觉识别openai/gpt-5-nano
图像生成stability/stable-diffusion-xl, google/gemini-3-pro-image
语音识别openai/whisper

部署到 Cloudflare

传统部署流程:

  1. 配置服务器 / 容器
  2. 设置环境变量
  3. 配置数据库连接
  4. 配置对象存储 Access Key

NuxtHub 部署流程:

  1. npx nuxthub deploy
  2. 没了

本地预览生产环境

bun run build    # 构建
bun run preview  # 本地预览生产版本

部署

npx nuxthub deploy

首次部署会引导你连接 Cloudflare 账号。之后就是一行命令的事。

开发体验总结

让我们回顾一下,用 NuxtHub 开发全栈应用有多简单:

传统全栈NuxtHub
前端: React/Vue + 后端: Spring/ExpressNuxt (前后端一体)
数据库: MySQL + 配置连接hub:database (D1)
对象存储: S3 + 配置 Access Keyhub:blob (R2)
AI: OpenAI API + 配置 API KeyhubAI() (Workers AI)
部署: Docker + K8s / EC2npx nuxthub deploy

系列回顾

恭喜你完成了整个系列!让我们回顾一下学习路径:

篇目主题核心收获
Part 0前端世界观HTML/CSS/JS, Node.js, npm ≈ Maven
Part 1Vue 核心ref() 响应式, .vue 单文件组件
Part 2组件通信Props 父传子, Events 子传父, Composables
Part 3Nuxt 架构SSR, 文件路由, app/ vs server/
Part 4Server APINitro, eventHandler, 类似 Spring Controller
Part 5数据获取useFetch, useState, SSR 水合
Part 6NuxtHubCloudflare R2/AI, Serverless 部署

下一步学习建议

  1. 动手实践:Fork Atidraw 仓库,尝试添加新功能
  2. 深入 Vue:学习 computed, watch, provide/inject
  3. 探索 Pinia:构建更复杂的状态管理
  4. 学习 TypeScript:提升代码质量和开发体验
  5. 了解 Nuxt Layers:模块化大型项目

结语

从一个 Java 后端开发者的视角,学习 Vue + Nuxt 其实并不难。很多概念都有对应关系:

  • ref() ≈ Observable / State
  • Props ≈ 构造器注入
  • Events ≈ EventListener
  • useFetch ≈ RestTemplate
  • server/api/ ≈ @RestController
  • nuxt.config.ts ≈ application.yml

最大的思维转变是:从命令式到声明式。你不再需要手动操作 DOM,只需要维护数据状态,让框架帮你渲染。

希望这个系列能帮助你顺利入门现代前端开发。有了 Nuxt,“全栈开发”不再遥远——你已经是一个全栈开发者了

Happy coding! 🎉