Nuxt 3单例依赖注入最佳实践及第三方实例复用方案
企业级项目中Supabase与Ghost CMS实例初始化的模块化最佳实践
核心原则
- 单一职责:每个服务的初始化逻辑单独封装,便于维护和测试
- 环境变量校验:避免空值或无效配置导致的运行时错误
- 单例模式:确保全项目复用同一个实例,减少资源消耗
- 类型安全(TypeScript):为实例添加类型定义,提升开发体验
目录结构建议
src/ ├── server/ │ ├── routes/ │ │ └── posts.get.ts │ └── services/ │ ├── ghost/ │ │ ├── index.ts │ │ └── types.ts(可选,类型定义) │ └── supabase/ │ ├── index.ts │ └── types.ts(可选,类型定义) └── env.d.ts(全局环境变量类型)
具体实现代码
1. Ghost CMS 服务封装
server/services/ghost/index.ts
import GhostContentAPI from '@tryghost/content-api'; // 环境变量校验,企业级项目建议主动抛出错误 if (!process.env.GHOST_URL) { throw new Error('GHOST_URL 环境变量未配置'); } if (!process.env.GHOST_API_KEY) { throw new Error('GHOST_API_KEY 环境变量未配置'); } // 初始化单例实例 const ghostApi = new GhostContentAPI({ url: process.env.GHOST_URL, key: process.env.GHOST_API_KEY, version: 'v5.0' }); // 导出实例供全项目复用 export default ghostApi;
2. Supabase 服务封装
server/services/supabase/index.ts
import { createClient } from '@supabase/supabase-js'; // 环境变量校验 if (!process.env.SUPABASE_URL) { throw new Error('SUPABASE_URL 环境变量未配置'); } if (!process.env.SUPABASE_SERVICE_ROLE_KEY) { throw new Error('SUPABASE_SERVICE_ROLE_KEY 环境变量未配置'); } // 初始化单例实例 const supabaseClient = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY ); // 导出实例供全项目复用 export default supabaseClient;
3. 在路由中调用实例
server/routes/posts.get.ts
import ghostApi from '../services/ghost'; import supabaseClient from '../services/supabase'; export async function getPosts() { // 调用Ghost API获取文章列表 const ghostPosts = await ghostApi.posts.browse({ limit: 10 }); // 调用Supabase查询数据 const { data: supabasePosts, error } = await supabaseClient .from('posts') .select('*') .limit(10); if (error) { throw new Error(`Supabase 查询错误: ${error.message}`); } return { ghostPosts, supabasePosts }; }
额外优化建议
- 添加类型定义:在对应服务的
types.ts中定义数据接口(比如Post),提升代码类型安全 - 统一错误处理:在服务层封装API调用的错误逻辑,避免路由层重复编写错误处理代码
- 测试友好:将初始化逻辑抽离,便于单元测试时注入模拟实例
- 多环境配置:结合配置文件管理开发/测试/生产环境的不同参数
内容的提问来源于stack exchange,提问作者Yashwardhan Pauranik
相关产品推荐
相关产品推荐

