vite-plugin-preloader 1.0.1 → 1.1.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 +162 -87
- package/dist/index.d.mts +0 -16
- package/dist/index.d.ts +0 -16
- package/dist/index.js +201 -153
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +201 -153
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,12 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
## ✨ 特性
|
|
6
6
|
|
|
7
|
-
- 🎯 **一行配置** - 在 `vite.config.js`
|
|
8
|
-
- ⚡ **零运行时开销** -
|
|
9
|
-
- 🎨 **自动注入** -
|
|
10
|
-
- 🛠️ **开发友好** -
|
|
7
|
+
- 🎯 **一行配置** - 在 `vite.config.js` 中配置即可,无需修改任何业务代码
|
|
8
|
+
- ⚡ **零运行时开销** - 构建时生成,运行时高效执行
|
|
9
|
+
- 🎨 **自动注入** - 无需手动调用,插件自动将预加载脚本注入 HTML
|
|
10
|
+
- 🛠️ **开发友好** - 智能默认配置 + 丰富的调试工具
|
|
11
11
|
- 📦 **类型安全** - 完整的 TypeScript 支持
|
|
12
12
|
- 🔥 **热更新支持** - 配置变更时自动更新
|
|
13
|
+
- 🎭 **状态可视化** - 优雅的加载状态显示,支持多种位置
|
|
13
14
|
|
|
14
15
|
## 📦 安装
|
|
15
16
|
|
|
@@ -23,9 +24,9 @@ pnpm add vite-plugin-preloader
|
|
|
23
24
|
bun add vite-plugin-preloader
|
|
24
25
|
```
|
|
25
26
|
|
|
26
|
-
## 🚀
|
|
27
|
+
## 🚀 快速开始
|
|
27
28
|
|
|
28
|
-
###
|
|
29
|
+
### 极简配置(推荐)
|
|
29
30
|
|
|
30
31
|
```js
|
|
31
32
|
// vite.config.js
|
|
@@ -38,178 +39,252 @@ export default defineConfig({
|
|
|
38
39
|
vue(),
|
|
39
40
|
preloader({
|
|
40
41
|
routes: [
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
priority: 1
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
path: '/charts',
|
|
48
|
-
component: '@/views/charts/index.vue',
|
|
49
|
-
reason: '图表页面较重',
|
|
50
|
-
priority: 1
|
|
51
|
-
}
|
|
42
|
+
'/dashboard', // 字符串配置,组件路径自动推断
|
|
43
|
+
'/calendar', // 推断为: @/views/calendar/index.vue
|
|
44
|
+
'/charts', // 推断为: @/views/charts/index.vue
|
|
52
45
|
]
|
|
53
46
|
})
|
|
54
47
|
]
|
|
55
48
|
})
|
|
56
49
|
```
|
|
57
50
|
|
|
58
|
-
|
|
59
|
-
- 🎯
|
|
60
|
-
- 📦
|
|
51
|
+
**就这样!** 插件会自动:
|
|
52
|
+
- 🎯 推断组件路径
|
|
53
|
+
- 📦 注入预加载脚本
|
|
61
54
|
- 🎨 显示加载状态
|
|
62
55
|
- 🛠️ 提供调试工具
|
|
56
|
+
- ⚙️ 应用智能默认配置
|
|
63
57
|
|
|
64
58
|
### 完整配置示例
|
|
65
59
|
|
|
66
60
|
```js
|
|
67
61
|
preloader({
|
|
68
62
|
routes: [
|
|
69
|
-
// 🔥
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
component: '@/views/dashboard/index.vue',
|
|
73
|
-
reason: '主仪表盘,用户访问频率最高',
|
|
74
|
-
priority: 1
|
|
75
|
-
},
|
|
63
|
+
// 🔥 字符串配置 - 简单直接
|
|
64
|
+
'/dashboard',
|
|
65
|
+
'/user-profile',
|
|
76
66
|
|
|
77
|
-
//
|
|
67
|
+
// 🎯 对象配置 - 更多控制
|
|
78
68
|
{
|
|
79
69
|
path: '/calendar',
|
|
70
|
+
component: '@/views/calendar/CalendarView.vue', // 自定义组件路径
|
|
80
71
|
reason: '日历组件包含 @fullcalendar 全家桶(~500KB)',
|
|
72
|
+
priority: 1 // 高优先级,优先加载
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
path: '/charts',
|
|
76
|
+
reason: '图表页面包含 echarts、@antv/x6 等重型库',
|
|
81
77
|
priority: 2
|
|
82
78
|
},
|
|
83
|
-
|
|
84
|
-
// 📊 低优先级 - 重型工具页面
|
|
85
79
|
{
|
|
86
80
|
path: '/reports',
|
|
87
|
-
|
|
88
|
-
reason: '报表页面包含 echarts + d3 图表库(~800KB)',
|
|
81
|
+
reason: '报表页面包含复杂的数据处理逻辑',
|
|
89
82
|
priority: 3
|
|
90
83
|
}
|
|
91
84
|
],
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
85
|
+
|
|
86
|
+
// 🚀 以下所有配置都有智能默认值,可选配置
|
|
87
|
+
delay: 2000, // 页面加载后延迟 2 秒开始预加载
|
|
88
|
+
showStatus: true, // 显示 "🔄 正在优化页面..." 状态
|
|
89
|
+
statusPosition: 'bottom-right', // 状态显示位置
|
|
90
|
+
debug: true // 强制开启调试(默认开发环境自动开启)
|
|
96
91
|
})
|
|
97
92
|
```
|
|
98
93
|
|
|
99
94
|
## 🎯 配置选项
|
|
100
95
|
|
|
96
|
+
### 插件选项
|
|
97
|
+
|
|
101
98
|
| 选项 | 类型 | 默认值 | 说明 |
|
|
102
99
|
|------|------|--------|------|
|
|
103
|
-
| `routes` | `PreloadRoute[]` | `[]` | 预加载路由配置 |
|
|
104
|
-
| `delay` | `number` | `2000` | 延迟时间(ms) |
|
|
105
|
-
| `showStatus` | `boolean` | `true` |
|
|
106
|
-
| `statusPosition` | `
|
|
107
|
-
| `debug` | `boolean` |
|
|
100
|
+
| `routes` | `(string \| PreloadRoute)[]` | `[]` | **必填** 预加载路由配置 |
|
|
101
|
+
| `delay` | `number` | `2000` | 延迟时间(ms),避免影响首屏加载 |
|
|
102
|
+
| `showStatus` | `boolean` | `true` | 显示加载状态指示器 |
|
|
103
|
+
| `statusPosition` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right'` | `'bottom-right'` | 状态指示器位置 |
|
|
104
|
+
| `debug` | `boolean` | `开发环境: true`<br>`生产环境: false` | 调试模式,控制台输出详细日志 |
|
|
108
105
|
|
|
109
106
|
### PreloadRoute 配置
|
|
110
107
|
|
|
111
108
|
| 字段 | 类型 | 必填 | 说明 |
|
|
112
109
|
|------|------|------|------|
|
|
113
|
-
| `path` | `string` | ✅ |
|
|
114
|
-
| `component` | `string` | ❌ |
|
|
115
|
-
| `reason` | `string` | ❌ |
|
|
116
|
-
| `priority` | `number` | ❌ | 优先级 1-5
|
|
110
|
+
| `path` | `string` | ✅ | 路由路径,如 `/dashboard` |
|
|
111
|
+
| `component` | `string` | ❌ | 组件路径,不填则自动推断 |
|
|
112
|
+
| `reason` | `string` | ❌ | 预加载原因说明,便于调试和维护 |
|
|
113
|
+
| `priority` | `number` | ❌ | 优先级 1-5(数字越小越先加载),默认 2 |
|
|
117
114
|
|
|
118
115
|
## 🛠️ 开发调试
|
|
119
116
|
|
|
120
|
-
|
|
117
|
+
开发环境下,插件自动在浏览器控制台提供调试工具:
|
|
121
118
|
|
|
122
119
|
```js
|
|
123
|
-
//
|
|
120
|
+
// 查看预加载统计信息
|
|
124
121
|
window.preloaderDebug.stats()
|
|
122
|
+
// 返回: { total: 3, completed: 2, failed: 0, startTime: 1234567890, ... }
|
|
125
123
|
|
|
126
|
-
//
|
|
124
|
+
// 检查指定路由是否已预加载
|
|
127
125
|
window.preloaderDebug.check('/calendar')
|
|
126
|
+
// 返回: true
|
|
128
127
|
|
|
129
|
-
//
|
|
128
|
+
// 手动重新开始预加载(用于测试)
|
|
130
129
|
window.preloaderDebug.restart()
|
|
131
130
|
|
|
132
|
-
//
|
|
131
|
+
// 显示所有可用的调试命令
|
|
133
132
|
window.preloaderDebug.help()
|
|
134
133
|
```
|
|
135
134
|
|
|
136
135
|
## 📊 控制台输出示例
|
|
137
136
|
|
|
137
|
+
### 插件启动日志
|
|
138
|
+
```
|
|
139
|
+
🚀 [预加载插件] 已启用,配置了 3 个路由
|
|
140
|
+
📋 [预加载插件] 路由列表: ["/dashboard", "/calendar", "/charts"]
|
|
141
|
+
⚙️ [预加载插件] 配置选项: { delay: 2000, showStatus: true, statusPosition: "bottom-right", debug: true }
|
|
142
|
+
🎨 [预加载插件] 注入预加载脚本到 HTML
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 预加载执行日志
|
|
138
146
|
```
|
|
139
|
-
🚀 预加载插件已启用,配置了 3 个路由
|
|
140
147
|
🚀 [预加载] 开始预加载 3 个页面
|
|
141
|
-
✅ [预加载] /
|
|
142
|
-
✅ [预加载] /
|
|
143
|
-
✅ [预加载] /
|
|
148
|
+
✅ [预加载] /dashboard (156ms) - 自动推断的预加载页面
|
|
149
|
+
✅ [预加载] /calendar (234ms) - 日历组件包含 @fullcalendar 全家桶(~500KB)
|
|
150
|
+
✅ [预加载] /charts (456ms) - 图表页面包含 echarts、@antv/x6 等重型库
|
|
144
151
|
🎉 [预加载] 完成! 耗时 1234ms
|
|
152
|
+
🛠️ 预加载调试工具: window.preloaderDebug
|
|
145
153
|
```
|
|
146
154
|
|
|
147
|
-
## 🎨
|
|
155
|
+
## 🎨 状态显示效果
|
|
148
156
|
|
|
149
|
-
|
|
157
|
+
插件会在页面显示优雅的加载状态:
|
|
150
158
|
|
|
151
159
|
```
|
|
152
160
|
🔄 正在优化页面... 2/3
|
|
153
161
|
```
|
|
154
162
|
|
|
155
|
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
- `'bottom-left'` - 左下角
|
|
159
|
-
- `'bottom-right'` - 右下角(默认)
|
|
163
|
+
- **位置可配置**:四个角落任选
|
|
164
|
+
- **自动隐藏**:预加载完成后淡出消失
|
|
165
|
+
- **不干扰用户**:`pointer-events: none`,不阻挡交互
|
|
160
166
|
|
|
161
167
|
## 🔧 最佳实践
|
|
162
168
|
|
|
163
|
-
### 1.
|
|
169
|
+
### 1. 路由配置策略
|
|
164
170
|
|
|
165
171
|
```js
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
172
|
+
routes: [
|
|
173
|
+
// 🔥 核心页面 - 用户必访,优先级最高
|
|
174
|
+
{ path: '/dashboard', priority: 1, reason: '用户首页,访问频率最高' },
|
|
175
|
+
|
|
176
|
+
// ⚡ 常用页面 - 功能页面,中等优先级
|
|
177
|
+
{ path: '/calendar', priority: 2, reason: '日历功能,包含大型日期库' },
|
|
178
|
+
{ path: '/contacts', priority: 2, reason: '联系人管理,数据量大' },
|
|
179
|
+
|
|
180
|
+
// 📊 专业工具 - 低频但重型,最后加载
|
|
181
|
+
{ path: '/reports', priority: 3, reason: '报表页面,包含复杂图表库' },
|
|
182
|
+
{ path: '/admin', priority: 3, reason: '管理后台,权限要求高' }
|
|
183
|
+
]
|
|
174
184
|
```
|
|
175
185
|
|
|
176
|
-
### 2.
|
|
186
|
+
### 2. 智能路径推断
|
|
177
187
|
|
|
178
|
-
|
|
188
|
+
插件自动将路由路径转换为组件路径:
|
|
179
189
|
|
|
180
190
|
```js
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
191
|
+
// 路径推断规则
|
|
192
|
+
'/dashboard' → '@/views/dashboard/index.vue'
|
|
193
|
+
'/user-profile' → '@/views/user-profile/index.vue'
|
|
194
|
+
'/admin/users' → '@/views/admin/users/index.vue'
|
|
195
|
+
'/demo/13-calendar' → '@/views/demo/13-calendar/index.vue'
|
|
186
196
|
```
|
|
187
197
|
|
|
188
|
-
### 3.
|
|
189
|
-
|
|
190
|
-
建议在 `reason` 中说明预加载的具体原因:
|
|
198
|
+
### 3. 性能优化建议
|
|
191
199
|
|
|
192
200
|
```js
|
|
193
201
|
{
|
|
202
|
+
// ✅ 推荐:给出明确的预加载原因
|
|
194
203
|
path: '/calendar',
|
|
195
|
-
reason: '日历组件包含 @fullcalendar
|
|
204
|
+
reason: '日历组件包含 @fullcalendar(~400KB) + moment.js(~60KB)',
|
|
196
205
|
priority: 2
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
{
|
|
209
|
+
// ✅ 推荐:重型页面单独配置优先级
|
|
210
|
+
path: '/data-visualization',
|
|
211
|
+
reason: '数据可视化包含 d3.js + echarts + three.js (~1.2MB)',
|
|
212
|
+
priority: 3 // 低优先级,避免影响关键页面
|
|
197
213
|
}
|
|
198
214
|
```
|
|
199
215
|
|
|
216
|
+
### 4. 开发环境优化
|
|
217
|
+
|
|
218
|
+
```js
|
|
219
|
+
// vite.config.js
|
|
220
|
+
preloader({
|
|
221
|
+
routes: [/* ... */],
|
|
222
|
+
|
|
223
|
+
// 开发环境配置
|
|
224
|
+
...(process.env.NODE_ENV === 'development' ? {
|
|
225
|
+
debug: true, // 开发环境显示详细日志
|
|
226
|
+
delay: 1000, // 开发环境快速启动
|
|
227
|
+
showStatus: true // 显示状态便于调试
|
|
228
|
+
} : {
|
|
229
|
+
debug: false, // 生产环境静默运行
|
|
230
|
+
delay: 3000, // 生产环境延迟更久,确保首屏稳定
|
|
231
|
+
showStatus: false // 生产环境不显示状态
|
|
232
|
+
})
|
|
233
|
+
})
|
|
234
|
+
```
|
|
235
|
+
|
|
200
236
|
## 🚀 工作原理
|
|
201
237
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
238
|
+
### 构建时
|
|
239
|
+
1. **配置解析** - 解析用户配置,应用智能默认值
|
|
240
|
+
2. **路径推断** - 自动推断未指定的组件路径
|
|
241
|
+
3. **代码生成** - 生成优化的预加载脚本
|
|
242
|
+
4. **HTML注入** - 将脚本直接注入到 HTML `<head>` 中
|
|
243
|
+
|
|
244
|
+
### 运行时
|
|
245
|
+
1. **DOM就绪检测** - 等待页面 DOM 加载完成
|
|
246
|
+
2. **延迟启动** - 根据配置延迟指定时间后启动
|
|
247
|
+
3. **优先级排序** - 按 priority 值从小到大排序
|
|
248
|
+
4. **串行加载** - 顺序预加载,避免并发阻塞
|
|
249
|
+
5. **状态反馈** - 实时更新加载状态和统计信息
|
|
250
|
+
|
|
251
|
+
## 🎯 适用场景
|
|
252
|
+
|
|
253
|
+
- ✅ **Vue SPA 应用** - 单页应用路由预加载
|
|
254
|
+
- ✅ **后台管理系统** - 管理页面通常较重,预加载效果明显
|
|
255
|
+
- ✅ **数据可视化应用** - 图表库体积大,预加载能显著提升体验
|
|
256
|
+
- ✅ **工具型应用** - 功能页面复杂,用户操作流程相对固定
|
|
257
|
+
|
|
258
|
+
## ❓ 常见问题
|
|
259
|
+
|
|
260
|
+
### Q: 预加载会影响首屏性能吗?
|
|
261
|
+
A: 不会。插件默认延迟 2 秒启动,确保首屏渲染完成后才开始预加载。
|
|
262
|
+
|
|
263
|
+
### Q: 如何判断哪些页面需要预加载?
|
|
264
|
+
A: 建议预加载:1) 用户高频访问的页面 2) 包含大型第三方库的页面 3) 数据处理复杂的页面。
|
|
265
|
+
|
|
266
|
+
### Q: 开发环境下看不到预加载效果?
|
|
267
|
+
A: 开发环境下模块已经在内存中,预加载效果不明显。可以通过控制台日志确认插件正常工作。
|
|
268
|
+
|
|
269
|
+
### Q: 可以配置生产环境不预加载吗?
|
|
270
|
+
A: 可以。在配置中添加环境判断即可:
|
|
271
|
+
```js
|
|
272
|
+
preloader({
|
|
273
|
+
routes: process.env.NODE_ENV === 'production' ? [] : ['/dashboard', '/calendar']
|
|
274
|
+
})
|
|
275
|
+
```
|
|
207
276
|
|
|
208
277
|
## 🤝 贡献
|
|
209
278
|
|
|
210
279
|
欢迎提交 Issue 和 Pull Request!
|
|
211
280
|
|
|
212
|
-
|
|
281
|
+
1. Fork 本仓库
|
|
282
|
+
2. 创建你的特性分支 (`git checkout -b feature/AmazingFeature`)
|
|
283
|
+
3. 提交你的修改 (`git commit -m 'Add some AmazingFeature'`)
|
|
284
|
+
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
|
285
|
+
5. 开启一个 Pull Request
|
|
286
|
+
|
|
287
|
+
## 📄 许可证
|
|
213
288
|
|
|
214
289
|
MIT © ChenYu
|
|
215
290
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,33 +1,17 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
2
|
|
|
3
3
|
interface PreloadRoute {
|
|
4
|
-
/** 路由路径 */
|
|
5
4
|
path: string;
|
|
6
|
-
/** 组件导入路径,不填则自动推断 */
|
|
7
5
|
component?: string;
|
|
8
|
-
/** 预加载原因说明 */
|
|
9
6
|
reason?: string;
|
|
10
|
-
/** 优先级 1-5,数字越小优先级越高 */
|
|
11
7
|
priority?: number;
|
|
12
8
|
}
|
|
13
9
|
interface PreloaderOptions {
|
|
14
|
-
/** 预加载路由配置 - 支持字符串数组或对象数组 */
|
|
15
10
|
routes: (string | PreloadRoute)[];
|
|
16
|
-
/** 延迟时间(毫秒),默认 2000 */
|
|
17
11
|
delay?: number;
|
|
18
|
-
/** 是否显示预加载状态,默认 true */
|
|
19
12
|
showStatus?: boolean;
|
|
20
|
-
/** 状态显示位置,默认 'bottom-right' */
|
|
21
13
|
statusPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
22
|
-
/** 是否启用开发时调试,默认 false */
|
|
23
14
|
debug?: boolean;
|
|
24
|
-
/** 自动检测大文件并预加载(未来功能) */
|
|
25
|
-
autoDetect?: {
|
|
26
|
-
/** 最小文件大小阈值 */
|
|
27
|
-
minSize?: string;
|
|
28
|
-
/** 排除的路径模式 */
|
|
29
|
-
exclude?: string[];
|
|
30
|
-
};
|
|
31
15
|
}
|
|
32
16
|
|
|
33
17
|
declare function preloaderPlugin(options: PreloaderOptions): Plugin;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,33 +1,17 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
2
|
|
|
3
3
|
interface PreloadRoute {
|
|
4
|
-
/** 路由路径 */
|
|
5
4
|
path: string;
|
|
6
|
-
/** 组件导入路径,不填则自动推断 */
|
|
7
5
|
component?: string;
|
|
8
|
-
/** 预加载原因说明 */
|
|
9
6
|
reason?: string;
|
|
10
|
-
/** 优先级 1-5,数字越小优先级越高 */
|
|
11
7
|
priority?: number;
|
|
12
8
|
}
|
|
13
9
|
interface PreloaderOptions {
|
|
14
|
-
/** 预加载路由配置 - 支持字符串数组或对象数组 */
|
|
15
10
|
routes: (string | PreloadRoute)[];
|
|
16
|
-
/** 延迟时间(毫秒),默认 2000 */
|
|
17
11
|
delay?: number;
|
|
18
|
-
/** 是否显示预加载状态,默认 true */
|
|
19
12
|
showStatus?: boolean;
|
|
20
|
-
/** 状态显示位置,默认 'bottom-right' */
|
|
21
13
|
statusPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
22
|
-
/** 是否启用开发时调试,默认 false */
|
|
23
14
|
debug?: boolean;
|
|
24
|
-
/** 自动检测大文件并预加载(未来功能) */
|
|
25
|
-
autoDetect?: {
|
|
26
|
-
/** 最小文件大小阈值 */
|
|
27
|
-
minSize?: string;
|
|
28
|
-
/** 排除的路径模式 */
|
|
29
|
-
exclude?: string[];
|
|
30
|
-
};
|
|
31
15
|
}
|
|
32
16
|
|
|
33
17
|
declare function preloaderPlugin(options: PreloaderOptions): Plugin;
|