更新记录

1.4.0(2026-08-28) 下载此版本

新增 defineUniPage 宏与页面生成架构重构:扫描页面 → pages.json → 路由配置一条流水线,配套公共 DirectoryWatcher / TaskQueue 统一监听与串行生成,插件总数增至 17 个

页面配置:defineUniPage 宏(新增)

新增 defineUniPage 宏:在 &lt;script setup&gt;(或 &lt;script&gt; 顶层)中调用,功能与 <route-config> 自定义块一致,写法更贴近 JS/TS。

能力 说明
优先级 同一页面同时声明宏与 <route-config> 时,以宏为准(顶层字段按宏覆盖)
参数 JS 对象字面量,支持注释、单引号、尾随逗号与嵌套对象(tab / style / meta
运行时无痕 宏在扫描时被消费,构建时自动移除调用,无需 import
IDE 识别 自动生成全局类型声明 src/define-uni-page.d.tsdts 选项可自定义路径或 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:autoImportgenerateUnigeneratePagesgenerateRoutergenerateVersion

子路径导出(新增)

  • @meng-xi/vite-plugin/plugins/generate/generate-uni 新增导出:generateUni 及类型 GenerateUniOptions
  • @meng-xi/vite-plugin/plugins/generate 聚合导出 generateUni 及其类型

1.2.0(2026-08-25) 下载此版本

新增 generatePages 插件,扫描 Vue 文件 + <route-config> 自定义块动态生成 pages.json,插件总数增至 16 个

generatePages(新增)

新增第 16 个插件:扫描通过页面目录与页面内 <route-config> 自定义块,自动生成 / 更新 uni-app 的 pages.json 页面相关配置(pages / subPackages / tabBar),彻底解放手动配置页面。

核心能力

能力 配置 / 用法 说明
主包页面生成 pagesDir: 'src/pages' 递归扫描生成 pages,页面路径稳定排序
分包页面生成 subPackages: [{ root, dir }] 自动扫描生成 subPackages
tabBar 归集 <route-config> 声明 isTab + tabBar 模板 自动将 tab 页面归集到 tabBar.list
就近声明配置 <route-config> 自定义块 标题 / 样式 / meta / name / tab 在页面内就近声明
入口页固定 entryPage: 'pages/index/index' 保证 pages[0] 为启动页,不被字母序排序改写
tabBar 排序 <route-config>.tab.order order 升序排列 list,仅用于排序、不写入输出
合并策略 自动(无需配置) 仅覆盖页面部分,保留 globalStyle / condition
开发监听 watch: true(默认) 页面目录文件变化时自动重新生成

route-config 自定义块

在页面内就近声明配置(内容为 JSON,支持注释):

<route-config>
{
  "title": "首页",
  "name": "HomePage",
  "meta": { "requireAuth": false },
  "isTab": true,
  "tab": { "text": "首页", "iconPath": "static/tab/home.png", "order": 0 }
}
</route-config>
字段 类型 说明
title string 页面标题,映射为 style.navigationBarTitleText
name string 页面名称,写入 name 字段
style object 原样写入 style 字段
meta object 原样写入 meta 字段
isTab boolean 是否为 tabBar 页面,自动归集到 tabBar.list
tab TabBarItemOverride tabBar 图标 / 文本 / order 排序权重

配置选项

选项 类型 默认值 说明
pagesJsonPath string 'src/pages.json' pages.json 文件路径
pagesDir string 'src/pages' 主包页面目录
subPackages SubPackageConfig[] [{ root:'pages-sub', dir:'src/pages-sub' }] 分包配置列表(目录缺失时跳过)
routeConfigBlock string 'route-config' 页面配置自定义块名称
entryPage string 现有 pages[0] 主包入口页路径,固定为 pages[0]
titleFallback 'filename' \| 'none' 'filename' 标题缺失时的兜底策略
tabBar TabBarTemplate - tabBar 模板(提供后才生成)
includeExtensions string[] ['.vue'] 页面文件扩展名列表
excludePatterns string[] ['node_modules'] 排除的路径模式列表
watch boolean true 监听页面目录变化自动重新生成

类型完善

  • TabBarItemOverride 复用为 overrides 元素类型,与页面内 tab 保持一致
  • 页面排序 orderMainPages 移入 helpers 目录,保持主插件文件聚焦

与 generateRouter 的关系

generateRouter 是「读 pages.json → 生成路由配置」,generatePages 反向「扫描 Vue 文件 → 生成 pages.json」。二者可组合使用(generatePages 应置于 generateRouter 之前)。

插件清单(变更)

  • 插件总数由 15 增至 16,分组由 7 组不变
  • generate 分组由 3 增至 4:autoImportgeneratePagesgenerateRoutergenerateVersion

子路径导出(新增)

  • @meng-xi/vite-plugin/plugins/generate/generate-pages 新增导出:generatePages 及类型 GeneratePagesOptionsRouteConfigBlockSubPackageConfigTabBarTemplateTabBarItemOverrideScannedPage
  • @meng-xi/vite-plugin/plugins/generate 聚合导出 generatePages 及其关键类型
查看更多

平台兼容性

uni-app(3.8.2)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟

uni-app x(3.8.2)

Chrome Safari Android iOS 鸿蒙 微信小程序

其他

多语言 暗黑模式 宽屏模式

@meng-xi/vite-plugin

license npm npm

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.tspages.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 各插件子模块

License

MIT

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议