更新记录
1.4.1(2026-09-16) 下载此版本
修复 generatePages / generateUni 在自定义页面扩展名(.uvue)场景下的两个缺陷,uni-app x 项目可正常使用 .uvue 页面
pages.json 路径残留扩展名(修复)
问题:页面路径剥离逻辑此前写死仅匹配 .vue / .nvue(/\.(vue|nvue)$/)。当 includeExtensions 配置为 .uvue 等自定义扩展名时,生成的 pages.json 中 path 残留扩展名(如 pages/home/index.uvue),uni-app 按此路径找不到页面。
修复:页面路径改为按文件实际扩展名动态剥离——扩展名命中 includeExtensions 列表(忽略大小写、容忍前导点)才剥离,未配置时保持原 .vue / .nvue 行为。
| 场景 | 此前 | 现在 |
|---|---|---|
includeExtensions: ['.uvue'] |
pages/home/index.uvue(错误) |
pages/home/index |
未配置 includeExtensions |
pages/home/index |
pages/home/index(保持) |
generatePages 与 generateUni 共用 producePages 流水线,一处修复两插件同时生效。
.uvue 页面 defineUniPage 宏未剥离(修复)
问题:SFC script 虚拟模块识别此前使用 id.includes('.vue'),index.uvue?vue&type=script&setup=true 无法命中,导致 defineUniPage 宏调用未在构建时移除、运行时抛出 ReferenceError。
修复:识别规则改为正则 /\.(vue|uvue|nvue)(\?|$)/,兼容 .uvue / .nvue;generatePages / generateUni 两处同步修正。
另外:文档同步补充 includeExtensions 说明——生成的 path 不含扩展名。
1.4.0(2026-08-28) 下载此版本
新增 defineUniPage 宏与页面生成架构重构:扫描页面 → pages.json → 路由配置一条流水线,配套公共 DirectoryWatcher / TaskQueue 统一监听与串行生成,插件总数增至 17 个
页面配置:defineUniPage 宏(新增)
新增 defineUniPage 宏:在 <script setup>(或 <script> 顶层)中调用,功能与 <route-config> 自定义块一致,写法更贴近 JS/TS。
| 能力 | 说明 |
|---|---|
| 优先级 | 同一页面同时声明宏与 <route-config> 时,以宏为准(顶层字段按宏覆盖) |
| 参数 | JS 对象字面量,支持注释、单引号、尾随逗号与嵌套对象(tab / style / meta) |
| 运行时无痕 | 宏在扫描时被消费,构建时自动移除调用,无需 import |
| IDE 识别 | 自动生成全局类型声明 src/define-uni-page.d.ts(dts 选项可自定义路径或 false 关闭),Vue (Official) / Volar / tsc 开箱识别,获得类型提示与编译期检查 |
使用示例:
defineUniPage({
title: '首页',
isTab: true,
tab: { order: 0 }
})
<route-config> 自定义块同步增强:解析支持 JSONC 尾随逗号(与 lang="jsonc" 的 IDE 高亮语义一致)。
generatePages / generateUni(重构)
- 抽取公共
producePages()流水线:扫描页面 +<route-config>/defineUniPage→ 组装 → 合并,内存产出完整 pages 对象(不写盘) - generatePages 直接写盘,generateUni 内存直传阶段二,消除「先写盘再读盘」的往返
- 删除 generateUni 内部重复实现,统一复用 generatePages 公共逻辑
公共模块(新增)
| 模块 | 说明 |
|---|---|
| DirectoryWatcher(common/fs) | 目录递归监听器:统一管理多目录监听,提供 start / stop / size;平台不支持 recursive 时自动降级跳过并告警,避免插件崩溃 |
| TaskQueue(common/concurrency) | 串行任务队列:按提交顺序串行执行异步任务,单个任务失败不阻塞后续;用于高频文件监听时的并发读改写防护 |
监听与串行化统一
- generatePages / generateUni / generateRouter 三者统一使用 TaskQueue 串行生成,避免高频变更时并发读改写竞态
- generatePages / generateUni 统一使用 DirectoryWatcher 管理页面目录监听(此前为各自私有的
fs.watch循环) - generateRouter 监听 pages.json 变更时同样走串行队列(此前直接 await 重新生成)
factory(增强)
- 新增
FunctionHookMap类型:registerHook/registerOrderedHook的钩子名泛型约束收紧为仅限函数型钩子(排除 name / enforce / apply 等非函数属性) - 新增可重写的
getBaseDefaults()方法,便于子类覆盖基础默认配置(enabled / verbose / errorStrategy)
细节修复
- generatePages / generateUni 的
<route-config>虚拟模块请求匹配由id.includes('vue')收紧为id.includes('?vue'),避免误拦截 <route-config>解析支持 JSONC 尾随逗号,与lang="jsonc"的 IDE 高亮语义一致
1.3.0(2026-08-26) 下载此版本
新增 generateUni 组合入口插件,一条流水线完成「扫描页面 → pages.json → 路由配置」,插件总数增至 17 个
generateUni(新增)
新增第 17 个插件:将 generatePages(扫描页面 → 生成 pages.json)与 generateRouter(基于 pages.json → 生成路由配置)编排为一条流水线,内存数据直传不重复读盘,等价于两插件连用。原有两个插件保持不变,仍可独立使用。
核心能力:
| 能力 | 说明 |
|---|---|
| 流水线编排 | 阶段一扫描页面 + <route-config> 产出内存 pages 数据并写盘 pages.json;阶段二直接消费内存数据生成路由配置(+ 可选 dts) |
| 避免读盘往返 | 阶段二不再「先写盘再读盘」,直接使用阶段一的内存 pages 对象 |
| 配置分组 | 顶层公共项(pagesJsonPath / watch)+ pages 子对象(generatePages 参数)+ router 子对象(generateRouter 参数),避免 20+ 平铺选项 |
| 串行生成 | 监听页面目录变更时串行重跑「阶段一 + 阶段二」,避免并发读写竞态 |
| route-config 块拦截 | 拦截 <route-config> 虚拟模块请求为空模块,避免构建时被当作 JavaScript 解析报错 |
| 保留能力 | 完整继承 generatePages 的 tabBar 归集 / 分包 / 合并策略,与 generateRouter 的 preserveRouteChanges / metaMapping / dts 等 |
使用示例:
generateUni({
pagesJsonPath: 'src/pages.json',
pages: {
pagesDir: 'src/pages',
subPackages: [{ root: 'pages-sub', dir: 'src/pages-sub' }],
entryPage: 'pages/index/index',
tabBar: { color: '#999999', selectedColor: '#42b883' }
},
router: {
outputPath: 'src/router.config.ts',
nameStrategy: 'camelCase',
dts: 'src/router.d.ts'
}
})
迁移:原 generatePages({...}) + generateRouter({...}) 连用等价替换为 generateUni({ pages: {...}, router: {...} })。
generatePages(增强)
为 standalone 的 generatePages 补充 <route-config> 自定义块虚拟模块拦截:注册 transform 钩子,将 xxx.vue?vue&type=route-config&index=0 请求替换为空模块,避免生产构建把块内容当作 JavaScript 解析而报错(与
generateUni 行为一致,此前仅 generateUni 具备)。
proxyManager(优化)
生产构建优化:config 钩子新增 env.command === 'build' 拦截,构建时完全跳过代理规则加载与配置生成。
| 变更点 | 说明 |
|---|---|
| 避免无意义加载 | build 阶段不再加载 .proxyrc.ts、不再解析 envPrefix 覆盖 |
| 消除误导日志 | 移除 build 时的「已加载 X 条代理规则 (环境: production)」日志 |
| 行为不变 | 开发服务器(dev)下功能、规则、中间件、日志逻辑完全保持不变 |
背景:
config钩子在 serve 与 build 两个阶段都会执行,而代理配置与中间件仅对开发服务器有效,此前打包时会白白加载规则并输出误导性日志。
插件清单(变更)
- 插件总数由 16 增至 17,分组由 7 组不变
- generate 分组由 4 增至 5:
autoImport、generateUni、generatePages、generateRouter、generateVersion
子路径导出(新增)
@meng-xi/vite-plugin/plugins/generate/generate-uni新增导出:generateUni及类型GenerateUniOptions@meng-xi/vite-plugin/plugins/generate聚合导出generateUni及其类型
平台兼容性
uni-app(3.8.4)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
uni-app x(3.8.4)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| √ | √ | √ | × |
@meng-xi/vite-plugin
Vite 实用插件集与插件开发框架(uni-app 版本)。
📖 完整文档:https://mengxi-studio.github.io/vite-plugin/
特性
- 开箱即用 - 17 个实用插件,覆盖构建、产物、路由、版本、HTML、代理等场景
- 插件开发框架 - 导出 BasePlugin、Logger、Validator,快速构建自定义插件
- 通用工具库 - 内置 14 大 Common 工具模块,支持子路径按需导入
- uni-app 适配 - 通过 uni_modules 集成,无需 npm 安装
安装
uni_modules(推荐)
将 vite-plugin 目录复制到项目的 uni_modules 目录下:
src/
└── uni_modules/
└── vite-plugin/
└── js_sdk/
└── index.mjs
npm
pnpm add @meng-xi/vite-plugin -D
npm 方式需将导入路径改为
@meng-xi/vite-plugin。
快速开始
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import {
assetManifest,
autoImport,
buildProgress,
compressAssets,
copyFile,
envGuard,
faviconManager,
generateUni,
generateVersion,
htmlInject,
imageOptimizer,
loadingManager,
proxyManager,
versionUpdateChecker
} from './uni_modules/vite-plugin/js_sdk/index.mjs'
export default defineConfig({
plugins: [
uni(),
// 按需启用插件
autoImport({ imports: ['vue'], vueTemplate: true }),
generateUni({
pages: { pagesDir: 'pages', entryPage: 'pages/index/index' },
router: { dts: true }
}),
generateVersion({ format: 'datetime', outputType: 'both' }),
envGuard({ required: { VITE_API_URL: { type: 'url', required: true } } }),
loadingManager({ defaultVisible: true, autoHideOn: 'DOMContentLoaded' }),
proxyManager({ rules: [{ context: '/api', target: 'https://api.example.com', changeOrigin: true }] })
]
})
页面配置:<route-config> 与 defineUniPage 宏
使用 generatePages / generateUni 时,页面配置可在 .vue 文件中就近声明,支持两种方式:
defineUniPage 宏(优先级更高):在 <script setup>(或 <script> 顶层)中调用,写法更贴近 JS/TS,参数为对象字面量,支持注释、单引号与尾随逗号:
<script setup lang="ts">
defineUniPage({
title: '首页',
isTab: true,
tab: { order: 0 }
})
</script>
同一页面同时声明宏与 <route-config> 时,以宏为准(顶层字段按宏覆盖)。插件默认自动生成全局类型声明 src/define-uni-page.d.ts(pages.dts 可自定义路径或 false 关闭),IDE 无需 import 即可识别宏,并获得类型提示与编译期检查。
<route-config> 自定义块(优先级低于宏):内容为 JSONC(支持注释与尾随逗号),建议添加 lang="jsonc" 属性,让 IDE(Vue (Official) / Volar)按 JSONC 语法高亮:
<route-config lang="jsonc">
{
"title": "首页",
"isTab": true,
"tab": { "order": 0 }
}
</route-config>
内置插件
| 插件 | 说明 |
|---|---|
| assetManifest | 资源清单生成 |
| autoImport | 自动导入(预设/别名/类型/目录扫描) |
| buildProgress | 终端构建进度条 |
| bundleAnalyzer | 构建产物体积分析 |
| compressAssets | 构建产物压缩(gzip/brotli) |
| copyFile | 文件复制 |
| envGuard | 环境变量校验 |
| faviconManager | 网站图标管理 |
| generateUni | 组合入口:页面配置 + 路由配置一条流水线(支持 <route-config> / defineUniPage 宏) |
| generateRouter | 路由配置生成(uni-app) |
| generatePages | 页面配置生成(动态生成 pages.json,支持 <route-config> / defineUniPage 宏) |
| generateVersion | 版本号生成与注入 |
| htmlInject | HTML 内容注入 |
| imageOptimizer | 图片优化与格式转换 |
| loadingManager | 全局 Loading 状态管理 |
| proxyManager | 开发服务器代理管理 |
| versionUpdateChecker | 运行时版本更新检查 |
各插件详细配置与 API 请查阅 官网插件文档。
插件开发框架
导出完整的插件开发框架,帮助快速构建符合规范的自定义 Vite 插件。
import { BasePlugin, createPluginFactory } from './uni_modules/vite-plugin/js_sdk/index.mjs'
import type { Plugin } from 'vite'
class MyPlugin extends BasePlugin<{ prefix?: string }> {
protected getPluginName() {
return 'my-plugin'
}
protected getDefaultOptions() {
return { prefix: '[app]' }
}
protected validateOptions() {
this.validator.field('prefix').string().notEmpty().validate()
}
protected addPluginHooks(plugin: Plugin) {
plugin.writeBundle = {
order: 'post',
handler: async () => {
await this.safeExecute(async () => {
this.logger.info('插件执行中...')
}, '执行自定义逻辑')
}
}
}
}
export const myPlugin = createPluginFactory(MyPlugin)
核心 API: BasePlugin(插件基类)、createPluginFactory(转换为 Vite 插件函数)、Logger(日志管理器)、Validator(链式配置验证器)。
详细 API 请查阅 官网框架文档。
Common 工具模块
内置通用工具函数库,按功能模块组织,支持子路径按需导入。
// 示例:按需导入
import { formatFileSize } from './uni_modules/vite-plugin/js_sdk/common/format/index.mjs'
import { scanDirectory } from './uni_modules/vite-plugin/js_sdk/common/fs/index.mjs'
import { deepMerge } from './uni_modules/vite-plugin/js_sdk/common/object/index.mjs'
import { normalizePath } from './uni_modules/vite-plugin/js_sdk/common/path/index.mjs'
| 子路径 | 描述 |
|---|---|
common/code |
JS 关键字、注释与字符串移除 |
common/compress |
gzip 压缩大小计算 |
common/concurrency |
并发限制批量异步执行 + 串行任务队列 |
common/env |
.env 文件解析 |
common/format |
日期、模板、文件大小格式化 |
common/fs |
文件检查、复制、扫描、写入、目录递归监听 |
common/hash |
随机哈希生成 |
common/html |
HTML 注入、消毒、属性转义 |
common/object |
深度合并对象 |
common/path |
路径规范化、扩展名过滤 |
common/script |
回调函数体安全包装 |
common/string |
大小写转换、JSON 注释移除 |
common/ui |
终端 ANSI 颜色码 |
common/validation |
链式验证器、全局名称校验 |
各工具函数详细 API 请查阅 官网工具文档。
子路径导出
| 子路径 | 描述 |
|---|---|
./js_sdk/index.mjs |
主入口(全部导出) |
./js_sdk/plugins/index.mjs |
所有插件 |
./js_sdk/factory/index.mjs |
插件开发框架 |
./js_sdk/logger/index.mjs |
日志管理器 |
./js_sdk/common/index.mjs |
所有工具函数 |
./js_sdk/common/<module>/index.mjs |
各工具子模块 |
./js_sdk/plugins/<name>/index.mjs |
各插件子模块 |

收藏人数:
https://github.com/MengXi-Studio/vite-plugin
https://www.npmjs.com/package/@meng-xi/vite-plugin
下载插件并导入HBuilderX
下载插件ZIP
赞赏(0)
下载 80
赞赏 0
下载 12701461
赞赏 1956
赞赏
京公网安备:11010802035340号