@uni-helper/vite-plugin-uni-pages 0.3.23 → 0.4.0

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
@@ -1,23 +1,23 @@
1
1
  # @uni-helper/vite-plugin-uni-pages
2
2
 
3
- File system-based routing for uni-app applications using Vite.
4
-
5
3
  <a href="https://www.npmjs.com/package/@uni-helper/vite-plugin-uni-pages"><img src="https://img.shields.io/npm/v/@uni-helper/vite-plugin-uni-pages" alt="NPM version"></a></p>
6
4
 
7
- English | [简体中文](./README.Zh-CN.md)
5
+ 使用 TypeScript 编写 `uni-app` 的 `pages.json`。支持约定式路由。
6
+
7
+ 不想看文档?直接问 AI 🤖 <a href="https://deepwiki.com/uni-helper/vite-plugin-uni-pages"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a> <a href="https://zread.ai/uni-helper/vite-plugin-uni-pages" target="_blank"><img src="https://img.shields.io/badge/Ask_Zread-_.svg?style=flat&color=00b0aa&labelColor=000000&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQuOTYxNTYgMS42MDAxSDIuMjQxNTZDMS44ODgxIDEuNjAwMSAxLjYwMTU2IDEuODg2NjQgMS42MDE1NiAyLjI0MDFWNC45NjAxQzEuNjAxNTYgNS4zMTM1NiAxLjg4ODEgNS42MDAxIDIuMjQxNTYgNS42MDAxSDQuOTYxNTZDNS4zMTUwMiA1LjYwMDEgNS42MDE1NiA1LjMxMzU2IDUuNjAxNTYgNC45NjAxVjIuMjQwMUM1LjYwMTU2IDEuODg2NjQgNS4zMTUwMiAxLjYwMDEgNC45NjE1NiAxLjYwMDFaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00Ljk2MTU2IDEwLjM5OTlIMi4yNDE1NkMxLjg4ODEgMTAuMzk5OSAxLjYwMTU2IDEwLjY4NjQgMS42MDE1NiAxMS4wMzk5VjEzLjc1OTlDMS42MDE1NiAxNC4xMTM0IDEuODg4MSAxNC4zOTk5IDIuMjQxNTYgMTQuMzk5OUg0Ljk2MTU2QzUuMzE1MDIgMTQuMzk5OSA1LjYwMTU2IDE0LjExMzQgNS42MDE1NiAxMy43NTk5VjExLjAzOTlDNS42MDE1NiAxMC42ODY0IDUuMzE1MDIgMTAuMzk5OSA0Ljk2MTU2IDEwLjM5OTlaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik0xMy43NTg0IDEuNjAwMUgxMS4wMzg0QzEwLjY4NSAxLjYwMDEgMTAuMzk4NCAxLjg4NjY0IDEwLjM5ODQgMi4yNDAxVjQuOTYwMUMxMC4zOTg0IDUuMzEzNTYgMTAuNjg1IDUuNjAwMSAxMS4wMzg0IDUuNjAwMUgxMy43NTg0QzE0LjExMTkgNS42MDAxIDE0LjM5ODQgNS4zMTM1NiAxNC4zOTg0IDQuOTYwMVYyLjI0MDFDMTQuMzk4NCAxLjg4NjY0IDE0LjExMTkgMS42MDAxIDEzLjc1ODQgMS42MDAxWiIgZmlsbD0iI2ZmZiIvPgo8cGF0aCBkPSJNNCAxMkwxMiA0TDQgMTJaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00IDEyTDEyIDQiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K&logoColor=ffffff" alt="zread"/></a>
8
8
 
9
- ## Installation
9
+ ## 安装
10
10
 
11
11
  ```bash
12
12
  pnpm i -D @uni-helper/vite-plugin-uni-pages
13
13
  ```
14
14
 
15
- ## Usage
15
+ ## 使用
16
16
 
17
17
  ```ts
18
+ // vite.config.ts
18
19
  import Uni from '@dcloudio/vite-plugin-uni'
19
20
  import UniPages from '@uni-helper/vite-plugin-uni-pages'
20
- // vite.config.ts
21
21
  import { defineConfig } from 'vite'
22
22
 
23
23
  // It is recommended to put it in front of Uni
@@ -26,15 +26,20 @@ export default defineConfig({
26
26
  })
27
27
  ```
28
28
 
29
- Define global properties in `pages.config.(ts|mts|cts|js|cjs|mjs|json)`, You can use like `#ifdef H5` in the file.
29
+ 创建 `pages.config.(ts|mts|cts|js|cjs|mjs|json)`,然后用 TypeScript 编写你的 `pages.json`。你可以在创建的文件里使用 `#ifdef H5` 等条件编译语句。
30
30
 
31
31
  ```ts
32
32
  // pages.config.ts
33
33
  import { defineUniPages } from '@uni-helper/vite-plugin-uni-pages'
34
34
 
35
35
  export default defineUniPages({
36
- // You can also define pages fields, which have the highest priority.priority.
37
- pages: [],
36
+ // 你可以手动指定 pages,这种做法具有最高优先级,插件会使用你指定的 pages 生成 pages.json。
37
+ // 如果不手动指定 pages,插件会自动扫描页面并生成 pages.json。
38
+ // pages: [],
39
+
40
+ // 其它属性参考 pages.json,理论上一比一对齐
41
+ // 如果发现没有对齐,请提交 issue,谢谢 🙏
42
+ // https://uniapp.dcloud.net.cn/collocation/pages.html
38
43
  globalStyle: {
39
44
  navigationBarTextStyle: 'black',
40
45
  navigationBarTitleText: '@uni-helper',
@@ -42,36 +47,7 @@ export default defineUniPages({
42
47
  })
43
48
  ```
44
49
 
45
- Now all pages will be found automatically!
46
-
47
- ### SFC custom block for Route Data
48
-
49
- Add route meta to the route by adding a `<route>` block to the SFC. This will be
50
- directly added to the route after it is generated, and will override it.
51
-
52
- You can specify a parser to use using `<route lang="yaml">`, or set a default
53
- parser using `routeBlockLang` option.
54
-
55
- - **Supported parser:** JSON, JSON5, YAML
56
- - **Default:** JSON5
57
-
58
- ```html
59
- <!-- index.vue -->
60
- <!-- use type to set index -->
61
- <route type="home">
62
- {
63
- "style": { "navigationBarTitleText": "@uni-helper" }
64
- }
65
- </route>
66
-
67
- <!-- other.vue -->
68
- <route lang="yaml">
69
- style:
70
- navigationBarTitleText: "@uni-helper"
71
- </route>
72
- ```
73
-
74
- Import the virtual module to access the metadata of all pages
50
+ 你也可以导入 [虚拟模块](https://v5.vite.dev/guide/api-plugin.html#virtual-modules-convention) 来访问所有页面的元数据。
75
51
 
76
52
  ```ts
77
53
  /// <reference types="@uni-helper/vite-plugin-uni-pages/client" />
@@ -80,51 +56,155 @@ import { pages } from 'virtual:uni-pages'
80
56
  console.log(pages)
81
57
  ```
82
58
 
83
- ## Configuration
59
+ 在 [这里](../../playground/pages.config.ts),你可以找到 `uni-app` 默认的 Vite-TS 模版的 `pages.json` 是如何用 TypeScript 编写的。
60
+
61
+ ## 插件配置
84
62
 
85
63
  ```ts
86
- export interface Options {
64
+ interface UserOptions {
87
65
  /**
88
- * Whether to scan and merge pages in pages.json
66
+ * 生成页面路径的 TypeScript 类型声明
67
+ * 为 true 时在项目根目录生成 uni-pages.d.ts
68
+ * 为 string 时作为自定义输出路径(相对于项目根目录)
89
69
  * @default true
90
70
  */
91
- mergePages: boolean
71
+ dts?: boolean | string
92
72
 
93
73
  /**
94
- * Paths to the directory to search for page components.
95
- * @default 'src/pages'
74
+ * 页面配置文件的加载源
75
+ * 基于 unconfig,支持多配置源合并
76
+ * 默认为 pages.config,支持 ts/mts/cts/js/cjs/mjs/json 等后缀
77
+ * @default 'pages.config'
78
+ */
79
+ configSource?: ConfigSource
80
+
81
+ /**
82
+ * 默认应用入口页面(首页)
83
+ * 当没有页面通过 definePage({ type: 'home' }) 标记为首页时使用
84
+ * 支持多个路径样式以兼容不同的目录结构
85
+ * @default 'pages/index' 或 'pages/index/index'
86
+ */
87
+ homePage?: string
88
+
89
+ /**
90
+ * 是否自动扫描目录并合并页面配置到 pages.json
91
+ * 关闭后仅加载用户配置文件,不扫描文件系统
92
+ * @default true
96
93
  */
97
- dir: string
94
+ mergePages?: boolean
98
95
 
99
96
  /**
100
- * pages.json dir
101
- * @default "src"
97
+ * 主包页面的搜索目录
98
+ * 支持 glob 模式,如 'src/{pages,views}'
99
+ * 最终结果由 tinyglobby 解析为匹配的目录列表
100
+ * @default 'src/pages'
102
101
  */
103
- outDir: string
102
+ dir?: string
104
103
 
105
104
  /**
106
- * exclude page
105
+ * 分包页面目录的根目录列表
106
+ * 用于 uni-app 的分包加载功能
107
107
  * @default []
108
108
  */
109
- exclude: string[]
109
+ subPackages?: string[]
110
+
111
+ /**
112
+ * pages.json 所在目录
113
+ * 相对于项目根目录,也是计算页面相对路径的基准
114
+ * @default 'src'
115
+ */
116
+ outDir?: string
117
+
118
+ /**
119
+ * 排除的文件/目录模式
120
+ * 基于 tinyglobby 的 ignore 选项
121
+ * @default ['node_modules', '.git', '**/__*__/**']
122
+ */
123
+ exclude?: string[]
124
+
125
+ /**
126
+ * 是否压缩生成的 pages.json
127
+ * @default false
128
+ */
129
+ minify?: boolean
110
130
 
111
131
  /**
112
- * Set the default route block parser, or use `<route lang="xxx">` in SFC route block
113
- * @default 'json5'
132
+ * 启用调试日志
133
+ * 为 true 时启用所有分类;为字符串时仅启用特定分类
134
+ * 可选分类:hmr | options | pages | subPages | error | cache | declaration | definePage
135
+ * 也可通过环境变量 DEBUG=vite-plugin-uni-pages:* 控制
136
+ * @default false
114
137
  */
115
- routeBlockLang: 'json5' | 'jsonc' | 'json' | 'yaml' | 'yml'
116
-
117
- onBeforeLoadUserConfig: (ctx: PageContext) => void
118
- onAfterLoadUserConfig: (ctx: PageContext) => void
119
- onBeforeScanPages: (ctx: PageContext) => void
120
- onAfterScanPages: (ctx: PageContext) => void
121
- onBeforeMergePageMetaData: (ctx: PageContext) => void
122
- onAfterMergePageMetaData: (ctx: PageContext) => void
123
- onBeforeWriteFile: (ctx: PageContext) => void
124
- onAfterWriteFile: (ctx: PageContext) => void
138
+ debug?: boolean | debugType
139
+
140
+ // 生命周期钩子,在每个阶段完成后触发,接收 PageContext 实例
141
+ onBeforeLoadUserConfig?: (ctx: PageContext) => void
142
+ onAfterLoadUserConfig?: (ctx: PageContext) => void
143
+ onBeforeScanPages?: (ctx: PageContext) => void
144
+ onAfterScanPages?: (ctx: PageContext) => void
145
+ onBeforeMergePageMetaData?: (ctx: PageContext) => void
146
+ onAfterMergePageMetaData?: (ctx: PageContext) => void
147
+ onBeforeWriteFile?: (ctx: PageContext) => void
148
+ onAfterWriteFile?: (ctx: PageContext) => void
125
149
  }
126
150
  ```
127
151
 
128
- ## Acknowledgement
152
+ ### 流程说明
153
+
154
+ 插件内部按以下顺序执行生命周期,每个阶段对应一个生命周期钩子:
155
+
156
+ ```
157
+ 加载用户配置 → 扫描页面文件 → 合并页面元数据 → 生成并写入 pages.json
158
+ ```
159
+
160
+ - **加载用户配置**:通过 `unconfig` 加载 `pages.config.ts` 等配置文件,获取手动指定的页面元数据(`pages`、`subPackages`、`globalStyle` 等)
161
+ - **扫描页面文件**(仅在 `mergePages: true` 时):根据 `dir` 和 `subPackages` 扫描文件系统,为每个页面文件创建 `Page` 实例
162
+ - **合并页面元数据**:将扫描到的页面与用户配置中的页面元数据合并
163
+ - **生成并写入**:序列化为 `pages.json`,写入到 `outDir` 目录,并生成 TypeScript 类型声明
164
+
165
+ ### 配置示例
166
+
167
+ ```ts
168
+ // vite.config.ts
169
+ import UniPages from '@uni-helper/vite-plugin-uni-pages'
170
+ import { defineConfig } from 'vite'
171
+
172
+ export default defineConfig({
173
+ plugins: [
174
+ UniPages({
175
+ dts: 'src/typings/uni-pages.d.ts', // 自定义类型声明路径
176
+ dir: 'src/{pages,views}', // 多目录扫描
177
+ subPackages: ['src/sub-package-a', 'src/sub-package-b'],
178
+ exclude: ['node_modules', '.git', '**/__*__/**', '**/components/**'],
179
+ minify: true,
180
+ debug: true, // 或 debug: 'pages'
181
+ onAfterScanPages(ctx) {
182
+ console.log(`扫描到 ${ctx.pages.size} 个主包页面`)
183
+ },
184
+ }),
185
+ ],
186
+ })
187
+ ```
188
+
189
+ ### 完整类型定义
190
+
191
+ 请查看 [types.ts](./src/types.ts) 获取完整定义。
192
+
193
+ ## FAQ
194
+
195
+ ### 这个插件写入配置晚于 uni-app 读取配置
196
+
197
+ 请使用 [@uni-helper/unh](https://uni-helper.cn/unh/auto-generate),或自行编写脚本处理。
198
+
199
+ ### 支持 JSX/TSX 吗?
200
+
201
+ 不支持,只支持 vue/nvue/uvue 文件
202
+
203
+ ### 文件名有限制吗?
204
+
205
+ 文件名内不能带有额外的 `.` 分隔符,如 `index.v1.vue` 不合法。这是小程序的限制,并非本插件的限制。
206
+
207
+ ## 感谢
129
208
 
130
- - [vite-plugin-pages](https://github.com/hannoeru/vite-plugin-pages.git)
209
+ - [hannoeru/vite-plugin-pages](https://github.com/hannoeru/vite-plugin-pages)
210
+ - [uni-ku/pages-json](https://github.com/uni-ku/pages-json)
package/client.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference path="./global.d.ts" />
2
2
 
3
3
  declare module 'virtual:uni-pages' {
4
- import type { SubPackage } from './src/config/types/index'
4
+ import type { SubPackage } from './src/config/index'
5
5
  import type { PageMetaDatum } from './src/types'
6
6
 
7
7
  export const pages: PageMetaDatum[]
@@ -0,0 +1,28 @@
1
+ import "node:module";
2
+ //#region \0rolldown/runtime.js
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __exportAll = (all, no_symbols) => {
8
+ let target = {};
9
+ for (var name in all) __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true
12
+ });
13
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
14
+ return target;
15
+ };
16
+ var __copyProps = (to, from, except, desc) => {
17
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
18
+ key = keys[i];
19
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
20
+ get: ((k) => from[k]).bind(null, key),
21
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
22
+ });
23
+ }
24
+ return to;
25
+ };
26
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
27
+ //#endregion
28
+ export { __reExport as n, __exportAll as t };