版本:1.3.0 | 协议:MIT | 依赖:Vite >=5.0.0 <9.0.0
写在前面
v1.3.0 的主题是:新增 generateUni 组合入口插件,一条流水线完成「扫描页面 → pages.json → 路由配置」。
v1.2.0 引入了 generatePages(扫描 Vue 文件 → 生成 pages.json),与 generateRouter(基于 pages.json → 生成路由配置)配合使用。但两者连用需要各自配置、各自读盘。v1.3.0 新增第 17 个插件 generateUni,将二者编排为一条流水线------内存数据直传不重复读盘,等价于两插件连用,但更简单、更高效。
同时,本版为 standalone 的 generatePages 补齐了 <route-config> 自定义块的虚拟模块拦截,并优化了 proxyManager 在生产构建时的行为。
本版重点:
| 能力 | 一句话说明 | 你需要做什么 |
|---|---|---|
新增 generateUni |
一键流水线:扫描页面 → pages.json → 路由配置(内存直传) | 用 generateUni 替换两插件连用 |
| 配置分组 | 顶层公共项 + pages 子对象 + router 子对象,避免 20+ 平铺 |
按分组配置,结构清晰 |
| generatePages 增强 | 补齐 <route-config> 块虚拟模块拦截,生产构建不再报错 |
无需配置,自动生效 |
| proxyManager 优化 | 生产构建完全跳过代理规则加载与配置生成 | 无需配置,自动生效 |
| 类型重构 | uni-app 通用类型抽离到 generate 公共模块,消除反向依赖 | 无感知,类型导出保持兼容 |
升级方式 :修改 devDependencies 中版本号为 ^1.3.0。无 Breaking Change,1.x 用户可平滑升级。
一、5 分钟快速上手
1.1 安装与升级
json
{
"devDependencies": {
"@meng-xi/vite-plugin": "^1.3.0"
}
}
1.2 一键流水线
generateUni 替代 generatePages + generateRouter 连用:
typescript
// vite.config.ts
import { defineConfig } from 'vite'
import { generateUni } from '@meng-xi/vite-plugin'
export default defineConfig({
plugins: [
generateUni({
pagesJsonPath: 'src/pages.json', // 顶层:两阶段共用
pages: {
// 阶段一:页面生成(generatePages 参数)
pagesDir: 'src/pages',
subPackages: [{ root: 'pages-sub', dir: 'src/pages-sub' }],
entryPage: 'pages/index/index',
tabBar: { color: '#999999', selectedColor: '#42b883' }
},
router: {
// 阶段二:路由生成(generateRouter 参数)
outputPath: 'src/router.config.ts',
nameStrategy: 'camelCase',
dts: 'src/router.d.ts'
}
})
]
})
1.3 从两插件连用迁移
| v1.2.0 写法(连用) | v1.3.0 写法(generateUni) |
|---|---|
generatePages({ pagesDir, subPackages, entryPage, tabBar }) |
generateUni({ pages: { pagesDir, subPackages, entryPage, tabBar } }) |
generateRouter({ outputPath, nameStrategy, dts }) |
generateUni({ router: { outputPath, nameStrategy, dts } }) |
| 两插件各自读盘、各自写盘 | 阶段一内存产出直传阶段二,不重复读盘 |
二、generateUni 插件详解
2.1 流水线编排
scss
阶段一(页面生成) 阶段二(路由生成)
扫描 Vue 文件 + <route-config> → 直接消费内存 pages 对象
↓ ↓
内存 pages 数据 生成路由配置 + 可选 dts
↓
写盘 pages.json(供 uni() 使用)
- 阶段一 :扫描页面 +
<route-config>产出内存 pages 数据并写盘pages.json - 阶段二 :直接消费阶段一的内存 pages 对象生成路由配置文件(+ 可选 dts),不再「先写盘再读盘」
2.2 配置分组
为避免 20+ 平铺选项,generateUni 采用分组配置:
| 层级 | 说明 | 对应插件 |
|---|---|---|
| 顶层 | 两阶段共用:pagesJsonPath / watch |
- |
pages |
阶段一专有参数:pagesDir / subPackages / routeConfigBlock / entryPage / titleFallback / tabBar / includeExtensions / excludePatterns |
generatePages |
router |
阶段二专有参数:outputPath / outputFormat / nameStrategy / metaMapping / exportTypes / preserveRouteChanges / headerTemplate / customFields / dts / includeSubPackages |
generateRouter |
2.3 串行生成与监听
- 开发模式下
watch: true(默认)监听主包与分包目录,页面文件变化时串行重跑「阶段一 + 阶段二」,避免并发读写竞态 - 生成任务经 Promise 队列串行化,即使保存文件高频触发也安全
2.4 route-config 块拦截
generateUni 注册 transform 钩子,将 <route-config> 自定义块产生的虚拟模块请求(如 xxx.vue?vue&type=route-config&index=0)替换为空模块,避免构建时被当作 JavaScript 解析报错。块内容已由阶段一扫描时解析,无需在模块系统中保留。
2.5 保留能力
generateUni 完整继承两插件能力:
- generatePages 侧 :tabBar 归集 / 分包 / 合并策略(保留
globalStyle/condition)/ 入口页固定 / tab 排序 - generateRouter 侧 :
preserveRouteChanges(保留用户对路由的修改)/metaMapping/headerTemplate/customFields/dts类型声明
2.6 配置选项
typescript
interface GenerateUniOptions extends BasePluginOptions {
pagesJsonPath?: string // pages.json 路径,默认 'src/pages.json'
watch?: boolean // 监听页面目录变化,默认 true
pages?: GeneratePagesOptions // 阶段一参数(页面生成)
router?: GenerateRouterOptions // 阶段二参数(路由生成)
}
三、generatePages 增强
为 standalone 的 generatePages 补充 <route-config> 自定义块虚拟模块拦截(与 generateUni 行为一致,此前仅 generateUni 具备):
- 注册
transform钩子,将xxx.vue?vue&type=route-config&index=0请求替换为空模块 - 避免生产构建把块内容当作 JavaScript 解析而报错
- 无需任何配置,独立使用
generatePages时同样安全
typescript
// v1.3.0 起,独立使用 generatePages 生产构建不再报错
import { generatePages } from '@meng-xi/vite-plugin'
generatePages({ pagesDir: 'src/pages' })
四、proxyManager 优化
生产构建优化:config 钩子新增 env.command === 'build' 拦截,构建时完全跳过代理规则加载与配置生成。
| 变更点 | 说明 |
|---|---|
| 避免无意义加载 | build 阶段不再加载 .proxyrc.ts、不再解析 envPrefix 覆盖 |
| 消除误导日志 | 移除 build 时的「已加载 X 条代理规则 (环境: production)」日志 |
| 行为不变 | 开发服务器(dev)下功能、规则、中间件、日志逻辑完全保持不变 |
背景:
config钩子在 serve 与 build 两个阶段都会执行,而代理配置与中间件仅对开发服务器有效,此前打包时会白白加载规则并输出误导性日志。
五、类型重构
uni-app 通用类型(UniAppPageConfig / UniAppTabBarConfig / UniAppPagesJson)从 generateRouter/types.ts 抽离到新的公共模块 generate/types.ts:
- 消除反向依赖 :
generatePages/generateUni等不再反向依赖generateRouter的类型 - 子路径兼容 :
generateRouter转发导出这些类型,原导入路径不受影响 - 无感升级:所有类型导出保持兼容,用户无需修改任何代码
六、子路径导出变更
新增
@meng-xi/vite-plugin/plugins/generate/generate-uni:导出generateUni及类型GenerateUniOptions@meng-xi/vite-plugin/plugins/generate:聚合导出generateUni及其类型
typescript
// 按需导入(推荐,利于 Tree-shaking)
import { generateUni } from '@meng-xi/vite-plugin/plugins/generate/generate-uni'
// 或分组聚合导入
import { generateUni } from '@meng-xi/vite-plugin/plugins/generate'
七、插件清单(变更)
插件总数由 16 增至 17,分组由 7 组不变:
| 分组 | 插件 |
|---|---|
| generate | autoImport、generateUni、generatePages、generateRouter、generateVersion(由 4 增至 5) |
| analyze | buildProgress、bundleAnalyzer |
| compress | compressAssets、imageOptimizer |
| copy | assetManifest、copyFile |
| guard | envGuard |
| inject | faviconManager、htmlInject、loadingManager、versionUpdateChecker |
| proxy | proxyManager |
八、实战场景
8.1 uni-app 项目:一条流水线
typescript
// vite.config.ts
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import { generateUni } from '@meng-xi/vite-plugin'
export default defineConfig({
plugins: [
uni(),
// 一条流水线:扫描页面 → pages.json → 路由配置
generateUni({
pagesJsonPath: 'src/pages.json',
watch: true,
pages: {
pagesDir: 'src/pages',
subPackages: [{ root: 'pages-sub', dir: 'src/pages-sub' }],
entryPage: 'pages/index/index',
titleFallback: 'filename',
tabBar: {
color: '#999999',
selectedColor: '#42b883',
backgroundColor: '#ffffff'
}
},
router: {
outputPath: 'src/router.config.ts',
nameStrategy: 'camelCase',
headerTemplate: '{name} {date:YYYY-MM-DD} {version}',
dts: 'src/router.d.ts'
}
})
]
})
页面内就近声明:
vue
<!-- src/pages/mine/mine.vue -->
<route-config>
{
"title": "我的",
"isTab": true,
"tab": {
"iconPath": "static/tab/mine.png",
"selectedIconPath": "static/tab/mine-active.png"
}
}
</route-config>
8.2 保留两插件独立使用
generatePages 与 generateRouter 保持不变,仍可独立使用:
typescript
// 仅生成 pages.json
generatePages({ pagesDir: 'src/pages' })
// 仅生成路由配置(基于已有的 pages.json)
generateRouter({ pagesJsonPath: 'src/pages.json', outputPath: 'src/router.config.ts' })
九、注意事项
generateUni等价于generatePages+generateRouter连用,但内存直传不重复读盘,且配置分组更清晰pages/router子对象分别等价于两个插件的全部选项,缺失时使用默认值- 开发模式
watch: true监听主包与分包目录,串行重跑整条流水线 <route-config>块拦截对generateUni与 standalonegeneratePages均生效- 类型导出完全兼容,原
generateRouter子路径的 uni-app 类型导入不受影响
写在最后
v1.3.0 将 uni-app 页面与路由的生成链路收敛为一条流水线:generateUni 一个插件、一次配置、一轮执行,完成「扫描页面 → pages.json → 路由配置」全流程。
- 流水线编排让两插件协作从「手动连用」升级为「自动编排」,且内存直传消除读盘往返
- 配置分组避免 20+ 平铺选项,顶层 / pages / router 三层结构一目了然
- 两插件增强 (
generatePages块拦截 +proxyManager构建跳过)修复了生产构建的潜在报错与无意义开销 - 零破坏性升级让 1.x 用户可平滑迁移
后续版本将聚焦于:generateUni 更多阶段扩展(如 manifest.json 配置生成)、uni-app 条件编译深度集成。如果你有任何建议或问题,欢迎在 GitHub Issues 反馈。