You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写可在客户端与服务端运行的Nuxt 3简易Composable

解决方案

1. 调整别名与Nuxt配置

在nuxt.config.ts里配置运行时可识别的别名,替换原有的静态路径别名,确保服务端能正确找到文件:

export default defineNuxtConfig({
  alias: {
    '#user-preferences': './src/runtime'
  },
  modules: ['./src/module.ts'],
  runtimeConfig: {
    // 仅存放非动态的基础配置,动态偏好逻辑单独处理
  },
  build: {
    transpile: ['./src/runtime']
  }
})

2. 抽离通用核心逻辑

把与端侧无关的偏好获取核心代码单独放到src/runtime/utils/preferences-core.ts,让客户端和服务端代码共享这部分逻辑:

// src/runtime/utils/preferences-core.ts
export async function getAppPreferences(userId?: string) {
  // 这里编写动态获取偏好的核心逻辑,比如从数据库/内部接口读取
  // 示例:
  const res = await $fetch('/api/internal/fetch-preferences', {
    params: { userId }
  })
  return res.data
}

3. 客户端Composable(复用原有实现)

src/runtime/use-preferences.ts:

import { getAppPreferences } from './utils/preferences-core'

export const usePreferences = () => {
  const user = useUser()
  return useAsyncData('app-preferences', () => getAppPreferences(user.value?.id))
}

4. 服务端调用工具

src/runtime/server/utils/server-preferences.ts:

import { getAppPreferences } from '../../utils/preferences-core'

// 适配服务端上下文的调用工具
export async function getServerPreferences(event: H3Event, userId?: string) {
  // 从请求上下文获取用户信息(如果需要)
  const authUser = await getCurrentUser(event)
  return getAppPreferences(userId || authUser?.id)
}

5. 服务端API调用示例

在server/api/xxx.ts中直接通过别名导入使用:

import { getServerPreferences } from '#user-preferences/server/utils/server-preferences'

export default defineEventHandler(async (event) => {
  const preferences = await getServerPreferences(event)
  // 后续业务逻辑处理
  return { code: 200, data: preferences }
})

6. 修正Module.ts配置

确保模块中正确注册runtime目录,避免路径问题:

// src/module.ts
import { defineNuxtModule } from '@nuxt/kit'
import { fileURLToPath } from 'node:url'

export default defineNuxtModule({
  setup(_options, nuxt) {
    // 将runtime目录加入Nuxt扫描范围
    nuxt.options.runtimeConfig.public = nuxt.options.runtimeConfig.public || {}
    nuxt.options.build.transpile.push(fileURLToPath(new URL('./runtime', import.meta.url)))
  }
})

通过以上调整,客户端和服务端都能通过统一别名引用通用逻辑,动态偏好的获取不再依赖静态配置,服务端API也能正常调用偏好功能。

内容的提问来源于stack exchange,提问作者BreenDeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:33:12