chore(h5): 整理 git 跟踪文件与依赖位置

- auto-imports.d.ts 改为忽略(unplugin-auto-import 自动生成产物)

- .gitignore 补全 tsbuildinfo/history/stats.html 等

- @types/lodash-es 从 dependencies 迁移到 devDependencies

- 用户授权协议文件重命名为英文 USER-AGREEMENT.txt(内容不变)

- 删除 MIGRATION-PLAN.md 过程文档(分支历史已留存)
This commit is contained in:
bootx
2026-06-23 14:25:35 +08:00
parent 4cb31707c1
commit 9482a5e365
5 changed files with 14 additions and 493 deletions

14
.gitignore vendored
View File

@@ -15,7 +15,7 @@ dist-ssr
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
/.idea
.DS_Store
*.suo
*.ntvs*
@@ -25,3 +25,15 @@ dist-ssr
/components.d.ts
.agents/
skills-lock.json
# 自动生成的类型声明unplugin-auto-import 产物dev/build 时重新生成)
/types/auto-imports.d.ts
# TypeScript 增量构建缓存
*.tsbuildinfo
# VSCode Local History 插件
.history/
# 构建分析报告rollup-plugin-visualizer 产物)
/stats.html

View File

@@ -1,172 +0,0 @@
# DaxPay H5 升级迁移方案
> 基于 [vue3-vant4-mobile](https://github.com/xiangshu233/vue3-vant4-mobile) 重建 H5 端脚手架。
> 旧版业务代码(收银台/订单/业务组件/crypto 签名)**不迁移**,后续将重新实现。
> 本方案仅产出干净的、带完整基础设施的 DaxPay H5 空壳项目。
## 一、目标与原则
**目标**:以 `vue3-vant4-mobile@main` 为新脚手架重建 `dax-pay-h5`,拿到 Vite 8 / Pinia 3 / Vue Router 5 / UnoCSS 66 的架构红利 + Dark Mode + 系统主题色 + keep-alive/routeStore + http 分层封装,产出等待业务开发的干净基座。
**原则**
1. 模板作基座,裁掉所有 demo 演示业务dashboard / example / message / my 演示页、ECharts、Mock
2. 现有 DaxPay 业务资产收银台、订单、22 个业务组件、crypto、api、views、router modules、store.user 等)**全部不迁移**,后续重新实现。
3. 保留模板的完整基础设施Dark Mode、主题色、keep-alive、http 分层),但 http 分层保留**通用版**不植入业务拦截器逻辑token 头等留待业务阶段定)。
4. 分阶段可验证,每个阶段结束都能 `pnpm dev` 起来且 `pnpm type:check` 通过。
5. 保留 DaxPay 品牌与环境:应用名 `DaxPay`、端口 `9100`、代理 `/server``http://127.0.0.1:19999/``VITE_GLOB_*` 环境变量体系。
## 二、最终技术栈锁定
| 类别 | 版本 | 来源 |
| ------------------------------------- | -------------------------------- | ------------------------------------- |
| Vite | ^8.0.2 | 模板 |
| Vue | ^3.5.30 | 模板 |
| Vue Router | ^5.0.4 | 模板 |
| Pinia | ^3.0.4 | 模板 |
| pinia-plugin-persistedstate | ^4.7.1 | 模板(替代旧 `pinia-plugin-persist` |
| Vant | ^4.9.22 | 模板 |
| UnoCSS | ^66.6.7(含 `@unocss/*` 同版本) | 模板 |
| TypeScript | ^5.9.3 | 模板 |
| vue-tsc | ^3.2.6 | 模板 |
| @vitejs/plugin-vue | ^6.0.5 | 模板 |
| @vueuse/core | ^14.2.1 | 模板 |
| unplugin-auto-import / vue-components | ^21 / ^32 | 模板 |
| tsx | ^4.21 | 模板(替代 `esno` |
| terser | ^5.46 | 模板drop console |
| vconsole + vite-plugin-vconsole | 保留现有版本 | 开发期调试工具 |
| **Node** | **>=22.12.0** | 用户要求engines 锁定 22 |
| pnpm | >=9.0.2 | monorepo 约定 |
**不安装**`echarts``mockjs``vue-qr`(业务重写后按需再加)。
## 三、纳入 / 裁剪 / 迁入清单
### 从模板纳入
- 构建脚本:`build/` 全套(`script/buildConf.ts``postBuild.ts``getConfigFileName.ts``vite/plugin/*`
- `vite.config.ts``rolldownOptions` + oxc/terser minify
- `main.ts`(按需 vant 样式 + `setupStore`/`setupRouter` 异步 mount
- `store/index.ts``setupStore` + `persistedstate`
- `router/``base` + `index` + `modules` + `router-guards` + `routeStore`
- `utils/http/axios/`(分层封装,全套 7 文件,保留通用版)
- `hooks/``core`/`event`/`setting`/`web` 分层,移除 `useECharts`
- `layout/``index.vue` + `FloatingNavBar`
- Dark Mode + 主题色体系:`store/modules/designSetting.ts` + `settings/designSetting.ts` + `hooks/setting/useDesignSetting.ts` + `views/my/ThemeSetting.vue` + `styles/entry.css` + `styles/vant.less` + `App.vue`
- `enums/`breakpointEnum / cacheEnum / httpEnum / pageEnum
- `utils/`Storage、dateUtil、domUtils、env、is、urlUtils、log、index
- `types/`auto-imports.d.ts、config.d.ts、global.d.ts、index.d.ts、modules.d.ts
- `uno.config.ts`webfonts provider 改回 `none`
- `eslint.config.js``commitlint.config.cjs``.editorconfig``simple-git-hooks`
### 从模板裁剪
- `src/views/dashboard/``example/``message/`(含 barChart/lineChart/pieChart`my/` 演示页(**保留 `ThemeSetting.vue`** 作为主题设置页骨架)
- `src/hooks/web/useECharts.ts` + `src/utils/lib/echarts.ts`
- `mock/` 目录 + `build/vite/plugin/mock.ts` + `vite-plugin-mock` + `mockjs` + `@types/mockjs` 依赖 + `VITE_GLOB_PROD_MOCK`
- `vercel.json``public/_redirects``.github/workflows/`
- `uno.config.ts` 的演示 safelist、`webfonts` provider`none`
### 从现有项目迁入(仅非业务资产)
- `.env` / `.env.development` / `.env.production`(端口 9100、代理 `/server``VITE_V_CONSOLE``VITE_DROP_CONSOLE``VITE_BUILD_COMPRESS`
- `用户授权使用协议.txt`
- `README.md`(业务说明保留,技术说明换新栈)
- `.git/`(保留提交历史)
- `index.html` 的 DaxPay 品牌title / meta
### 明确丢弃(不迁移,重新实现)
`src/api/*``views/*``components/*`22 个业务组件)、`utils/{axios,crypto,format,validate}.ts``router/{guard,modules}/*``store/modules/user.ts``hooks/{useConfig,useUser,useTheme,useDevice,useRequest,useCountdown}.ts``layout/{Default,IndexTabBar,Helper}*``vue-qr` 依赖——全部不迁。
> 旧版完整业务代码已保留在备份分支 `h5-legacy`tag `h5-legacy-v3.0.0`),供重新实现时参考。
## 四、交付物定义
产出一个**干净的 DaxPay H5 脚手架**
- 基于 vue3-vant4-mobile裁掉所有 demo 演示页。
- 保留完整基础设施Dark Mode + 主题色 + keep-alive/routeStore + http 分层 + vconsole。
- 品牌定制:应用名 DaxPay、端口 9100、代理 `/server``127.0.0.1:19999`
- 只保留一个占位首页(登录后落地,最简),等待业务开发。
- `pnpm dev` / `pnpm type:check` / `pnpm lint` / `pnpm build` 全绿。
## 五、分阶段执行计划
### 阶段 0准备0.3 天)
- [x] `dax-pay-h5` 打 tag `h5-legacy-v3.0.0`(旧业务最后状态)
- [x] 切备份分支 `h5-legacy`(保留全部旧业务供后续参考)
- [x] Node 版本确认 ≥ 22.12.0(实测 v24.17.0
- [x] 记录现网基础配置:端口 9100、代理 `/server``http://127.0.0.1:19999/`
### 阶段 1脚手架搭建0.5 天)
- [ ] 克隆 `vue3-vant4-mobile`,整体替换 `dax-pay-h5`(保留 `.git/`、协议文件、`README.md`、本文件)
- [ ] `package.json``name=daxpay-gateway-ui``version=3.1.0``engines.node=">=22.12.0"``engines.pnpm=">=9.0.2"`
- [ ] 删除演示业务:`src/views/{dashboard,example,message,my}``my/ThemeSetting.vue` 单独保留)、`src/hooks/web/useECharts.ts``src/utils/lib/``mock/``build/vite/plugin/mock.ts``vercel.json``.github/``public/_redirects`
- [ ] 删除依赖:`echarts``mockjs``@types/mockjs``vite-plugin-mock``@oxc-parser/binding-win32-x64-msvc`
- [ ] 加回依赖:`vconsole``vite-plugin-vconsole`,新建 `build/vite/plugin/vconsole.ts` 注册
- [ ] `src/views/` 只留一个占位首页 `views/home/index.vue`
- [ ] `uno.config.ts`webfonts provider 改 `none`、清空演示 safelist
- [ ] `pnpm install && pnpm dev` 验证脚手架自洽
- **验证**`dev` / `type:check` / `build` 三绿
### 阶段 2基础设施定制0.5 天)
- [ ] 环境变量:用现有 `.env*` 覆盖(端口 9100、代理、`VITE_V_CONSOLE=true``VITE_DROP_CONSOLE``VITE_BUILD_COMPRESS`),删 `VITE_GLOB_PROD_MOCK`
- [ ] `build/utils.ts``wrapperEnv` 同步调整校验项
- [ ] `router/modules.ts`:清空 demo 路由,只留登录页 + 占位首页 + 404
- [ ] `store/modules/user.ts`:保留模板默认骨架(供后续业务用)
- [ ] `main.ts`:加回 vconsole 开发环境初始化
- [ ] HTTP 分层:保留模板通用版,不植业务拦截器
- **验证**dev 起来,登录页/占位首页可访问Dark Mode + 主题色切换生效
### 阶段 3样式与适配0.3 天)
- [ ] `postcss.config.js`:采用模板版(去掉现有 `exclude:[/src/]` 这个疑似 bug 的配置)
- [ ] 合并 `styles/var.less`,确认 vant 主题变量
- [ ] Dark Mode 下占位页自查
### 阶段 4质量验证0.2 天)
- [ ] `pnpm type:check`vue-tsc 3零错误
- [ ] `pnpm lint`@antfu/eslint-config 2零 error
- [ ] `pnpm build` 成功,记录产物体积基线
- [ ] `npx simple-git-hooks` 装 hooks
- [ ] 真机扫描进 H5验证 viewport 适配 + Dark Mode
**工期估算**:约 1.8 人天
## 六、关键 Breaking Change 应对手册
| 变更点 | 现状 | 新版应对 |
| ----------------------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------- |
| Vite 8 移除 CJS Node API | 配置已 ESM | 确认所有 `.js` 配置含 ESM 导出;`postcss.config.js` 保持 `import` |
| `rollupOptions``rolldownOptions` | rollupOptions | `vite.config.ts` 改名(模板已示范) |
| esbuild drop 失效 | `esbuild.drop` | 改 `minify:'terser'` + `terserOptions.compress.drop_console`(模板已示范) |
| Pinia 3 持久化 | `pinia-plugin-persist` | 换 `pinia-plugin-persistedstate``persist:true` 写法基本兼容 |
| Vue Router 4 → 5 | v4 | `createRouter`/`createWebHashHistory` 兼容;守卫 API 复核 |
| UnoCSS 0.58 → 66 | 分散包 0.58 | 统一升 66preset/transformer 导入路径不变,配置语法兼容 |
| @vueuse 10 → 14 | v10 | 业务重写后按需核对(本项目不迁旧 hooks影响小 |
| vue-tsc 1 → 3 | v1 | CLI 兼容TS 需 ≥5.5 |
| vant 全量 → 按需 | `app.use(Vant)` | `main.ts``app.use(Vant)`,靠 unplugin-vue-components 自动注册 + 手动导 4 个副作用样式 |
| esno → tsx | `esno ./build/script/postBuild.ts` | script 改 `tsx ./build/script/postBuild.ts` |
## 七、风险与回滚
| 风险 | 等级 | 缓解 |
| ------------------------------------------- | ---- | ------------------------------------ |
| UnoCSS 66 与业务原子类不兼容 | 中 | 阶段 1 先跑通,出问题可临时锁回 0.58 |
| Pinia 3 persistedstate 持久化行为差异 | 中 | 阶段 2 测主题/设置持久化 |
| vant 按需导入漏样式Toast/Dialog 等) | 中 | `main.ts` 显式导 4 个,其余用到再补 |
| Vite 8 三方插件未跟进vconsole/svg-icons | 中 | 阶段 1 验证,必要时锁版本 |
**回滚**`h5-legacy` 分支随时可切回;每个阶段结束提交一次,便于二分定位。
## 八、约定备忘
- `node` 锁定 `>=22.12.0``pnpm` `>=9.0.2`
- 路由模式:`createWebHashHistory`H5 嵌入支付场景更稳)。
- 接口 token 头约定:`Accesstoken`Sa-Token来自 DaxPay 后端约定),待业务阶段在 http transform 中实现。
- 不自动提交代码,每阶段结束询问是否提交。

View File

@@ -26,7 +26,6 @@
"lint:lint-staged": "lint-staged"
},
"dependencies": {
"@types/lodash-es": "^4.17.12",
"@vueuse/core": "^14.2.1",
"axios": "^1.4.0",
"date-fns": "^3.0.6",
@@ -47,6 +46,7 @@
"@iconify/json": "^2.2.188",
"@oxc-parser/binding-win32-x64-msvc": "0.115.0",
"@types/fs-extra": "^11.0.4",
"@types/lodash-es": "^4.17.12",
"@types/node": "^25.5.0",
"@types/nprogress": "^0.2.3",
"@types/qs": "^6.9.11",

View File

@@ -1,319 +0,0 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
// biome-ignore lint: disable
export {}
declare global {
const EffectScope: typeof import('vue').EffectScope
const acceptHMRUpdate: typeof import('pinia').acceptHMRUpdate
const asyncComputed: typeof import('@vueuse/core').asyncComputed
const autoResetRef: typeof import('@vueuse/core').autoResetRef
const computed: typeof import('vue').computed
const computedAsync: typeof import('@vueuse/core').computedAsync
const computedEager: typeof import('@vueuse/core').computedEager
const computedInject: typeof import('@vueuse/core').computedInject
const computedWithControl: typeof import('@vueuse/core').computedWithControl
const controlledComputed: typeof import('@vueuse/core').controlledComputed
const controlledRef: typeof import('@vueuse/core').controlledRef
const createApp: typeof import('vue').createApp
const createEventHook: typeof import('@vueuse/core').createEventHook
const createGlobalState: typeof import('@vueuse/core').createGlobalState
const createInjectionState: typeof import('@vueuse/core').createInjectionState
const createPinia: typeof import('pinia').createPinia
const createReactiveFn: typeof import('@vueuse/core').createReactiveFn
const createRef: typeof import('@vueuse/core').createRef
const createReusableTemplate: typeof import('@vueuse/core').createReusableTemplate
const createSharedComposable: typeof import('@vueuse/core').createSharedComposable
const createTemplatePromise: typeof import('@vueuse/core').createTemplatePromise
const createUnrefFn: typeof import('@vueuse/core').createUnrefFn
const customRef: typeof import('vue').customRef
const debouncedRef: typeof import('@vueuse/core').debouncedRef
const debouncedWatch: typeof import('@vueuse/core').debouncedWatch
const defineAsyncComponent: typeof import('vue').defineAsyncComponent
const defineComponent: typeof import('vue').defineComponent
const defineStore: typeof import('pinia').defineStore
const eagerComputed: typeof import('@vueuse/core').eagerComputed
const effectScope: typeof import('vue').effectScope
const extendRef: typeof import('@vueuse/core').extendRef
const getActivePinia: typeof import('pinia').getActivePinia
const getCurrentInstance: typeof import('vue').getCurrentInstance
const getCurrentScope: typeof import('vue').getCurrentScope
const getCurrentWatcher: typeof import('vue').getCurrentWatcher
const h: typeof import('vue').h
const ignorableWatch: typeof import('@vueuse/core').ignorableWatch
const inject: typeof import('vue').inject
const injectLocal: typeof import('@vueuse/core').injectLocal
const isDefined: typeof import('@vueuse/core').isDefined
const isProxy: typeof import('vue').isProxy
const isReactive: typeof import('vue').isReactive
const isReadonly: typeof import('vue').isReadonly
const isRef: typeof import('vue').isRef
const isShallow: typeof import('vue').isShallow
const makeDestructurable: typeof import('@vueuse/core').makeDestructurable
const mapActions: typeof import('pinia').mapActions
const mapGetters: typeof import('pinia').mapGetters
const mapState: typeof import('pinia').mapState
const mapStores: typeof import('pinia').mapStores
const mapWritableState: typeof import('pinia').mapWritableState
const markRaw: typeof import('vue').markRaw
const nextTick: typeof import('vue').nextTick
const onActivated: typeof import('vue').onActivated
const onBeforeMount: typeof import('vue').onBeforeMount
const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
const onBeforeUnmount: typeof import('vue').onBeforeUnmount
const onBeforeUpdate: typeof import('vue').onBeforeUpdate
const onClickOutside: typeof import('@vueuse/core').onClickOutside
const onDeactivated: typeof import('vue').onDeactivated
const onElementRemoval: typeof import('@vueuse/core').onElementRemoval
const onErrorCaptured: typeof import('vue').onErrorCaptured
const onKeyStroke: typeof import('@vueuse/core').onKeyStroke
const onLongPress: typeof import('@vueuse/core').onLongPress
const onMounted: typeof import('vue').onMounted
const onRenderTracked: typeof import('vue').onRenderTracked
const onRenderTriggered: typeof import('vue').onRenderTriggered
const onScopeDispose: typeof import('vue').onScopeDispose
const onServerPrefetch: typeof import('vue').onServerPrefetch
const onStartTyping: typeof import('@vueuse/core').onStartTyping
const onUnmounted: typeof import('vue').onUnmounted
const onUpdated: typeof import('vue').onUpdated
const onWatcherCleanup: typeof import('vue').onWatcherCleanup
const pausableWatch: typeof import('@vueuse/core').pausableWatch
const provide: typeof import('vue').provide
const provideLocal: typeof import('@vueuse/core').provideLocal
const reactify: typeof import('@vueuse/core').reactify
const reactifyObject: typeof import('@vueuse/core').reactifyObject
const reactive: typeof import('vue').reactive
const reactiveComputed: typeof import('@vueuse/core').reactiveComputed
const reactiveOmit: typeof import('@vueuse/core').reactiveOmit
const reactivePick: typeof import('@vueuse/core').reactivePick
const readonly: typeof import('vue').readonly
const ref: typeof import('vue').ref
const refAutoReset: typeof import('@vueuse/core').refAutoReset
const refDebounced: typeof import('@vueuse/core').refDebounced
const refDefault: typeof import('@vueuse/core').refDefault
const refManualReset: typeof import('@vueuse/core').refManualReset
const refThrottled: typeof import('@vueuse/core').refThrottled
const refWithControl: typeof import('@vueuse/core').refWithControl
const resolveComponent: typeof import('vue').resolveComponent
const resolveRef: typeof import('@vueuse/core').resolveRef
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
const setActivePinia: typeof import('pinia').setActivePinia
const setMapStoreSuffix: typeof import('pinia').setMapStoreSuffix
const shallowReactive: typeof import('vue').shallowReactive
const shallowReadonly: typeof import('vue').shallowReadonly
const shallowRef: typeof import('vue').shallowRef
const storeToRefs: typeof import('pinia').storeToRefs
const syncRef: typeof import('@vueuse/core').syncRef
const syncRefs: typeof import('@vueuse/core').syncRefs
const templateRef: typeof import('@vueuse/core').templateRef
const throttledRef: typeof import('@vueuse/core').throttledRef
const throttledWatch: typeof import('@vueuse/core').throttledWatch
const toRaw: typeof import('vue').toRaw
const toReactive: typeof import('@vueuse/core').toReactive
const toRef: typeof import('vue').toRef
const toRefs: typeof import('vue').toRefs
const toValue: typeof import('vue').toValue
const triggerRef: typeof import('vue').triggerRef
const tryOnBeforeMount: typeof import('@vueuse/core').tryOnBeforeMount
const tryOnBeforeUnmount: typeof import('@vueuse/core').tryOnBeforeUnmount
const tryOnMounted: typeof import('@vueuse/core').tryOnMounted
const tryOnScopeDispose: typeof import('@vueuse/core').tryOnScopeDispose
const tryOnUnmounted: typeof import('@vueuse/core').tryOnUnmounted
const unref: typeof import('vue').unref
const unrefElement: typeof import('@vueuse/core').unrefElement
const until: typeof import('@vueuse/core').until
const useActiveElement: typeof import('@vueuse/core').useActiveElement
const useAnimate: typeof import('@vueuse/core').useAnimate
const useArrayDifference: typeof import('@vueuse/core').useArrayDifference
const useArrayEvery: typeof import('@vueuse/core').useArrayEvery
const useArrayFilter: typeof import('@vueuse/core').useArrayFilter
const useArrayFind: typeof import('@vueuse/core').useArrayFind
const useArrayFindIndex: typeof import('@vueuse/core').useArrayFindIndex
const useArrayFindLast: typeof import('@vueuse/core').useArrayFindLast
const useArrayIncludes: typeof import('@vueuse/core').useArrayIncludes
const useArrayJoin: typeof import('@vueuse/core').useArrayJoin
const useArrayMap: typeof import('@vueuse/core').useArrayMap
const useArrayReduce: typeof import('@vueuse/core').useArrayReduce
const useArraySome: typeof import('@vueuse/core').useArraySome
const useArrayUnique: typeof import('@vueuse/core').useArrayUnique
const useAsyncQueue: typeof import('@vueuse/core').useAsyncQueue
const useAsyncState: typeof import('@vueuse/core').useAsyncState
const useAttrs: typeof import('vue').useAttrs
const useBase64: typeof import('@vueuse/core').useBase64
const useBattery: typeof import('@vueuse/core').useBattery
const useBluetooth: typeof import('@vueuse/core').useBluetooth
const useBreakpoints: typeof import('@vueuse/core').useBreakpoints
const useBroadcastChannel: typeof import('@vueuse/core').useBroadcastChannel
const useBrowserLocation: typeof import('@vueuse/core').useBrowserLocation
const useCached: typeof import('@vueuse/core').useCached
const useClipboard: typeof import('@vueuse/core').useClipboard
const useClipboardItems: typeof import('@vueuse/core').useClipboardItems
const useCloned: typeof import('@vueuse/core').useCloned
const useColorMode: typeof import('@vueuse/core').useColorMode
const useConfirmDialog: typeof import('@vueuse/core').useConfirmDialog
const useCountdown: typeof import('@vueuse/core').useCountdown
const useCounter: typeof import('@vueuse/core').useCounter
const useCssModule: typeof import('vue').useCssModule
const useCssSupports: typeof import('@vueuse/core').useCssSupports
const useCssVar: typeof import('@vueuse/core').useCssVar
const useCssVars: typeof import('vue').useCssVars
const useCurrentElement: typeof import('@vueuse/core').useCurrentElement
const useCycleList: typeof import('@vueuse/core').useCycleList
const useDark: typeof import('@vueuse/core').useDark
const useDateFormat: typeof import('@vueuse/core').useDateFormat
const useDebounce: typeof import('@vueuse/core').useDebounce
const useDebounceFn: typeof import('@vueuse/core').useDebounceFn
const useDebouncedRefHistory: typeof import('@vueuse/core').useDebouncedRefHistory
const useDeviceMotion: typeof import('@vueuse/core').useDeviceMotion
const useDeviceOrientation: typeof import('@vueuse/core').useDeviceOrientation
const useDevicePixelRatio: typeof import('@vueuse/core').useDevicePixelRatio
const useDevicesList: typeof import('@vueuse/core').useDevicesList
const useDisplayMedia: typeof import('@vueuse/core').useDisplayMedia
const useDocumentVisibility: typeof import('@vueuse/core').useDocumentVisibility
const useDraggable: typeof import('@vueuse/core').useDraggable
const useDropZone: typeof import('@vueuse/core').useDropZone
const useElementBounding: typeof import('@vueuse/core').useElementBounding
const useElementByPoint: typeof import('@vueuse/core').useElementByPoint
const useElementHover: typeof import('@vueuse/core').useElementHover
const useElementSize: typeof import('@vueuse/core').useElementSize
const useElementVisibility: typeof import('@vueuse/core').useElementVisibility
const useEventBus: typeof import('@vueuse/core').useEventBus
const useEventListener: typeof import('@vueuse/core').useEventListener
const useEventSource: typeof import('@vueuse/core').useEventSource
const useEyeDropper: typeof import('@vueuse/core').useEyeDropper
const useFavicon: typeof import('@vueuse/core').useFavicon
const useFetch: typeof import('@vueuse/core').useFetch
const useFileDialog: typeof import('@vueuse/core').useFileDialog
const useFileSystemAccess: typeof import('@vueuse/core').useFileSystemAccess
const useFocus: typeof import('@vueuse/core').useFocus
const useFocusWithin: typeof import('@vueuse/core').useFocusWithin
const useFps: typeof import('@vueuse/core').useFps
const useFullscreen: typeof import('@vueuse/core').useFullscreen
const useGamepad: typeof import('@vueuse/core').useGamepad
const useGeolocation: typeof import('@vueuse/core').useGeolocation
const useId: typeof import('vue').useId
const useIdle: typeof import('@vueuse/core').useIdle
const useImage: typeof import('@vueuse/core').useImage
const useInfiniteScroll: typeof import('@vueuse/core').useInfiniteScroll
const useIntersectionObserver: typeof import('@vueuse/core').useIntersectionObserver
const useInterval: typeof import('@vueuse/core').useInterval
const useIntervalFn: typeof import('@vueuse/core').useIntervalFn
const useKeyModifier: typeof import('@vueuse/core').useKeyModifier
const useLastChanged: typeof import('@vueuse/core').useLastChanged
const useLink: typeof import('vue-router').useLink
const useLocalStorage: typeof import('@vueuse/core').useLocalStorage
const useMagicKeys: typeof import('@vueuse/core').useMagicKeys
const useManualRefHistory: typeof import('@vueuse/core').useManualRefHistory
const useMediaControls: typeof import('@vueuse/core').useMediaControls
const useMediaQuery: typeof import('@vueuse/core').useMediaQuery
const useMemoize: typeof import('@vueuse/core').useMemoize
const useMemory: typeof import('@vueuse/core').useMemory
const useModel: typeof import('vue').useModel
const useMounted: typeof import('@vueuse/core').useMounted
const useMouse: typeof import('@vueuse/core').useMouse
const useMouseInElement: typeof import('@vueuse/core').useMouseInElement
const useMousePressed: typeof import('@vueuse/core').useMousePressed
const useMutationObserver: typeof import('@vueuse/core').useMutationObserver
const useNavigatorLanguage: typeof import('@vueuse/core').useNavigatorLanguage
const useNetwork: typeof import('@vueuse/core').useNetwork
const useNow: typeof import('@vueuse/core').useNow
const useObjectUrl: typeof import('@vueuse/core').useObjectUrl
const useOffsetPagination: typeof import('@vueuse/core').useOffsetPagination
const useOnline: typeof import('@vueuse/core').useOnline
const usePageLeave: typeof import('@vueuse/core').usePageLeave
const useParallax: typeof import('@vueuse/core').useParallax
const useParentElement: typeof import('@vueuse/core').useParentElement
const usePerformanceObserver: typeof import('@vueuse/core').usePerformanceObserver
const usePermission: typeof import('@vueuse/core').usePermission
const usePointer: typeof import('@vueuse/core').usePointer
const usePointerLock: typeof import('@vueuse/core').usePointerLock
const usePointerSwipe: typeof import('@vueuse/core').usePointerSwipe
const usePreferredColorScheme: typeof import('@vueuse/core').usePreferredColorScheme
const usePreferredContrast: typeof import('@vueuse/core').usePreferredContrast
const usePreferredDark: typeof import('@vueuse/core').usePreferredDark
const usePreferredLanguages: typeof import('@vueuse/core').usePreferredLanguages
const usePreferredReducedMotion: typeof import('@vueuse/core').usePreferredReducedMotion
const usePreferredReducedTransparency: typeof import('@vueuse/core').usePreferredReducedTransparency
const usePrevious: typeof import('@vueuse/core').usePrevious
const useRafFn: typeof import('@vueuse/core').useRafFn
const useRefHistory: typeof import('@vueuse/core').useRefHistory
const useResizeObserver: typeof import('@vueuse/core').useResizeObserver
const useRoute: typeof import('vue-router').useRoute
const useRouter: typeof import('vue-router').useRouter
const useSSRWidth: typeof import('@vueuse/core').useSSRWidth
const useScreenOrientation: typeof import('@vueuse/core').useScreenOrientation
const useScreenSafeArea: typeof import('@vueuse/core').useScreenSafeArea
const useScriptTag: typeof import('@vueuse/core').useScriptTag
const useScroll: typeof import('@vueuse/core').useScroll
const useScrollLock: typeof import('@vueuse/core').useScrollLock
const useSessionStorage: typeof import('@vueuse/core').useSessionStorage
const useShare: typeof import('@vueuse/core').useShare
const useSlots: typeof import('vue').useSlots
const useSorted: typeof import('@vueuse/core').useSorted
const useSpeechRecognition: typeof import('@vueuse/core').useSpeechRecognition
const useSpeechSynthesis: typeof import('@vueuse/core').useSpeechSynthesis
const useStepper: typeof import('@vueuse/core').useStepper
const useStorage: typeof import('@vueuse/core').useStorage
const useStorageAsync: typeof import('@vueuse/core').useStorageAsync
const useStyleTag: typeof import('@vueuse/core').useStyleTag
const useSupported: typeof import('@vueuse/core').useSupported
const useSwipe: typeof import('@vueuse/core').useSwipe
const useTemplateRef: typeof import('vue').useTemplateRef
const useTemplateRefsList: typeof import('@vueuse/core').useTemplateRefsList
const useTextDirection: typeof import('@vueuse/core').useTextDirection
const useTextSelection: typeof import('@vueuse/core').useTextSelection
const useTextareaAutosize: typeof import('@vueuse/core').useTextareaAutosize
const useThrottle: typeof import('@vueuse/core').useThrottle
const useThrottleFn: typeof import('@vueuse/core').useThrottleFn
const useThrottledRefHistory: typeof import('@vueuse/core').useThrottledRefHistory
const useTimeAgo: typeof import('@vueuse/core').useTimeAgo
const useTimeAgoIntl: typeof import('@vueuse/core').useTimeAgoIntl
const useTimeout: typeof import('@vueuse/core').useTimeout
const useTimeoutFn: typeof import('@vueuse/core').useTimeoutFn
const useTimeoutPoll: typeof import('@vueuse/core').useTimeoutPoll
const useTimestamp: typeof import('@vueuse/core').useTimestamp
const useTitle: typeof import('@vueuse/core').useTitle
const useToNumber: typeof import('@vueuse/core').useToNumber
const useToString: typeof import('@vueuse/core').useToString
const useToggle: typeof import('@vueuse/core').useToggle
const useTransition: typeof import('@vueuse/core').useTransition
const useUrlSearchParams: typeof import('@vueuse/core').useUrlSearchParams
const useUserMedia: typeof import('@vueuse/core').useUserMedia
const useVModel: typeof import('@vueuse/core').useVModel
const useVModels: typeof import('@vueuse/core').useVModels
const useVibrate: typeof import('@vueuse/core').useVibrate
const useVirtualList: typeof import('@vueuse/core').useVirtualList
const useWakeLock: typeof import('@vueuse/core').useWakeLock
const useWebNotification: typeof import('@vueuse/core').useWebNotification
const useWebSocket: typeof import('@vueuse/core').useWebSocket
const useWebWorker: typeof import('@vueuse/core').useWebWorker
const useWebWorkerFn: typeof import('@vueuse/core').useWebWorkerFn
const useWindowFocus: typeof import('@vueuse/core').useWindowFocus
const useWindowScroll: typeof import('@vueuse/core').useWindowScroll
const useWindowSize: typeof import('@vueuse/core').useWindowSize
const watch: typeof import('vue').watch
const watchArray: typeof import('@vueuse/core').watchArray
const watchAtMost: typeof import('@vueuse/core').watchAtMost
const watchDebounced: typeof import('@vueuse/core').watchDebounced
const watchDeep: typeof import('@vueuse/core').watchDeep
const watchEffect: typeof import('vue').watchEffect
const watchIgnorable: typeof import('@vueuse/core').watchIgnorable
const watchImmediate: typeof import('@vueuse/core').watchImmediate
const watchOnce: typeof import('@vueuse/core').watchOnce
const watchPausable: typeof import('@vueuse/core').watchPausable
const watchPostEffect: typeof import('vue').watchPostEffect
const watchSyncEffect: typeof import('vue').watchSyncEffect
const watchThrottled: typeof import('@vueuse/core').watchThrottled
const watchTriggerable: typeof import('@vueuse/core').watchTriggerable
const watchWithFilter: typeof import('@vueuse/core').watchWithFilter
const whenever: typeof import('@vueuse/core').whenever
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
import('vue')
}