名称: “Bun Nuxt” 描述: 当使用 Bun 运行时运行 Nuxt 3、使用 Bun 构建 Vue/Nuxt 应用或配置 Nuxt 项目以在开发和生产中使用 Bun 时使用。
Bun Nuxt
使用 Bun 运行 Nuxt 3 应用程序以加速开发。
快速开始
# 创建新的 Nuxt 项目
bunx nuxi@latest init my-app
cd my-app
# 安装依赖
bun install
# 开发
bun run dev
# 构建
bun run build
# 预览生产环境
bun run preview
项目设置
package.json
{
"scripts": {
"dev": "nuxt dev",
"build": "nuxt build",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"nuxt": "^4.0.0",
"vue": "^3.5.0"
}
}
使用 Bun 运行时
{
"scripts": {
"dev": "bun --bun nuxt dev",
"build": "bun --bun nuxt build",
"preview": "bun --bun .output/server/index.mjs"
}
}
配置
nuxt.config.ts
export default defineNuxtConfig({
// 启用 SSR
ssr: true,
// Nitro 配置
nitro: {
// 使用 Bun 预设
preset: "bun",
// 外部包
externals: {
external: ["bun:sqlite"],
},
},
// 开发
devServer: {
port: 3000,
},
// 模块
modules: ["@nuxt/ui", "@pinia/nuxt"],
});
使用 Bun APIs
服务器路由
// server/api/users.ts
import { Database } from "bun:sqlite";
export default defineEventHandler(async (event) => {
const db = new Database("data.sqlite");
const users = db.query("SELECT * FROM users").all();
db.close();
return users;
});
服务器中间件
// server/middleware/auth.ts
export default defineEventHandler(async (event) => {
const token = getHeader(event, "Authorization");
if (!token && event.path.startsWith("/api/protected")) {
throw createError({
statusCode: 401,
message: "未授权",
});
}
});
文件操作
// server/api/files/[name].ts
export default defineEventHandler(async (event) => {
const name = getRouterParam(event, "name");
const file = Bun.file(`./data/${name}`);
if (!(await file.exists())) {
throw createError({
statusCode: 404,
message: "文件未找到",
});
}
return file.text();
});
组合式 API
使用服务器数据的 useFetch
<script setup lang="ts">
// 从 server/api/users.ts 获取
const { data: users, pending, error } = await useFetch("/api/users");
</script>
<template>
<div v-if="pending">加载中...</div>
<div v-else-if="error">错误: {{ error.message }}</div>
<ul v-else>
<li v-for="user in users" :key="user.id">{{ user.name }}</li>
</ul>
</template>
仅服务器的组合式 API
// composables/useDatabase.ts
export const useDatabase = () => {
// 仅在服务器上运行
if (process.server) {
const { Database } = require("bun:sqlite");
return new Database("data.sqlite");
}
return null;
};
服务器工具
H3 事件处理
// server/api/users.post.ts
export default defineEventHandler(async (event) => {
// 读取请求体
const body = await readBody(event);
// 获取查询参数
const query = getQuery(event);
// 获取请求头
const auth = getHeader(event, "Authorization");
// 获取 Cookie
const session = getCookie(event, "session");
// 设置 Cookie
setCookie(event, "visited", "true", {
httpOnly: true,
maxAge: 60 * 60 * 24,
});
return { success: true };
});
数据库工具
// server/utils/db.ts
import { Database } from "bun:sqlite";
let db: Database | null = null;
export function getDb() {
if (!db) {
db = new Database("data.sqlite");
db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
`);
}
return db;
}
// server/api/users.ts
export default defineEventHandler(() => {
const db = getDb();
return db.query("SELECT * FROM users").all();
});
Nitro 功能
服务器插件
// server/plugins/database.ts
export default defineNitroPlugin((nitroApp) => {
// 在启动时初始化
console.log("数据库已初始化");
// 在关闭时清理
nitroApp.hooks.hook("close", () => {
console.log("关闭数据库");
});
});
定时任务
// server/tasks/cleanup.ts
export default defineTask({
meta: {
name: "cleanup",
description: "清理旧数据",
},
run() {
const db = getDb();
db.run("DELETE FROM logs WHERE created_at < ?", [
Date.now() - 7 * 24 * 60 * 60 * 1000,
]);
return { result: "已清理" };
},
});
部署
为 Bun 构建
# 使用 Bun 预设构建
NITRO_PRESET=bun bun run build
# 运行生产服务器
bun .output/server/index.mjs
Docker
FROM oven/bun:1 AS builder
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
COPY . .
RUN bun run build
FROM oven/bun:1
WORKDIR /app
COPY --from=builder /app/.output /app/.output
EXPOSE 3000
CMD ["bun", ".output/server/index.mjs"]
环境变量
# .env
NUXT_PUBLIC_API_URL=https://api.example.com
DATABASE_URL=./data.sqlite
// 在代码中访问
const config = useRuntimeConfig();
console.log(config.public.apiUrl);
console.log(config.databaseUrl); // 仅服务器
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
databaseUrl: "",
public: {
apiUrl: "",
},
},
});
常见错误
| 错误 | 原因 | 修复方法 |
|---|---|---|
Cannot find bun:sqlite |
错误的预设 | 设置 nitro.preset: "bun" |
Module parse failed |
构建问题 | 清除 .nuxt 并重新构建 |
Hydration mismatch |
服务器/客户端差异 | 检查异步数据 |
EADDRINUSE |
端口被占用 | 更改端口或终止进程 |
何时加载参考文档
加载 references/nitro.md 当:
- 高级 Nitro 配置
- 存储驱动
- 缓存处理程序
加载 references/deployment.md 当:
- 边缘部署
- Cloudflare Workers
- Vercel/Netlify