关于 bun-nuxt
帮助开发者使用 Bun 运行 Nuxt 3 应用的技能,涵盖项目配置、服务端代码中的 Bun API、Nitro 设置和部署方式。
主要功能
- 01使用 Bun 配置 Nuxt 3
- 02Bun 运行时与 Nitro 配置
- 03服务端路由中的 Bun API
- 04数据库与文件操作
- 05构建和部署指引
适用场景
- 01使用 Bun 启动 Nuxt 3 项目
- 02在服务端路由中调用 Bun API
- 03为 Bun 运行时配置 Nitro
- 04构建并运行生产服务器
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill bun-nuxt安装后在 Claude Code 中输入/bun-nuxt确认已加载。
详细介绍
Bun Nuxt
使用 Bun 运行 Nuxt 3 应用,实现更快速的开发。
快速开始
# Create new Nuxt project
bunx nuxi@latest init my-app
cd my-app
# Install dependencies
bun install
# Development
bun run dev
# Build
bun run build
# Preview production
bun run preview
安全安装
bunx nuxi init 等脚手架工具会下载并执行远程代码。运行前,请遵循供应链安全最佳实践:
- 阻止安装后脚本 — Bun 默认禁用这些脚本;可在
package.json的trustedDependencies中允许特定软件包 - 冷却期 — 在
bunfig.toml中配置minimumReleaseAge,让新版本等待 7 天后再安装 - 安装前审计 — 运行
socket package score npm <pkg>,或使用socket npm install <pkg>检查软件包
加载 dependency-upgrade 技能,了解完整的安全配置,包括 Socket CLI 集成、冷却期设置、锁文件验证和 CI 强制执行。
项目设置
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({
// Enable SSR
ssr: true,
// Nitro configuration
nitro: {
// Use Bun preset
preset: "bun",
// External packages
externals: {
external: ["bun:sqlite"],
},
},
// Development
devServer: {
port: 3000,
},
// Modules
modules: ["@nuxt/ui", "@pinia/nuxt"],
});
使用 Bun API
服务端路由
// 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: "Unauthorized",
});
}
});
文件操作
// 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: "File not found",
});
}
return file.text();
});
组合式函数
使用服务端数据的 useFetch
<script setup lang="ts">
// Fetches from server/api/users.ts
const { data: users, pending, error } = await useFetch("/api/users");
</script>
<template>
<div v-if="pending">Loading...</div>
<div v-else-if="error">Error: {{ error.message }}</div>
<ul v-else>
<li v-for="user in users" :key="user.id">{{ user.name }}</li>
</ul>
</template>
仅服务端组合式函数
// composables/useDatabase.ts
export const useDatabase = () => {
// Only runs on server
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) => {
// Read body
const body = await readBody(event);
// Get query params
const query = getQuery(event);
// Get headers
const auth = getHeader(event, "Authorization");
// Get cookies
const session = getCookie(event, "session");
// Set 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) => {
// Initialize on startup
console.log("Database initialized");
// Cleanup on shutdown
nitroApp.hooks.hook("close", () => {
console.log("Closing database");
});
});
定时任务
// server/tasks/cleanup.ts
export default defineTask({
meta: {
name: "cleanup",
description: "Clean old data",
},
run() {
const db = getDb();
db.run("DELETE FROM logs WHERE created_at < ?", [
Date.now() - 7 * 24 * 60 * 60 * 1000,
]);
return { result: "Cleaned" };
},
});
部署
为 Bun 构建
# Build with Bun preset
NITRO_PRESET=bun bun run build
# Run production server
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
// Access in code
const config = useRuntimeConfig();
console.log(config.public.apiUrl);
console.log(config.databaseUrl); // Server only
// 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
评论
支持 Markdown