@univa/core 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -61,7 +61,244 @@ export default defineConfig({
61
61
 
62
62
  ## 功能详解
63
63
 
64
- 待补充...
64
+ ### 自动导入
65
+
66
+ 自动导入 Vue、Pinia、uni-app 等 API,无需手动 import:
67
+
68
+ ```typescript
69
+ // 无需 import,直接使用
70
+ const count = ref(0)
71
+ const router = useRouter()
72
+ const store = useStore()
73
+ ```
74
+
75
+ **自动扫描目录**:
76
+ - `src/hooks/**` - 自动导入 hooks
77
+ - `src/store/**` - 自动导入 store
78
+ - `src/constants/**` - 自动导入常量
79
+
80
+ ### 组件自动注册
81
+
82
+ 自动注册 `components` 目录下的组件,无需手动 import:
83
+
84
+ ```
85
+ src/
86
+ ├── components/
87
+ │ ├── MyButton.vue
88
+ │ └── common/
89
+ │ └── Icon.vue
90
+ └── components-biz/
91
+ └── Card.vue
92
+ ```
93
+
94
+ 在页面中直接使用:
95
+
96
+ ```vue
97
+ <template>
98
+ <MyButton />
99
+ <Icon />
100
+ <BizCard />
101
+ </template>
102
+ ```
103
+
104
+ **特性**:
105
+ - `components/` 和 `common/` 是全局命名空间,不添加前缀
106
+ - `components-biz/` 会自动添加 `Biz` 命名空间前缀
107
+ - 自动生成类型声明文件
108
+
109
+ ### 页面管理
110
+
111
+ #### 定义页面配置
112
+
113
+ **方式 1:在 pages.config.ts 中定义**
114
+
115
+ ```typescript
116
+ // pages.config.ts
117
+ import { definePagesConfig } from '@univa/core'
118
+
119
+ export default definePagesConfig({
120
+ tabBarMode: 'CUSTOM', // 'NONE' | 'NATIVE' | 'CUSTOM'
121
+ tabBar: {
122
+ list: [
123
+ {
124
+ pagePath: 'pages/index',
125
+ text: '首页',
126
+ iconPath: 'images/tabbar/home.png',
127
+ selectedIconPath: 'images/tabbar/home_selected.png',
128
+ },
129
+ ],
130
+ },
131
+ })
132
+ ```
133
+
134
+ **方式 2:在 vite.config.ts 中直接定义**
135
+
136
+ ```typescript
137
+ // vite.config.ts
138
+ import { Univa } from '@univa/core'
139
+ import { defineConfig } from 'vite'
140
+
141
+ export default defineConfig({
142
+ plugins: [
143
+ Univa({
144
+ pages: {
145
+ config: {
146
+ tabBarMode: 'CUSTOM',
147
+ tabBar: {
148
+ list: [...],
149
+ },
150
+ },
151
+ },
152
+ }),
153
+ ],
154
+ })
155
+ ```
156
+
157
+ #### 获取 TabBar 配置
158
+
159
+ 在组件中获取 tabBar 配置:
160
+
161
+ ```typescript
162
+ import tabBar from 'virtual:univa-tabbar'
163
+
164
+ if (tabBar) {
165
+ console.log(tabBar.list) // TabBar 列表
166
+ }
167
+ ```
168
+
169
+ ### UnoCSS 预设
170
+
171
+ 内置 UnoCSS 预设,提供开箱即用的原子化 CSS:
172
+
173
+ **内置预设**:
174
+ - `presetUni()` - uni-app 专属预设
175
+ - `presetIcons()` - 图标预设(scale: 1.2)
176
+ - `presetLegacyCompat()` - 兼容性预设(处理低端安卓机)
177
+
178
+ **内置快捷方式**:
179
+ ```typescript
180
+ 'border-s' // border border-solid
181
+ 'wh-full' // w-full h-full
182
+ 'f-c-c' // flex justify-center items-center
183
+ 'f-col-c' // flex-col justify-center items-center
184
+ 'flex-items' // flex items-center
185
+ 'flex-justify' // flex justify-center
186
+ 'flex-col' // flex flex-col
187
+ ```
188
+
189
+ **安全区域规则**:
190
+ ```html
191
+ <div class="p-safe">安全区域内边距</div>
192
+ <div class="pt-safe">顶部安全区域</div>
193
+ <div class="pb-safe">底部安全区域</div>
194
+ ```
195
+
196
+ ### 根组件
197
+
198
+ 自动创建和管理 `App.univa.vue` 根组件:
199
+
200
+ ```vue
201
+ <script setup lang="ts">
202
+ </script>
203
+
204
+ <template>
205
+ <UnivaPageMeta background-color="#ff0000" page-style="color: green" />
206
+ <view class="container">
207
+ <UnivaRootView />
208
+ </view>
209
+ </template>
210
+ ```
211
+
212
+ **特性**:
213
+ - 自动创建根组件文件
214
+ - 支持虚拟节点(`virtualHost`)
215
+ - 支持全局 ref
216
+ - 支持 `<UnivaPageMeta>` 组件配置页面元信息
217
+ - 支持 `<UnivaRootView />` 组件作为根视图
218
+
219
+ ### Manifest 配置
220
+
221
+ 在 `vite.config.ts` 中直接配置 manifest:
222
+
223
+ ```typescript
224
+ import { Univa } from '@univa/core'
225
+ import { defineConfig } from 'vite'
226
+
227
+ export default defineConfig({
228
+ plugins: [
229
+ Univa({
230
+ manifest: {
231
+ name: 'my-app',
232
+ appid: '__UNI__XXXXXX',
233
+ description: 'My Application',
234
+ versionName: '1.0.0',
235
+ versionCode: '100',
236
+ },
237
+ }),
238
+ ],
239
+ })
240
+ ```
241
+
242
+ ## 配置选项
243
+
244
+ ```typescript
245
+ import type { UnivaUserConfig } from '@univa/core'
246
+
247
+ const config: UnivaUserConfig = {
248
+ // 自动导入配置(默认 true)
249
+ autoImport: true,
250
+
251
+ // 组件自动注册配置(默认 true)
252
+ components: true,
253
+
254
+ // 页面配置
255
+ pages: {
256
+ config: {
257
+ // TabBar 模式:'NONE' | 'NATIVE' | 'CUSTOM'
258
+ tabBarMode: 'NATIVE',
259
+ tabBar: {
260
+ color: '#A6A6A6',
261
+ selectedColor: '#003594',
262
+ list: [
263
+ {
264
+ pagePath: 'pages/index',
265
+ text: '首页',
266
+ iconPath: 'images/tabbar/home.png',
267
+ selectedIconPath: 'images/tabbar/home_selected.png',
268
+ },
269
+ ],
270
+ },
271
+ // 全局样式配置
272
+ globalStyle: {
273
+ navigationBarBackgroundColor: '#000000',
274
+ navigationBarTextStyle: 'black',
275
+ navigationBarTitleText: 'My App',
276
+ navigationStyle: 'custom',
277
+ enablePullDownRefresh: false,
278
+ onReachBottomDistance: 50,
279
+ animationType: 'pop-in',
280
+ animationDuration: 300,
281
+ },
282
+ },
283
+ // 排除的页面
284
+ exclude: ['pages/exclude/**'],
285
+ // 分包配置
286
+ subPackages: ['pages-sub'],
287
+ },
288
+
289
+ // 根组件配置(默认 true)
290
+ appRoot: true,
291
+
292
+ // Manifest 配置
293
+ manifest: {
294
+ name: 'my-app',
295
+ appid: '__UNI__XXXXXX',
296
+ description: 'My Application',
297
+ versionName: '1.0.0',
298
+ versionCode: '100',
299
+ },
300
+ }
301
+ ```
65
302
 
66
303
  ## 依赖
67
304
 
package/dist/hooks.cjs ADDED
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/hooks.ts
21
+ var hooks_exports = {};
22
+ __export(hooks_exports, {
23
+ usePageContext: () => usePageContext
24
+ });
25
+ module.exports = __toCommonJS(hooks_exports);
26
+
27
+ // src/hooks/usePageContext/index.ts
28
+ var import_uni_app = require("@dcloudio/uni-app");
29
+ var import_vue = require("vue");
30
+ function usePageContext(options = {}) {
31
+ const isMounted = (0, import_vue.ref)(false);
32
+ const univaRootRef = (0, import_vue.ref)();
33
+ const scrollTop = (0, import_vue.ref)(0);
34
+ const mountedCallbacks = [];
35
+ const unmountedCallbacks = [];
36
+ const showAfterMountedCallbacks = [];
37
+ const onPageShowAfterMounted = (callback) => {
38
+ showAfterMountedCallbacks.push(callback);
39
+ };
40
+ const onPageMounted = (callback) => {
41
+ mountedCallbacks.push(callback);
42
+ };
43
+ const onPageUnmounted = (callback) => {
44
+ unmountedCallbacks.push(callback);
45
+ };
46
+ (0, import_uni_app.onShow)(() => {
47
+ if (isMounted.value) {
48
+ showAfterMountedCallbacks.forEach((cb) => cb());
49
+ }
50
+ });
51
+ (0, import_uni_app.onPageScroll)((e) => {
52
+ scrollTop.value = e.scrollTop;
53
+ });
54
+ (0, import_vue.onMounted)(() => {
55
+ const pagesStack = getCurrentPages();
56
+ const pageStack = pagesStack[pagesStack.length - 1];
57
+ if (!pageStack?.$vm?.$refs?.univaRootRef) {
58
+ throw new Error('[usePageContext] univaRootRef not found. Make sure the page has <univa-root ref="univaRootRef" /> component.');
59
+ }
60
+ univaRootRef.value = pageStack.$vm.$refs.univaRootRef;
61
+ isMounted.value = true;
62
+ mountedCallbacks.forEach((cb) => cb());
63
+ });
64
+ (0, import_vue.onUnmounted)(() => {
65
+ isMounted.value = false;
66
+ unmountedCallbacks.forEach((cb) => cb());
67
+ mountedCallbacks.length = 0;
68
+ unmountedCallbacks.length = 0;
69
+ showAfterMountedCallbacks.length = 0;
70
+ });
71
+ return {
72
+ isMounted,
73
+ univaRootRef,
74
+ scrollTop: (0, import_vue.computed)(() => scrollTop.value),
75
+ onPageMounted,
76
+ onPageUnmounted,
77
+ onPageShowAfterMounted
78
+ };
79
+ }
80
+ // Annotate the CommonJS export names for ESM import in node:
81
+ 0 && (module.exports = {
82
+ usePageContext
83
+ });
@@ -0,0 +1,36 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+
3
+ interface PageContextOptions {
4
+ /**
5
+ * uniapp 必须在页面内检测到 onPageScroll 关键词才会注册事件。
6
+ * @see https://github.com/dcloudio/uni-app/issues/3099 让页面被正则捕获从而开启监听
7
+ */
8
+ onPageScroll?: any;
9
+ }
10
+ interface PageContext {
11
+ isMounted: Ref<boolean>;
12
+ univaRootRef: Ref<any>;
13
+ scrollTop: ComputedRef<number>;
14
+ /**
15
+ * 页面挂载成功时执行
16
+ * @param callback
17
+ * @returns
18
+ */
19
+ onPageMounted: (callback: () => void) => void;
20
+ /**
21
+ * 页面卸载时执行
22
+ * @param callback
23
+ * @returns
24
+ */
25
+ onPageUnmounted: (callback: () => void) => void;
26
+ /**
27
+ * 页面挂载成功后的每次显示时执行
28
+ * @param callback
29
+ * @returns
30
+ */
31
+ onPageShowAfterMounted: (callback: () => void) => void;
32
+ }
33
+
34
+ declare function usePageContext(options?: PageContextOptions): PageContext;
35
+
36
+ export { usePageContext };
@@ -0,0 +1,36 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+
3
+ interface PageContextOptions {
4
+ /**
5
+ * uniapp 必须在页面内检测到 onPageScroll 关键词才会注册事件。
6
+ * @see https://github.com/dcloudio/uni-app/issues/3099 让页面被正则捕获从而开启监听
7
+ */
8
+ onPageScroll?: any;
9
+ }
10
+ interface PageContext {
11
+ isMounted: Ref<boolean>;
12
+ univaRootRef: Ref<any>;
13
+ scrollTop: ComputedRef<number>;
14
+ /**
15
+ * 页面挂载成功时执行
16
+ * @param callback
17
+ * @returns
18
+ */
19
+ onPageMounted: (callback: () => void) => void;
20
+ /**
21
+ * 页面卸载时执行
22
+ * @param callback
23
+ * @returns
24
+ */
25
+ onPageUnmounted: (callback: () => void) => void;
26
+ /**
27
+ * 页面挂载成功后的每次显示时执行
28
+ * @param callback
29
+ * @returns
30
+ */
31
+ onPageShowAfterMounted: (callback: () => void) => void;
32
+ }
33
+
34
+ declare function usePageContext(options?: PageContextOptions): PageContext;
35
+
36
+ export { usePageContext };
package/dist/hooks.js ADDED
@@ -0,0 +1,56 @@
1
+ // src/hooks/usePageContext/index.ts
2
+ import { onPageScroll, onShow } from "@dcloudio/uni-app";
3
+ import { computed, onMounted, onUnmounted, ref } from "vue";
4
+ function usePageContext(options = {}) {
5
+ const isMounted = ref(false);
6
+ const univaRootRef = ref();
7
+ const scrollTop = ref(0);
8
+ const mountedCallbacks = [];
9
+ const unmountedCallbacks = [];
10
+ const showAfterMountedCallbacks = [];
11
+ const onPageShowAfterMounted = (callback) => {
12
+ showAfterMountedCallbacks.push(callback);
13
+ };
14
+ const onPageMounted = (callback) => {
15
+ mountedCallbacks.push(callback);
16
+ };
17
+ const onPageUnmounted = (callback) => {
18
+ unmountedCallbacks.push(callback);
19
+ };
20
+ onShow(() => {
21
+ if (isMounted.value) {
22
+ showAfterMountedCallbacks.forEach((cb) => cb());
23
+ }
24
+ });
25
+ onPageScroll((e) => {
26
+ scrollTop.value = e.scrollTop;
27
+ });
28
+ onMounted(() => {
29
+ const pagesStack = getCurrentPages();
30
+ const pageStack = pagesStack[pagesStack.length - 1];
31
+ if (!pageStack?.$vm?.$refs?.univaRootRef) {
32
+ throw new Error('[usePageContext] univaRootRef not found. Make sure the page has <univa-root ref="univaRootRef" /> component.');
33
+ }
34
+ univaRootRef.value = pageStack.$vm.$refs.univaRootRef;
35
+ isMounted.value = true;
36
+ mountedCallbacks.forEach((cb) => cb());
37
+ });
38
+ onUnmounted(() => {
39
+ isMounted.value = false;
40
+ unmountedCallbacks.forEach((cb) => cb());
41
+ mountedCallbacks.length = 0;
42
+ unmountedCallbacks.length = 0;
43
+ showAfterMountedCallbacks.length = 0;
44
+ });
45
+ return {
46
+ isMounted,
47
+ univaRootRef,
48
+ scrollTop: computed(() => scrollTop.value),
49
+ onPageMounted,
50
+ onPageUnmounted,
51
+ onPageShowAfterMounted
52
+ };
53
+ }
54
+ export {
55
+ usePageContext
56
+ };
package/dist/index.cjs CHANGED
@@ -56,7 +56,11 @@ function createAutoImportPlugin(options) {
56
56
  imports: [
57
57
  "vue",
58
58
  "pinia",
59
- "uni-app"
59
+ "uni-app",
60
+ {
61
+ from: "@univa/core/hooks",
62
+ imports: ["usePageContext"]
63
+ }
60
64
  ],
61
65
  dirs: [
62
66
  "src/hooks/**",
package/dist/index.js CHANGED
@@ -16,7 +16,11 @@ function createAutoImportPlugin(options) {
16
16
  imports: [
17
17
  "vue",
18
18
  "pinia",
19
- "uni-app"
19
+ "uni-app",
20
+ {
21
+ from: "@univa/core/hooks",
22
+ imports: ["usePageContext"]
23
+ }
20
24
  ],
21
25
  dirs: [
22
26
  "src/hooks/**",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@univa/core",
3
3
  "type": "module",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "description": "",
6
6
  "author": "",
7
7
  "license": "MIT",
@@ -17,6 +17,16 @@
17
17
  "default": "./dist/index.cjs"
18
18
  }
19
19
  },
20
+ "./hooks": {
21
+ "import": {
22
+ "types": "./dist/hooks.d.ts",
23
+ "default": "./dist/hooks.js"
24
+ },
25
+ "require": {
26
+ "types": "./dist/hooks.d.cts",
27
+ "default": "./dist/hooks.cjs"
28
+ }
29
+ },
20
30
  "./client": {
21
31
  "types": "./src/client.d.ts"
22
32
  }
@@ -38,9 +48,15 @@
38
48
  "build": "tsup",
39
49
  "dev": "tsup --watch"
40
50
  },
51
+ "peerDependencies": {
52
+ "@dcloudio/uni-app": "^3.0.0-3090920231225001",
53
+ "vite": "^5.2.8",
54
+ "vue": "^3.4.21"
55
+ },
41
56
  "dependencies": {
42
57
  "@uni-helper/eslint-config": "0.7.3",
43
58
  "@uni-helper/plugin-uni": "0.1.0",
59
+ "@uni-helper/uni-types": "1.0.0-alpha.8",
44
60
  "@uni-helper/unocss-preset-uni": "0.2.11",
45
61
  "@uni-helper/vite-plugin-uni-components": "0.2.10",
46
62
  "@uni-helper/vite-plugin-uni-layouts": "0.1.11",
@@ -48,18 +64,21 @@
48
64
  "@uni-ku/bundle-optimizer": "2.1.2",
49
65
  "@univa/manifest": "^0.0.1",
50
66
  "@univa/root": "^0.0.1",
67
+ "@univa/tsconfig": "^0.0.2",
51
68
  "@unocss/eslint-plugin": "66.6.7",
52
69
  "@unocss/preset-legacy-compat": "66.0.0",
53
70
  "eslint": "10.3.0",
54
71
  "sass": "1.99.0",
55
72
  "unocss": "66.0.0",
56
- "unplugin-auto-import": "21.0.0",
73
+ "unplugin-auto-import": "20.0.0",
57
74
  "vite-plugin-uni-polyfill": "0.1.0"
58
75
  },
59
76
  "devDependencies": {
60
- "c12": "4.0.0-beta.4",
61
- "tsup": "^8.5.1",
77
+ "@dcloudio/uni-app": "^3.0.0-3090920231225001",
78
+ "c12": "3.3.4",
79
+ "tsup": "8.5.1",
62
80
  "typescript": "^5.4.0",
63
- "vite": "5.2.8"
81
+ "vite": "5.2.8",
82
+ "vue": "^3.4.21"
64
83
  }
65
84
  }
package/src/client.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  /// <reference path="./global.d.ts" />
2
2
  /// <reference types="@uni-helper/vite-plugin-uni-pages/client" />
3
3
  /// <reference types="vite/client" />
4
+ /// <reference types="@uni-ku/bundle-optimizer/client" />
5
+ /// <reference types="@uni-helper/uni-types" />
4
6
 
5
7
  declare module 'virtual:univa-tabbar' {
6
8
  import type { TabBar } from '@uni-helper/vite-plugin-uni-pages'