vitarx-router 4.0.0-beta.26 → 4.0.0-beta.27
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/dist/auto-routes/handleHotUpdate.js +4 -12
- package/dist/core/router/manager.js +4 -0
- package/dist/file-router/index.d.ts +9 -268
- package/dist/file-router/index.js +12 -640
- package/dist/file-router/manager/file-classifier.d.ts +68 -0
- package/dist/file-router/manager/file-classifier.js +63 -0
- package/dist/file-router/manager/file-processor.d.ts +120 -0
- package/dist/file-router/manager/file-processor.js +130 -0
- package/dist/file-router/manager/index.d.ts +136 -0
- package/dist/file-router/manager/index.js +253 -0
- package/dist/file-router/manager/route-updater.d.ts +80 -0
- package/dist/file-router/manager/route-updater.js +223 -0
- package/dist/file-router/manager/scanner.d.ts +13 -0
- package/dist/file-router/manager/scanner.js +143 -0
- package/dist/plugin-vite/plugin.d.ts +1 -1
- package/dist/plugin-vite/plugin.js +10 -6
- package/package.json +2 -2
|
@@ -32,9 +32,10 @@
|
|
|
32
32
|
*/
|
|
33
33
|
export function handleHotUpdate(router, onRoutesUpdated) {
|
|
34
34
|
if (import.meta.hot) {
|
|
35
|
-
import.meta.hot.
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
import.meta.hot.on('vitarx-router:routes-change', async () => {
|
|
36
|
+
const modules = await import('virtual:vitarx-router:routes');
|
|
37
|
+
const routes = modules.default;
|
|
38
|
+
if (routes && typeof routes === 'object') {
|
|
38
39
|
router.manager.clearRoutes();
|
|
39
40
|
for (const route of routes) {
|
|
40
41
|
router.manager.addRoute(route);
|
|
@@ -43,15 +44,6 @@ export function handleHotUpdate(router, onRoutesUpdated) {
|
|
|
43
44
|
if (onRoutesUpdated) {
|
|
44
45
|
onRoutesUpdated(routes);
|
|
45
46
|
}
|
|
46
|
-
// 强制重新导航到当前路由,跳过重复检查
|
|
47
|
-
router
|
|
48
|
-
.replace({
|
|
49
|
-
index: router.route.matched.at(-1)?.name || router.route.path,
|
|
50
|
-
params: { ...router.route.params },
|
|
51
|
-
query: { ...router.route.query },
|
|
52
|
-
hash: router.route.hash
|
|
53
|
-
})
|
|
54
|
-
.then();
|
|
55
47
|
}
|
|
56
48
|
});
|
|
57
49
|
}
|
|
@@ -1,277 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview 文件路由模块入口
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 统一导出文件路由系统的公共 API。
|
|
5
|
+
* 核心实现位于 manager/ 目录,按职责拆分为:
|
|
6
|
+
* - file-classifier: 文件分类(页面/布局/配置/忽略)
|
|
7
|
+
* - file-processor: 文件处理(配置解析、布局注册、页面路由创建)
|
|
8
|
+
* - scanner: 目录扫描(递归扫描文件系统,构建路由树)
|
|
9
|
+
* - route-updater: 增量更新(添加/移除/更新路由,支持 HMR)
|
|
10
|
+
* - manager/index.ts: 编排层(FileRouter 类,组合上述模块)
|
|
6
11
|
*/
|
|
7
|
-
import type { GeneratorResult } from '@babel/generator';
|
|
8
|
-
import { ResolvedConfig } from './config/index.js';
|
|
9
|
-
import { type GenerateResult } from './generator/index.js';
|
|
10
|
-
import { type FilterOptions } from './parser/index.js';
|
|
11
|
-
import type { FileRouterOptions, ScanNode } from './types/index.js';
|
|
12
12
|
export { resolvePageConfigs } from './config/resolve.js';
|
|
13
13
|
export * from './generator/index.js';
|
|
14
14
|
export { mergePageOptions } from './macros/definePage.js';
|
|
15
|
+
export { FileRouter, type FileWatcherEvent } from './manager/index.js';
|
|
15
16
|
export type * from './types/index.js';
|
|
16
17
|
export { findRoute } from './utils/findRoute.js';
|
|
17
18
|
export * from './utils/logger.js';
|
|
18
|
-
/**
|
|
19
|
-
* 文件监听器事件类型
|
|
20
|
-
*
|
|
21
|
-
* 对应 chokidar 文件监听器的事件类型
|
|
22
|
-
*/
|
|
23
|
-
export type FileWatcherEvent = 'add' | 'addDir' | 'change' | 'unlink' | 'unlinkDir';
|
|
24
|
-
/**
|
|
25
|
-
* 文件路由管理器
|
|
26
|
-
*/
|
|
27
|
-
export declare class FileRouter {
|
|
28
|
-
#private;
|
|
29
|
-
/**
|
|
30
|
-
* 配置项
|
|
31
|
-
*/
|
|
32
|
-
readonly config: ResolvedConfig;
|
|
33
|
-
/**
|
|
34
|
-
* 创建文件路由管理器
|
|
35
|
-
*
|
|
36
|
-
* @param options - 配置选项
|
|
37
|
-
* @param [init = true] - 是否初始化加载
|
|
38
|
-
*/
|
|
39
|
-
constructor(options?: FileRouterOptions, init?: boolean);
|
|
40
|
-
/**
|
|
41
|
-
* 获取项目根目录
|
|
42
|
-
*/
|
|
43
|
-
get root(): string;
|
|
44
|
-
/**
|
|
45
|
-
* 获取节点树
|
|
46
|
-
*/
|
|
47
|
-
get nodeTree(): ScanNode[];
|
|
48
|
-
/**
|
|
49
|
-
* 获取文件映射表
|
|
50
|
-
*
|
|
51
|
-
* 键为文件或目录路径,值为对应的节点对象
|
|
52
|
-
*/
|
|
53
|
-
get fileMap(): Map<string, ScanNode>;
|
|
54
|
-
/**
|
|
55
|
-
* 加载/重新加载文件路由管理器
|
|
56
|
-
*
|
|
57
|
-
* @returns {FileRouter} 文件路由管理器实例
|
|
58
|
-
*/
|
|
59
|
-
reload(): this;
|
|
60
|
-
/**
|
|
61
|
-
* 构建路由数组
|
|
62
|
-
*
|
|
63
|
-
* @returns 扫描到的页面文件列表
|
|
64
|
-
*/
|
|
65
|
-
protected scanPages(): ScanNode[];
|
|
66
|
-
/**
|
|
67
|
-
* 扫描页面目录
|
|
68
|
-
*
|
|
69
|
-
* @param page - 页面配置
|
|
70
|
-
* @param parent - 父路由
|
|
71
|
-
* @protected
|
|
72
|
-
*/
|
|
73
|
-
private scanPageDir;
|
|
74
|
-
/**
|
|
75
|
-
* 处理目录
|
|
76
|
-
*
|
|
77
|
-
* @param filePath - 目录路径
|
|
78
|
-
* @param fileName - 目录名
|
|
79
|
-
* @param page - 页面配置
|
|
80
|
-
* @param parent - 父节点
|
|
81
|
-
* @private
|
|
82
|
-
*/
|
|
83
|
-
private processDir;
|
|
84
|
-
/**
|
|
85
|
-
* 解析分组目录的自定义路径和选项
|
|
86
|
-
*
|
|
87
|
-
* 通过 groupParser 解析目录名,支持返回字符串路径或包含路径与选项的对象。
|
|
88
|
-
*
|
|
89
|
-
* @param fileName - 目录名
|
|
90
|
-
* @param filePath - 目录完整路径
|
|
91
|
-
* @returns 解析后的路径和选项
|
|
92
|
-
* @private
|
|
93
|
-
*/
|
|
94
|
-
private parseGroupResult;
|
|
95
|
-
/**
|
|
96
|
-
* 处理文件
|
|
97
|
-
*
|
|
98
|
-
* 根据文件类型分发到对应的处理器。
|
|
99
|
-
*
|
|
100
|
-
* @param filePath - 文件路径
|
|
101
|
-
* @param page - 页面配置
|
|
102
|
-
* @param pageMapping - 同路径路由映射
|
|
103
|
-
* @param parent - 父节点
|
|
104
|
-
* @private
|
|
105
|
-
*/
|
|
106
|
-
private processFile;
|
|
107
|
-
/**
|
|
108
|
-
* 解析文件信息与类型
|
|
109
|
-
*
|
|
110
|
-
* 统一入口,避免多处重复调用 extractFileInfo + getPageType。
|
|
111
|
-
*
|
|
112
|
-
* @param filePath - 文件路径
|
|
113
|
-
* @param page - 页面配置
|
|
114
|
-
* @returns 文件信息与类型
|
|
115
|
-
*/
|
|
116
|
-
private resolveFile;
|
|
117
|
-
/**
|
|
118
|
-
* 处理分组配置文件
|
|
119
|
-
*
|
|
120
|
-
* 解析 definePage 宏并合并到父路由选项中。
|
|
121
|
-
*
|
|
122
|
-
* @param filePath - 文件路径
|
|
123
|
-
* @param parent - 父节点
|
|
124
|
-
*/
|
|
125
|
-
private processConfigFile;
|
|
126
|
-
/**
|
|
127
|
-
* 处理分组布局文件
|
|
128
|
-
*
|
|
129
|
-
* 将布局组件注册到父路由的 components 中。
|
|
130
|
-
*
|
|
131
|
-
* @param filePath - 文件路径
|
|
132
|
-
* @param fileInfo - 文件信息
|
|
133
|
-
* @param parent - 父节点
|
|
134
|
-
*/
|
|
135
|
-
private processLayoutFile;
|
|
136
|
-
/**
|
|
137
|
-
* 处理页面文件
|
|
138
|
-
*
|
|
139
|
-
* 解析路由路径、视图命名和页面选项,创建或合并路由节点。
|
|
140
|
-
*
|
|
141
|
-
* @param filePath - 文件路径
|
|
142
|
-
* @param fileInfo - 文件信息
|
|
143
|
-
* @param page - 页面配置
|
|
144
|
-
* @param pageMapping - 同路径路由映射
|
|
145
|
-
* @param parent - 父节点
|
|
146
|
-
* @param [precomputedParsed] - 预计算的解析结果,避免重复调用 parsePageFile
|
|
147
|
-
* @returns 新创建的路由节点,或 null(合并到已有路由时)
|
|
148
|
-
*/
|
|
149
|
-
private processPageFile;
|
|
150
|
-
/**
|
|
151
|
-
* 在已有路由树中查找同路径路由
|
|
152
|
-
*
|
|
153
|
-
* 用于 addPage 场景:新增文件时需要检查是否已存在同路径的路由节点,
|
|
154
|
-
* 以便将命名视图合并到已有路由而非创建重复路由。
|
|
155
|
-
*
|
|
156
|
-
* @param pathKey - 标准化后的路由路径
|
|
157
|
-
* @param prefix - 路径前缀
|
|
158
|
-
* @param parent - 父节点
|
|
159
|
-
* @returns 同路径的路由节点,未找到返回 null
|
|
160
|
-
*/
|
|
161
|
-
private findSameRoute;
|
|
162
|
-
/**
|
|
163
|
-
* 应用路径策略
|
|
164
|
-
*
|
|
165
|
-
* @param path - 路径
|
|
166
|
-
* @protected
|
|
167
|
-
*/
|
|
168
|
-
private applyPathStrategy;
|
|
169
|
-
/**
|
|
170
|
-
* 读取文件内容
|
|
171
|
-
*
|
|
172
|
-
* @param file - 文件绝对路径
|
|
173
|
-
*/
|
|
174
|
-
private readFile;
|
|
175
|
-
/**
|
|
176
|
-
* 获取文件类型
|
|
177
|
-
*
|
|
178
|
-
* @param file - 文件绝对路径
|
|
179
|
-
* @param rawName - 文件名(不含扩展名和 @视图命名)
|
|
180
|
-
* @param pages - 页面配置
|
|
181
|
-
* @returns 文件类型
|
|
182
|
-
*/
|
|
183
|
-
private getPageType;
|
|
184
|
-
/**
|
|
185
|
-
* 检查文件是否为页面文件
|
|
186
|
-
*
|
|
187
|
-
* @param file - 文件绝对路径
|
|
188
|
-
* @param filter - 过滤配置,默认为 `config.pages`
|
|
189
|
-
* @returns {boolean} - 是否为页面文件
|
|
190
|
-
*/
|
|
191
|
-
isPageFile(file: string, filter?: FilterOptions | readonly FilterOptions[]): boolean;
|
|
192
|
-
/**
|
|
193
|
-
* 获取文件的完整路由路径
|
|
194
|
-
*
|
|
195
|
-
* 判断文件是否为页面文件,如果是则计算其最终生成的路由 fullPath。
|
|
196
|
-
* 非页面文件(布局文件、配置文件等)返回 null。
|
|
197
|
-
*
|
|
198
|
-
* @param filePath - 文件绝对路径
|
|
199
|
-
* @returns 完整路由路径,非页面文件返回 null
|
|
200
|
-
*/
|
|
201
|
-
getRouteFullPath(filePath: string): string | null;
|
|
202
|
-
/**
|
|
203
|
-
* 写入类型定义文件
|
|
204
|
-
*/
|
|
205
|
-
private writeDts;
|
|
206
|
-
/**
|
|
207
|
-
* 生成路由
|
|
208
|
-
*
|
|
209
|
-
* @returns {GenerateResult} 生成结果,包含routes、dts、code
|
|
210
|
-
*/
|
|
211
|
-
generate(): GenerateResult;
|
|
212
|
-
/**
|
|
213
|
-
* 清空生成结果
|
|
214
|
-
*/
|
|
215
|
-
clearGenerateResult(): void;
|
|
216
|
-
/**
|
|
217
|
-
* 移除 definePage 宏
|
|
218
|
-
*
|
|
219
|
-
* 移除页面文件中的 definePage 宏调用。
|
|
220
|
-
* definePage 在客户端无法运行,必须移除。
|
|
221
|
-
*
|
|
222
|
-
* @param code - 源代码
|
|
223
|
-
* @param filePath - 文件路径
|
|
224
|
-
* @returns 转换后的代码,无需转换返回 null
|
|
225
|
-
*/
|
|
226
|
-
removeDefinePage(code: string, filePath: string): GeneratorResult | null;
|
|
227
|
-
/**
|
|
228
|
-
* 添加页面文件
|
|
229
|
-
*
|
|
230
|
-
* 根据文件类型直接调用对应处理器,避免重复类型判断和文件解析。
|
|
231
|
-
*
|
|
232
|
-
* @param filePath - 文件路径
|
|
233
|
-
* @returns 是否创建了新的路由节点
|
|
234
|
-
*/
|
|
235
|
-
addPage(filePath: string): boolean;
|
|
236
|
-
/**
|
|
237
|
-
* 移除指定的文件或目录
|
|
238
|
-
*
|
|
239
|
-
* 通常用于在开发模式下,文件内容改变时,移除旧的路由映射,重新生成
|
|
240
|
-
*
|
|
241
|
-
* 移除成功后续手动调用 `clearGenerateResult` 方法确保下一次获取新的生成结果!
|
|
242
|
-
*
|
|
243
|
-
* @param filePath - 文件/目录路径
|
|
244
|
-
* @returns {boolean} - 存在则移除并返回 true,不存在则返回 false
|
|
245
|
-
*/
|
|
246
|
-
removePage(filePath: string): boolean;
|
|
247
|
-
/**
|
|
248
|
-
* 更新文件
|
|
249
|
-
*
|
|
250
|
-
* 如果文件未被扫描,则会自动添加。
|
|
251
|
-
*
|
|
252
|
-
* @param filePath - 文件路径
|
|
253
|
-
* @returns {boolean} - 是否更新了文件
|
|
254
|
-
*/
|
|
255
|
-
updatePage(filePath: string): boolean;
|
|
256
|
-
/**
|
|
257
|
-
* 处理文件变化
|
|
258
|
-
*
|
|
259
|
-
* @param eventName - 文件变化事件名
|
|
260
|
-
* @param path - 文件路径
|
|
261
|
-
* @returns {boolean} - 是否影响了路由
|
|
262
|
-
* @example
|
|
263
|
-
* ```typescript
|
|
264
|
-
* router.handleChange('change', '/path/to/file.ts')
|
|
265
|
-
* // 在vite中使用
|
|
266
|
-
* server.watcher.on('all', (event,path) => {
|
|
267
|
-
* const mod = server.moduleGraph.getModuleById(RESOLVED_ROUTES_ID)
|
|
268
|
-
* if (mod) {
|
|
269
|
-
* const result = router.handleChange(event, path)
|
|
270
|
-
* // 如果 handleChange 返回 true,则表示路由受到影响,需要更新模块
|
|
271
|
-
* if(result) server.moduleGraph.invalidateModule(mod)
|
|
272
|
-
* }
|
|
273
|
-
* })
|
|
274
|
-
* ```
|
|
275
|
-
*/
|
|
276
|
-
handleChange(eventName: FileWatcherEvent, path: string): boolean;
|
|
277
|
-
}
|