@uni-helper/vite-plugin-uni-pages 0.3.24 → 0.4.1

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,194 @@ 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'
96
86
  */
97
- dir: string
87
+ homePage?: string
98
88
 
99
89
  /**
100
- * pages.json dir
101
- * @default "src"
90
+ * 是否自动扫描目录并合并页面配置到 pages.json
91
+ * 关闭后仅加载用户配置文件,不扫描文件系统
92
+ * @default true
102
93
  */
103
- outDir: string
94
+ mergePages?: boolean
104
95
 
105
96
  /**
106
- * exclude page
97
+ * 主包页面的搜索目录
98
+ * 支持 glob 模式,如 'src/{pages,views}'
99
+ * 最终结果由 tinyglobby 解析为匹配的目录列表
100
+ * @default 'src/pages'
101
+ */
102
+ dir?: string
103
+
104
+ /**
105
+ * 分包页面目录的根目录列表
106
+ *
107
+ * 用于 uni-app 的分包加载功能
108
+ *
109
+ * 支持字符串格式(目录路径)或对象格式(自定义 pages.json 中的 root)
110
+ *
111
+ * 更多上下文参考 <https://github.com/uni-helper/vite-plugin-uni-pages/issues/271>
107
112
  * @default []
108
113
  */
109
- exclude: string[]
114
+ subPackages?: (string | { dir: string; root: string })[]
115
+
116
+ /**
117
+ * pages.json 所在目录
118
+ * 相对于项目根目录,也是计算页面相对路径的基准
119
+ * @default 'src'
120
+ */
121
+ outDir?: string
110
122
 
111
123
  /**
112
- * Set the default route block parser, or use `<route lang="xxx">` in SFC route block
113
- * @default 'json5'
124
+ * 排除的文件/目录模式
125
+ * 基于 tinyglobby 的 ignore 选项
126
+ * @default ['node_modules', '.git', '**/__*__/**']
114
127
  */
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
128
+ exclude?: string[]
129
+
130
+ /**
131
+ * 是否压缩生成的 pages.json
132
+ * @default false
133
+ */
134
+ minify?: boolean
135
+
136
+ /**
137
+ * 启用调试日志
138
+ * 为 true 时启用所有分类;为字符串时仅启用特定分类
139
+ * 可选分类:hmr | options | pages | subPages | error | cache | declaration | definePage
140
+ * 也可通过环境变量 DEBUG=vite-plugin-uni-pages:* 控制
141
+ * @default false
142
+ */
143
+ debug?: boolean | debugType
144
+
145
+ // 生命周期钩子,在每个阶段完成后触发,接收 PageContext 实例
146
+ onBeforeLoadUserConfig?: (ctx: PageContext) => void
147
+ onAfterLoadUserConfig?: (ctx: PageContext) => void
148
+ onBeforeScanPages?: (ctx: PageContext) => void
149
+ onAfterScanPages?: (ctx: PageContext) => void
150
+ onBeforeMergePageMetaData?: (ctx: PageContext) => void
151
+ onAfterMergePageMetaData?: (ctx: PageContext) => void
152
+ onBeforeWriteFile?: (ctx: PageContext) => void
153
+ onAfterWriteFile?: (ctx: PageContext) => void
125
154
  }
126
155
  ```
127
156
 
128
- ## Acknowledgement
157
+ ### 流程说明
158
+
159
+ 插件内部按以下顺序执行生命周期,每个阶段对应一个生命周期钩子:
160
+
161
+ ```
162
+ 加载用户配置 → 扫描页面文件 → 合并页面元数据 → 生成并写入 pages.json
163
+ ```
164
+
165
+ - **加载用户配置**:通过 `unconfig` 加载 `pages.config.ts` 等配置文件,获取手动指定的页面元数据(`pages`、`subPackages`、`globalStyle` 等)
166
+ - **扫描页面文件**(仅在 `mergePages: true` 时):根据 `dir` 和 `subPackages` 扫描文件系统,为每个页面文件创建 `Page` 实例
167
+ - **合并页面元数据**:将扫描到的页面与用户配置中的页面元数据合并
168
+ - **生成并写入**:序列化为 `pages.json`,写入到 `outDir` 目录,并生成 TypeScript 类型声明
169
+
170
+ ### 配置示例
171
+
172
+ ```ts
173
+ // vite.config.ts
174
+ import UniPages from '@uni-helper/vite-plugin-uni-pages'
175
+ import { defineConfig } from 'vite'
176
+
177
+ export default defineConfig({
178
+ plugins: [
179
+ UniPages({
180
+ dts: 'src/typings/uni-pages.d.ts', // 自定义类型声明路径
181
+ dir: 'src/{pages,views}', // 多目录扫描
182
+ subPackages: ['src/sub-package-a', 'src/sub-package-b'],
183
+ exclude: ['node_modules', '.git', '**/__*__/**', '**/components/**'],
184
+ minify: true,
185
+ debug: true, // 或 debug: 'pages'
186
+ onAfterScanPages(ctx) {
187
+ console.log(`扫描到 ${ctx.pages.size} 个主包页面`)
188
+ },
189
+ }),
190
+ ],
191
+ })
192
+ ```
193
+
194
+ ### 完整类型定义
195
+
196
+ 请查看 [types.ts](./src/types.ts) 获取完整定义。
197
+
198
+ ## FAQ
199
+
200
+ ### 这个插件写入配置晚于 uni-app 读取配置
201
+
202
+ 请使用 [@uni-helper/unh](https://uni-helper.cn/unh/auto-generate),或自行编写脚本处理。
203
+
204
+ ### 支持 JSX/TSX 吗?
205
+
206
+ 不支持,只支持 vue/nvue/uvue 文件
207
+
208
+ ### 文件名有限制吗?
209
+
210
+ 文件名内不能带有额外的 `.` 分隔符,如 `index.v1.vue` 不合法。这是小程序的限制,并非本插件的限制。
211
+
212
+ ### 支持 monorepo 吗?
213
+
214
+ 在 monorepo 项目中,如果页面分布在多个 package 中,可以使用 `subPackages` 配置的对象格式来自定义生成的 `root` 路径。
215
+
216
+ ```ts
217
+ // vite.config.ts
218
+ import UniPages from '@uni-helper/vite-plugin-uni-pages'
219
+ import { defineConfig } from 'vite'
220
+
221
+ export default defineConfig({
222
+ plugins: [
223
+ UniPages({
224
+ subPackages: [
225
+ // 简写格式(原有功能)
226
+ 'src/pages-sub',
227
+ // 对象格式(monorepo 支持)
228
+ {
229
+ dir: '../../packages/login/src/pages', // 页面目录路径
230
+ root: 'packages/login/src/pages', // 自定义 pages.json 中的 root
231
+ },
232
+ {
233
+ dir: '../../packages/user/src/pages',
234
+ root: 'packages/user/src/pages',
235
+ },
236
+ ],
237
+ }),
238
+ ],
239
+ })
240
+ ```
241
+
242
+ 这样生成的 `pages.json` 中 `subPackages.root` 将使用自定义的值,而不是基于文件系统计算的相对路径,避免出现 `..` 造成路径问题。
243
+
244
+ 更多上下文参考 <https://github.com/uni-helper/vite-plugin-uni-pages/issues/271>。
245
+
246
+ ## 感谢
129
247
 
130
- - [vite-plugin-pages](https://github.com/hannoeru/vite-plugin-pages.git)
248
+ - [hannoeru/vite-plugin-pages](https://github.com/hannoeru/vite-plugin-pages)
249
+ - [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[]