From 0f6d4b199b16993dbc7c0dafe079ee81d5d32d87 Mon Sep 17 00:00:00 2001 From: dash <1549469775@qq.com> Date: Tue, 30 Sep 2025 21:53:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=80=A7Api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 66141 -> 78662 bytes components.d.ts | 17 +++++++++++++++++ package.json | 6 +++++- src/App.vue | 3 +++ src/components/ClientOnly.tsx | 43 ++++++++++++++++++++++++++++++++++++++++++ src/components/CookieDemo.vue | 6 +++++- src/components/DataFetch.vue | 9 +++++++-- src/compose/useFetch.ts | 6 +++--- src/vue.d.ts | 10 ++++++++++ tsconfig.json | 2 +- vite.config.ts | 7 ++++++- 11 files changed, 100 insertions(+), 9 deletions(-) create mode 100644 components.d.ts create mode 100644 src/components/ClientOnly.tsx create mode 100644 src/vue.d.ts diff --git a/bun.lockb b/bun.lockb index d7be6daf168232f363d55ca7bff3ae35e425fd4c..456dbfa15c07e11298c77f67a87298da6f11bf00 100644 GIT binary patch delta 18533 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 diff --git a/components.d.ts b/components.d.ts new file mode 100644 index 0000000..eb6c0af --- /dev/null +++ b/components.d.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +// biome-ignore lint: disable +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + ClientOnly: typeof import('./src/components/ClientOnly.tsx')['default'] + CookieDemo: typeof import('./src/components/CookieDemo.vue')['default'] + DataFetch: typeof import('./src/components/DataFetch.vue')['default'] + HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] + SimpleTest: typeof import('./src/components/SimpleTest.vue')['default'] + } +} diff --git a/package.json b/package.json index 71ea955..abf2fec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { "name": "koa-ssr", "type": "module", + "workspaces": [ + "packages/*" + ], "scripts": { "dev": "bun run --watch server.ts", "build": "npm run build:client && npm run build:server", @@ -14,6 +17,7 @@ "@types/koa": "^3.0.0", "@types/koa-send": "^4.1.6", "cross-env": "^10.1.0", + "unplugin-vue-components": "^29.1.0", "vue-tsc": "^3.1.0" }, "peerDependencies": { @@ -27,4 +31,4 @@ "vite": "^7.1.7", "vue": "^3.5.22" } -} \ No newline at end of file +} diff --git a/src/App.vue b/src/App.vue index 6d00c7e..8433d2a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -16,6 +16,9 @@ import SimpleTest from './components/SimpleTest.vue'; + +
Only For Client
+
diff --git a/src/components/ClientOnly.tsx b/src/components/ClientOnly.tsx new file mode 100644 index 0000000..fa64ae8 --- /dev/null +++ b/src/components/ClientOnly.tsx @@ -0,0 +1,43 @@ +import { cloneVNode, createElementBlock, defineComponent, getCurrentInstance, h, InjectionKey, onMounted, provide, shallowRef, SlotsType, VNode } from "vue"; + +export const clientOnlySymbol: InjectionKey = Symbol.for('nuxt:client-only') + +export default defineComponent({ + name: "ClientOnly", + inheritAttrs: false, + props: ['fallback', 'placeholder', 'placeholderTag', 'fallbackTag'], + ...(import.meta.env.DEV && { + slots: Object as SlotsType<{ + default?: () => VNode[] + + /** + * Specify a content to be rendered on the server and displayed until `` is mounted in the browser. + */ + fallback?: () => VNode[] + placeholder?: () => VNode[] + }>, + }), + setup(props, { slots, attrs }) { + const mounted = shallowRef(false) + onMounted(() => { mounted.value = true }) + const vm = getCurrentInstance() + if (vm) { + vm._nuxtClientOnly = true + } + provide(clientOnlySymbol, true) + return () => { + if (mounted.value) { + const vnodes = slots.default?.() + if (vnodes && vnodes.length === 1) { + return [cloneVNode(vnodes[0]!, attrs)] + } + return vnodes + } + const slot = slots.fallback || slots.placeholder + if (slot) { return h(slot) } + const fallbackStr = props.fallback || props.placeholder || '' + const fallbackTag = props.fallbackTag || props.placeholderTag || 'span' + return createElementBlock(fallbackTag, attrs, fallbackStr) + } + } +}) diff --git a/src/components/CookieDemo.vue b/src/components/CookieDemo.vue index 8d5ed24..69320a6 100644 --- a/src/components/CookieDemo.vue +++ b/src/components/CookieDemo.vue @@ -3,6 +3,9 @@
+ +
fuck ypu
+
服务端首屏会尝试设置缺失的 HttpOnly cookie,客户端不可读。 @@ -10,7 +13,8 @@