@uni-helper/vite-plugin-uni-pages 0.3.24 → 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 +145 -65
- package/client.d.ts +1 -1
- package/dist/chunk-B4FMCO8f.mjs +28 -0
- package/dist/index.cjs +1274 -1142
- package/dist/index.d.cts +440 -3150
- package/dist/index.d.mts +440 -3150
- package/dist/index.mjs +1217 -1099
- package/package.json +23 -23
- package/dist/index.d.ts +0 -3220
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
|
-
|
|
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
|
-
##
|
|
9
|
+
## 安装
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
pnpm i -D @uni-helper/vite-plugin-uni-pages
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
##
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
59
|
+
在 [这里](../../playground/pages.config.ts),你可以找到 `uni-app` 默认的 Vite-TS 模版的 `pages.json` 是如何用 TypeScript 编写的。
|
|
60
|
+
|
|
61
|
+
## 插件配置
|
|
84
62
|
|
|
85
63
|
```ts
|
|
86
|
-
|
|
64
|
+
interface UserOptions {
|
|
87
65
|
/**
|
|
88
|
-
*
|
|
66
|
+
* 生成页面路径的 TypeScript 类型声明
|
|
67
|
+
* 为 true 时在项目根目录生成 uni-pages.d.ts
|
|
68
|
+
* 为 string 时作为自定义输出路径(相对于项目根目录)
|
|
89
69
|
* @default true
|
|
90
70
|
*/
|
|
91
|
-
|
|
71
|
+
dts?: boolean | string
|
|
92
72
|
|
|
93
73
|
/**
|
|
94
|
-
*
|
|
95
|
-
*
|
|
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
|
-
|
|
94
|
+
mergePages?: boolean
|
|
98
95
|
|
|
99
96
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
97
|
+
* 主包页面的搜索目录
|
|
98
|
+
* 支持 glob 模式,如 'src/{pages,views}'
|
|
99
|
+
* 最终结果由 tinyglobby 解析为匹配的目录列表
|
|
100
|
+
* @default 'src/pages'
|
|
102
101
|
*/
|
|
103
|
-
|
|
102
|
+
dir?: string
|
|
104
103
|
|
|
105
104
|
/**
|
|
106
|
-
*
|
|
105
|
+
* 分包页面目录的根目录列表
|
|
106
|
+
* 用于 uni-app 的分包加载功能
|
|
107
107
|
* @default []
|
|
108
108
|
*/
|
|
109
|
-
|
|
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
|
-
*
|
|
113
|
-
*
|
|
132
|
+
* 启用调试日志
|
|
133
|
+
* 为 true 时启用所有分类;为字符串时仅启用特定分类
|
|
134
|
+
* 可选分类:hmr | options | pages | subPages | error | cache | declaration | definePage
|
|
135
|
+
* 也可通过环境变量 DEBUG=vite-plugin-uni-pages:* 控制
|
|
136
|
+
* @default false
|
|
114
137
|
*/
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
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
|
|
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/
|
|
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 };
|