sse-stream-plugin-vue

Vue 3 composables for sse-stream-plugin-sdk
196
Install
npm install sse-stream-plugin-vue
Latest Version:1.0.0
Vue:3
License:MIT
Last Updated:Oct 4, 2026
Links: npm
Maintainer: jixiong

sse-stream-plugin-vue

sse-stream-plugin-sdk 的 Vue 3 Composable 封装。将插件化 SSE SDK 封装为响应式 API,支持 MaybeRef 入参与自动生命周期管理。

安装

需要同时安装核心 SDK:

npm install sse-stream-plugin-vue sse-stream-plugin-sdk
# 或
pnpm add sse-stream-plugin-vue sse-stream-plugin-sdk

vue 为 peerDependency,要求 >=3.2.0。

快速开始

<script setup lang="ts">
import { ref } from 'vue'
import { useSSEStream } from 'sse-stream-plugin-vue'
import { recommendedPlugins } from 'sse-stream-plugin-sdk'

const prompt = ref('你好')

const { text, loading, status, start, stop } = useSSEStream({
  url: 'https://api.example.com/stream',
  method: 'POST',
  // getBody 每次 start 时调用,读取最新 prompt
  getBody: () => JSON.stringify({ prompt: prompt.value }),
  headers: { 'Content-Type': 'application/json' },
  plugins: recommendedPlugins(),
  onMessage: (data) => console.log(data),
  onError: (err) => console.error(err),
})
</script>

<template>
  <div>
    <input v-model="prompt" />
    <button @click="start" :disabled="loading">发送</button>
    <button @click="stop">停止</button>
    <p>{{ status }}</p>
    <pre>{{ text }}</pre>
  </div>
</template>

API

useSSEStream(options)

入参 UseSSEStreamOptions

核心配置字段支持 MaybeRef(可传 ref 或原始值),start 时 unref 读取最新值:

字段 类型 说明
url MaybeRef<string> 请求地址(必填)
method MaybeRef<'GET' | 'POST'> 请求方法,默认 GET
body MaybeRef<string> 请求体字符串
getBody () => string 每次 start 时动态生成请求体,优先级高于 body
headers MaybeRef<Record<string, string>> 自定义请求头
transport MaybeRef<string | TransportFactory> 传输层,省略则自动探测 fetch
parser MaybeRef<ParserFactory> 自定义解析器
plugins MaybeRef<SSEPlugin[]> 插件列表
onMessage (data, event) => void 收到 message 事件回调
onOpen (info: { transport }) => void 连接打开回调
onEnd () => void 流结束回调
onError (err) => void 错误回调
返回值 UseSSEStreamReturn

状态字段均为只读 Ref:

字段 类型 说明
text Readonly<Ref<string>> 已拼接的消息文本(message 事件 data 累加)
status Readonly<Ref<string>> 连接状态描述
loading Readonly<Ref<boolean>> 是否处于连接中/流式接收中
msgCount Readonly<Ref<number>> 已接收 message 事件条数
charCount Readonly<Ref<number>> 已接收字符总数
start () => void 发起一次连接(先销毁旧连接)
stop () => void 手动断开并销毁实例
instance Ref<PluginSSE | null> 当前实例(shallowRef,便于 use() 追加插件)

生命周期

  • 组件卸载时(onBeforeUnmount)自动 destroy() 实例并清空订阅,无需手动清理
  • start() 会先销毁旧连接再创建新连接,可重复调用

高级用法

响应式 url

<script setup lang="ts">
import { ref } from 'vue'

const url = ref('https://api.example.com/stream')

const { start } = useSSEStream({
  url, // 传 ref,start 时自动取最新值
  method: 'POST',
})
</script>

通过 instance 追加插件

<script setup lang="ts">
import { watch } from 'vue'
import { loggerPlugin } from 'sse-stream-plugin-sdk'

const { instance } = useSSEStream({ url, method: 'POST' })

watch(instance, (sse) => {
  if (sse) sse.use(loggerPlugin())
})
</script>

小程序环境

通过 transport 传入小程序传输层工厂:

<script setup lang="ts">
import { createMpTransport } from 'sse-stream-plugin-sdk'

const { start } = useSSEStream({
  url,
  transport: createMpTransport(() => wx),
})
</script>

License

MIT

Related Packages

@laravel/stream-vue

Laravel streaming hooks for Vue

196,737 105
@minch/use-event-source

A Vue composable for simplifying Server-Sent Events.

3,766 2
@composy/sse-vue

Vue 3 composables for @composy/sse-core

0
vueuse-temporals

Date related composables for atmosphere-ui

1,676 1
@alvarosabu/ui

UI Library for my personal projects

14,634 5

Version History

Version Released Vue License
1.0.0 >=3.2.0 MIT