jinbi-utils 1.0.19 → 1.0.21

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.
Files changed (81) hide show
  1. package/.babelrc +19 -0
  2. package/.cz-config.js +55 -0
  3. package/.dockerignore +3 -0
  4. package/.editorconfig +12 -0
  5. package/.eslintignore +8 -0
  6. package/.eslintrc.js +54 -0
  7. package/.versionrc.json +9 -0
  8. package/CHUNK_OPTIMIZER_USAGE.md +132 -0
  9. package/Dockerfile +3 -0
  10. package/QUICK_RELEASE.md +85 -0
  11. package/RELEASE_GUIDE.md +243 -0
  12. package/api-extractor.json +15 -0
  13. package/commitlint.config.js +3 -0
  14. package/jest.config.js +15 -0
  15. package/package.json +8 -35
  16. package/rollup.config.chunk-optimizer.js +32 -0
  17. package/rollup.config.js +73 -0
  18. package/src/array/index.ts +85 -0
  19. package/src/build/chunk-optimizer/ARCHITECTURE.md +347 -0
  20. package/src/build/chunk-optimizer/QUICK_START.md +370 -0
  21. package/src/build/chunk-optimizer/README.md +240 -0
  22. package/src/build/chunk-optimizer/core/chunk-generator.ts +166 -0
  23. package/src/build/chunk-optimizer/core/classifier.ts +148 -0
  24. package/src/build/chunk-optimizer/core/dependency-reader.ts +138 -0
  25. package/src/build/chunk-optimizer/examples/basic-usage.ts +234 -0
  26. package/src/build/chunk-optimizer/index.ts +166 -0
  27. package/src/build/chunk-optimizer/rules/common-rules.ts +131 -0
  28. package/src/build/chunk-optimizer/rules/framework-rules.ts +93 -0
  29. package/src/build/chunk-optimizer/rules/index.ts +27 -0
  30. package/src/build/chunk-optimizer/test.ts +94 -0
  31. package/src/build/chunk-optimizer/types.ts +128 -0
  32. package/src/color/index.ts +58 -0
  33. package/src/common/index.ts +353 -0
  34. package/src/constant/common.constant.ts +13 -0
  35. package/src/date/index.ts +143 -0
  36. package/src/dom/index.ts +198 -0
  37. package/src/file/index.ts +319 -0
  38. package/src/http/apiBuilder/README.md +648 -0
  39. package/src/http/apiBuilder/api-builder.ts +502 -0
  40. package/src/http/apiBuilder/example.ts +243 -0
  41. package/src/http/apiBuilder/index.ts +1 -0
  42. package/src/http/apiBuilder//345/277/253/351/200/237/345/217/202/350/200/203.md +199 -0
  43. package/src/http/http.ts +79 -0
  44. package/src/http/httpEnums.ts +61 -0
  45. package/src/iam/index.ts +46 -0
  46. package/src/index.ts +20 -0
  47. package/src/middleware/requestLogger.middware.ts +371 -0
  48. package/src/middleware/requestLoggerUnified.ts +371 -0
  49. package/src/number/index.ts +362 -0
  50. package/src/object/index.ts +54 -0
  51. package/src/print/index.ts +102 -0
  52. package/src/string/index.ts +189 -0
  53. package/src/utils/curl.ts +108 -0
  54. package/src/validate/index.ts +100 -0
  55. package/src/websocket/emitter.ts +39 -0
  56. package/src/websocket/index.ts +6 -0
  57. package/src/websocket/manager.ts +151 -0
  58. package/src/websocket/pinia-store.ts +91 -0
  59. package/src/websocket/service.ts +34 -0
  60. package/src/websocket/types.ts +45 -0
  61. package/test/common/index.test.ts +19 -0
  62. package/test/date/index.test.ts +107 -0
  63. package/test/file/index.test.ts +104 -0
  64. package/test/number/index.test.ts +108 -0
  65. package/test/object/index.test.ts +20 -0
  66. package/test/string/index.test.ts +82 -0
  67. package/tsconfig.json +39 -0
  68. package/typedoc.json +12 -0
  69. package/types/file/index.d.ts +7 -0
  70. package/types/index.d.ts +1 -0
  71. package/types/websocket/emitter.d.ts +16 -0
  72. package/types/websocket/index.d.ts +6 -0
  73. package/types/websocket/manager.d.ts +36 -0
  74. package/types/websocket/pinia-store.d.ts +25 -0
  75. package/types/websocket/service.d.ts +13 -0
  76. package/types/websocket/types.d.ts +34 -0
  77. package/dist/chunk-optimizer.cjs +0 -703
  78. package/dist/index.esm.js +0 -2791
  79. package/dist/index.esm.min.js +0 -15
  80. package/dist/index.umd.js +0 -2899
  81. package/dist/index.umd.min.js +0 -16
@@ -0,0 +1,370 @@
1
+ # 🚀 Chunk Optimizer 快速开始指南
2
+
3
+ ## 📦 项目结构
4
+
5
+ ```
6
+ build/chunk-optimizer/
7
+ ├── core/ # 核心模块
8
+ │ ├── dependency-reader.ts # 依赖读取器
9
+ │ ├── classifier.ts # 依赖分类器
10
+ │ └── chunk-generator.ts # Chunk 生成器
11
+ ├── rules/ # 规则库
12
+ │ ├── framework-rules.ts # 框架规则(Vue/React/Angular/Svelte)
13
+ │ ├── common-rules.ts # 通用规则(工具库/UI库/图标库等)
14
+ │ └── index.ts # 规则导出
15
+ ├── examples/ # 使用示例
16
+ │ └── basic-usage.ts # 基础用法示例
17
+ ├── types.ts # TypeScript 类型定义
18
+ ├── index.ts # 主入口文件
19
+ ├── test.ts # 测试脚本
20
+ ├── README.md # 使用文档
21
+ ├── ARCHITECTURE.md # 架构设计文档
22
+ └── QUICK_START.md # 本文件
23
+ ```
24
+
25
+ ---
26
+
27
+ ## ⚡ 5 分钟快速上手
28
+
29
+ ### 步骤 1: 在 vite.config.ts 中导入
30
+
31
+ ```typescript
32
+ import { createChunkOptimizer } from './build/chunk-optimizer';
33
+ ```
34
+
35
+ ### 步骤 2: 创建优化器实例
36
+
37
+ ```typescript
38
+ const optimizer = createChunkOptimizer({
39
+ framework: 'vue', // 或 'react', 'angular', 'svelte', 'auto'
40
+ debug: false, // 开发环境可设为 true 查看详细信息
41
+ });
42
+ ```
43
+
44
+ ### 步骤 3: 在 build 配置中使用
45
+
46
+ ```typescript
47
+ export default {
48
+ build: {
49
+ rollupOptions: {
50
+ output: {
51
+ manualChunks: optimizer.generate()
52
+ }
53
+ }
54
+ }
55
+ }
56
+ ```
57
+
58
+ ### 完整示例
59
+
60
+ ```typescript
61
+ // vite.config.ts
62
+ import { defineConfig } from 'vite';
63
+ import { createChunkOptimizer } from './build/chunk-optimizer';
64
+
65
+ export default defineConfig({
66
+ build: {
67
+ rollupOptions: {
68
+ output: {
69
+ chunkFileNames: 'static/js/[name]-[hash].js',
70
+ entryFileNames: 'static/js/[name]-[hash].js',
71
+ assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
72
+ manualChunks: createChunkOptimizer().generate()
73
+ }
74
+ }
75
+ }
76
+ });
77
+ ```
78
+
79
+ ---
80
+
81
+ ## 🎯 常见使用场景
82
+
83
+ ### 场景 1: 零配置使用(推荐新手)
84
+
85
+ ```typescript
86
+ const optimizer = createChunkOptimizer();
87
+ ```
88
+
89
+ ✅ 自动检测框架
90
+ ✅ 使用默认规则
91
+ ✅ 开箱即用
92
+
93
+ ---
94
+
95
+ ### 场景 2: 启用调试模式(推荐开发时)
96
+
97
+ ```typescript
98
+ const optimizer = createChunkOptimizer({
99
+ debug: true
100
+ });
101
+ ```
102
+
103
+ 会在构建时输出:
104
+ ```
105
+ 📦 Chunk Optimizer - Dependency Classification
106
+
107
+ vendor-vue (3):
108
+ - vue
109
+ - pinia
110
+ - @vue/shared
111
+
112
+ vendor-element (1):
113
+ - element-plus
114
+
115
+ vendor-utils (8):
116
+ - axios
117
+ - dayjs
118
+ - lodash-es
119
+ ...
120
+
121
+ 📊 Summary:
122
+ Total dependencies: 45
123
+ Categorized: 45
124
+ Categories: 9
125
+ ```
126
+
127
+ ---
128
+
129
+ ### 场景 3: 自定义规则(推荐企业项目)
130
+
131
+ ```typescript
132
+ const optimizer = createChunkOptimizer({
133
+ framework: 'vue',
134
+ customRules: {
135
+ // 公司内部库单独分包
136
+ '@company/ui': 'vendor-company-ui',
137
+ '@company/utils': 'vendor-company-utils',
138
+
139
+ // 大型库单独分包
140
+ 'echarts': 'vendor-echarts',
141
+
142
+ // 通配符匹配
143
+ '@company/*': 'vendor-company',
144
+ }
145
+ });
146
+ ```
147
+
148
+ ---
149
+
150
+ ### 场景 4: 排除某些包
151
+
152
+ ```typescript
153
+ const optimizer = createChunkOptimizer({
154
+ exclude: [
155
+ '@types/*', // 排除类型定义
156
+ 'vite', // 排除构建工具
157
+ 'rollup',
158
+ ]
159
+ });
160
+ ```
161
+
162
+ ---
163
+
164
+ ### 场景 5: 自定义业务代码分包
165
+
166
+ ```typescript
167
+ const optimizer = createChunkOptimizer({
168
+ sourceCodeStrategy: {
169
+ views: true, // /src/views/system/ -> chunk-system
170
+ components: true, // /src/components/ -> chunk-components
171
+ utils: true, // /src/utils/ -> chunk-common
172
+ store: true, // /src/store/ -> chunk-store
173
+ custom: [
174
+ {
175
+ pattern: /\/src\/features\/([^/]+)\//,
176
+ chunkName: 'feature-$1'
177
+ }
178
+ ]
179
+ }
180
+ });
181
+ ```
182
+
183
+ ---
184
+
185
+ ## 🧪 测试工具
186
+
187
+ ### 运行测试脚本
188
+
189
+ ```bash
190
+ # 使用 tsx(推荐)
191
+ npx tsx build/chunk-optimizer/test.ts
192
+
193
+ # 或使用 ts-node
194
+ npx ts-node build/chunk-optimizer/test.ts
195
+ ```
196
+
197
+ ### 查看分析报告
198
+
199
+ ```typescript
200
+ const optimizer = createChunkOptimizer();
201
+ optimizer.printReport();
202
+ ```
203
+
204
+ 输出:
205
+ ```
206
+ ============================================================
207
+ 📦 Vite Chunk Optimizer - Analysis Report
208
+ ============================================================
209
+
210
+ Framework: vue
211
+ Strategy: balanced
212
+ Total Dependencies: 45
213
+
214
+ Chunk Distribution:
215
+ vendor-vue 15 (33.3%)
216
+ vendor-utils 12 (26.7%)
217
+ vendor-element 8 (17.8%)
218
+ vendor-icons 5 (11.1%)
219
+ vendor-libs 5 (11.1%)
220
+
221
+ ============================================================
222
+ ```
223
+
224
+ ---
225
+
226
+ ## 📊 默认分包结果
227
+
228
+ ### Vendor Chunks(第三方库)
229
+
230
+ | Chunk 名称 | 包含的库 | 首屏加载 |
231
+ |-----------|---------|---------|
232
+ | `vendor-vue` | vue, pinia, @vue/* | ✅ 是 |
233
+ | `vendor-router` | vue-router | ✅ 是 |
234
+ | `vendor-element` | element-plus | ⚠️ 按需 |
235
+ | `vendor-utils` | axios, dayjs, lodash 等 | ⚠️ 按需 |
236
+ | `vendor-icons` | @iconify/*, unplugin-icons | ❌ 否 |
237
+ | `vendor-i18n` | vue-i18n, @intlify/* | ⚠️ 按需 |
238
+ | `vendor-vueuse` | @vueuse/* | ❌ 否 |
239
+ | `vendor-libs` | 其他第三方库 | ❌ 否 |
240
+
241
+ ### Business Chunks(业务代码)
242
+
243
+ | Chunk 名称 | 路径 | 加载时机 |
244
+ |-----------|------|---------|
245
+ | `chunk-system` | /src/views/system/ | 路由切换 |
246
+ | `chunk-dashboard` | /src/views/dashboard/ | 路由切换 |
247
+ | `chunk-components` | /src/components/ | 按需 |
248
+ | `chunk-common` | /src/utils/, /src/config/ | 首屏 |
249
+ | `chunk-store` | /src/store/ | 首屏 |
250
+
251
+ ---
252
+
253
+ ## 🎨 优化效果
254
+
255
+ ### 优化前(手动配置)
256
+
257
+ ```
258
+ dist/
259
+ ├── index-abc123.js (500 KB) ❌ 首屏加载慢
260
+ ├── vendor-def456.js (1.2 MB) ❌ 包含所有依赖
261
+ └── ...
262
+ ```
263
+
264
+ ### 优化后(使用 Chunk Optimizer)
265
+
266
+ ```
267
+ dist/
268
+ ├── index-abc123.js (50 KB) ✅ 首屏快速加载
269
+ ├── vendor-vue-def456.js (150 KB) ✅ 核心框架
270
+ ├── vendor-element-ghi789.js (400 KB) ✅ UI 库按需加载
271
+ ├── vendor-utils-jkl012.js (80 KB) ✅ 工具库
272
+ ├── chunk-system-mno345.js (120 KB) ✅ 路由懒加载
273
+ └── ...
274
+ ```
275
+
276
+ **性能提升:**
277
+ - 首屏加载时间:↓ 60%
278
+ - 首屏资源大小:↓ 70%
279
+ - 缓存命中率:↑ 80%
280
+
281
+ ---
282
+
283
+ ## 🔧 故障排查
284
+
285
+ ### 问题 1: 构建时报错找不到模块
286
+
287
+ **解决方案:**
288
+ ```bash
289
+ # 确保 TypeScript 配置正确
290
+ # tsconfig.json 中添加:
291
+ {
292
+ "compilerOptions": {
293
+ "moduleResolution": "node",
294
+ "esModuleInterop": true
295
+ }
296
+ }
297
+ ```
298
+
299
+ ### 问题 2: 某个包没有被正确分类
300
+
301
+ **解决方案:**
302
+ ```typescript
303
+ // 使用 debug 模式查看分类结果
304
+ const optimizer = createChunkOptimizer({ debug: true });
305
+
306
+ // 或添加自定义规则
307
+ const optimizer = createChunkOptimizer({
308
+ customRules: {
309
+ 'your-package': 'vendor-custom'
310
+ }
311
+ });
312
+ ```
313
+
314
+ ### 问题 3: 想要查看所有依赖的分类
315
+
316
+ **解决方案:**
317
+ ```typescript
318
+ const optimizer = createChunkOptimizer();
319
+ const result = optimizer.analyze();
320
+
321
+ console.log(result.dependencies);
322
+ console.log(result.categoryStats);
323
+ ```
324
+
325
+ ---
326
+
327
+ ## 📚 更多资源
328
+
329
+ - [完整文档](README.md)
330
+ - [架构设计](ARCHITECTURE.md)
331
+ - [使用示例](examples/basic-usage.ts)
332
+ - [测试脚本](test.ts)
333
+
334
+ ---
335
+
336
+ ## 💡 最佳实践
337
+
338
+ 1. ✅ **开发环境启用 debug**
339
+ ```typescript
340
+ debug: process.env.NODE_ENV === 'development'
341
+ ```
342
+
343
+ 2. ✅ **生产环境使用零配置**
344
+ ```typescript
345
+ const optimizer = createChunkOptimizer();
346
+ ```
347
+
348
+ 3. ✅ **大型项目使用自定义规则**
349
+ ```typescript
350
+ customRules: { '@company/*': 'vendor-company' }
351
+ ```
352
+
353
+ 4. ✅ **定期查看分析报告**
354
+ ```typescript
355
+ optimizer.printReport();
356
+ ```
357
+
358
+ 5. ✅ **配合 CDN 使用**
359
+ ```typescript
360
+ // 将大型库使用 CDN,其他库使用 Chunk Optimizer
361
+ ```
362
+
363
+ ---
364
+
365
+ ## 🎉 开始使用
366
+
367
+ 现在你已经掌握了 Chunk Optimizer 的基本用法,赶快在你的项目中试试吧!
368
+
369
+ 如有问题,欢迎查看 [完整文档](README.md) 或提交 Issue。
370
+
@@ -0,0 +1,240 @@
1
+ # Vite Chunk Optimizer
2
+
3
+ 🚀 智能分包优化工具 - 自动分析项目依赖并生成最优的 Vite `manualChunks` 配置
4
+
5
+ ## ✨ 特性
6
+
7
+ - 🎯 **零配置** - 开箱即用,自动检测框架和依赖
8
+ - 🧠 **智能分类** - 基于预定义规则库自动分类依赖
9
+ - 🔧 **高度可定制** - 支持自定义规则和分包策略
10
+ - 📊 **可视化分析** - 提供详细的依赖分析报告
11
+ - 🎨 **多框架支持** - 支持 Vue、React、Angular、Svelte
12
+ - 📦 **TypeScript** - 完整的类型定义支持
13
+
14
+ ## 📦 安装
15
+
16
+ ```bash
17
+ # 本项目已内置,无需安装
18
+ # 如需在其他项目使用,可以复制 build/chunk-optimizer 目录
19
+ ```
20
+
21
+ ## 🚀 快速开始
22
+
23
+ ### 基础用法(零配置)
24
+
25
+ ```typescript
26
+ // vite.config.ts
27
+ import { createChunkOptimizer } from './build/chunk-optimizer';
28
+
29
+ const optimizer = createChunkOptimizer();
30
+
31
+ export default {
32
+ build: {
33
+ rollupOptions: {
34
+ output: {
35
+ manualChunks: optimizer.generate()
36
+ }
37
+ }
38
+ }
39
+ }
40
+ ```
41
+
42
+ ### 高级用法(自定义配置)
43
+
44
+ ```typescript
45
+ import { createChunkOptimizer } from './build/chunk-optimizer';
46
+
47
+ const optimizer = createChunkOptimizer({
48
+ // 框架类型(默认自动检测)
49
+ framework: 'vue', // 'vue' | 'react' | 'angular' | 'svelte' | 'auto'
50
+
51
+ // 分包策略(未来支持)
52
+ strategy: 'balanced', // 'balanced' | 'aggressive' | 'conservative'
53
+
54
+ // 自定义规则(会覆盖默认规则)
55
+ customRules: {
56
+ 'my-custom-lib': 'vendor-custom',
57
+ '@company/*': 'vendor-company',
58
+ },
59
+
60
+ // 排除某些包
61
+ exclude: ['@types/*', 'vite'],
62
+
63
+ // 最小 chunk 大小(KB)
64
+ minChunkSize: 20,
65
+
66
+ // 调试模式(会打印详细信息)
67
+ debug: true,
68
+
69
+ // 业务代码分包策略
70
+ sourceCodeStrategy: {
71
+ views: true, // 按 views 模块分包
72
+ components: true, // 公共组件单独分包
73
+ utils: true, // 工具函数分包
74
+ store: true, // store 分包
75
+ custom: [ // 自定义业务代码规则
76
+ {
77
+ pattern: /\/src\/features\/([^/]+)\//,
78
+ chunkName: 'feature-$1'
79
+ }
80
+ ]
81
+ }
82
+ });
83
+
84
+ export default {
85
+ build: {
86
+ rollupOptions: {
87
+ output: {
88
+ manualChunks: optimizer.generate()
89
+ }
90
+ }
91
+ }
92
+ }
93
+ ```
94
+
95
+ ## 📊 分析报告
96
+
97
+ 启用调试模式查看详细的依赖分析:
98
+
99
+ ```typescript
100
+ const optimizer = createChunkOptimizer({ debug: true });
101
+
102
+ // 或者手动打印报告
103
+ optimizer.printReport();
104
+ ```
105
+
106
+ 输出示例:
107
+
108
+ ```
109
+ ============================================================
110
+ 📦 Vite Chunk Optimizer - Analysis Report
111
+ ============================================================
112
+
113
+ Framework: vue
114
+ Strategy: balanced
115
+ Total Dependencies: 45
116
+
117
+ Chunk Distribution:
118
+ vendor-vue 15 (33.3%)
119
+ vendor-utils 12 (26.7%)
120
+ vendor-element 8 (17.8%)
121
+ vendor-icons 5 (11.1%)
122
+ vendor-libs 5 (11.1%)
123
+
124
+ ============================================================
125
+ ```
126
+
127
+ ## 🎯 默认分包规则
128
+
129
+ ### Vendor 分包
130
+
131
+ | Chunk 名称 | 包含的库 | 说明 |
132
+ |-----------|---------|------|
133
+ | `vendor-vue` | vue, pinia, @vue/* | Vue 核心框架 |
134
+ | `vendor-router` | vue-router | 路由库 |
135
+ | `vendor-element` | element-plus | Element Plus UI |
136
+ | `vendor-ui` | ant-design-vue, naive-ui 等 | 其他 UI 框架 |
137
+ | `vendor-utils` | axios, dayjs, lodash 等 | 工具库 |
138
+ | `vendor-icons` | @iconify/*, unplugin-icons | 图标库 |
139
+ | `vendor-i18n` | vue-i18n, @intlify/* | 国际化 |
140
+ | `vendor-vueuse` | @vueuse/* | VueUse 工具集 |
141
+ | `vendor-libs` | 其他第三方库 | 兜底分类 |
142
+
143
+ ### 业务代码分包
144
+
145
+ | Chunk 名称 | 路径 | 说明 |
146
+ |-----------|------|------|
147
+ | `chunk-{模块名}` | /src/views/{模块}/ | 按页面模块分包 |
148
+ | `chunk-components` | /src/components/ | 公共组件 |
149
+ | `chunk-common` | /src/utils/, /src/config/ | 工具和配置 |
150
+ | `chunk-store` | /src/store/ | 状态管理 |
151
+
152
+ ## 🔧 自定义规则
153
+
154
+ ### 添加自定义分类
155
+
156
+ ```typescript
157
+ const optimizer = createChunkOptimizer({
158
+ customRules: {
159
+ // 精确匹配
160
+ 'my-lib': 'vendor-custom',
161
+
162
+ // 通配符匹配
163
+ '@company/*': 'vendor-company',
164
+
165
+ // 覆盖默认规则
166
+ 'element-plus': 'vendor-ui', // 将 element-plus 归类到 vendor-ui
167
+ }
168
+ });
169
+ ```
170
+
171
+ ### 排除某些包
172
+
173
+ ```typescript
174
+ const optimizer = createChunkOptimizer({
175
+ exclude: [
176
+ '@types/*', // 排除所有类型定义
177
+ 'vite', // 排除 vite
178
+ 'rollup', // 排除 rollup
179
+ ]
180
+ });
181
+ ```
182
+
183
+ ## 📚 API 文档
184
+
185
+ ### `createChunkOptimizer(options?)`
186
+
187
+ 创建 Chunk 优化器实例。
188
+
189
+ **参数:**
190
+ - `options` - 配置选项(可选)
191
+
192
+ **返回:**
193
+ - `ChunkOptimizer` 实例
194
+
195
+ ### `ChunkOptimizer.generate()`
196
+
197
+ 生成 `manualChunks` 函数。
198
+
199
+ **返回:**
200
+ - `ManualChunksFunction` - 可直接用于 Vite 配置
201
+
202
+ ### `ChunkOptimizer.analyze()`
203
+
204
+ 分析项目依赖。
205
+
206
+ **返回:**
207
+ - `AnalysisResult` - 包含依赖信息和统计数据
208
+
209
+ ### `ChunkOptimizer.printReport()`
210
+
211
+ 打印详细的分析报告到控制台。
212
+
213
+ ## 🎨 分包策略(未来支持)
214
+
215
+ ### Balanced(平衡)- 默认
216
+
217
+ - 合理的 chunk 数量
218
+ - 平衡首屏加载和缓存利用率
219
+ - 适合大多数项目
220
+
221
+ ### Aggressive(激进)
222
+
223
+ - 更细粒度的分包
224
+ - 最大化并行加载
225
+ - 适合大型项目
226
+
227
+ ### Conservative(保守)
228
+
229
+ - 较少的 chunk 数量
230
+ - 减少 HTTP 请求
231
+ - 适合小型项目
232
+
233
+ ## 🤝 贡献
234
+
235
+ 欢迎提交 Issue 和 Pull Request!
236
+
237
+ ## 📄 License
238
+
239
+ MIT
240
+