一站式汇总:TinyVue 工具、案例与真实落地经验
程序员最怕什么?不是写代码,不是修 bug,而是------"别人已经写好了,你却还在从零开始。"
这篇文章,咱们不讲原理,不讲架构,只讲工具和案例。就是那些让你少干活、早下班、多摸鱼的"效率神器",以及那些已经踩过坑、淌过河的"真实落地经验"。
抄作业不丢人,丢人的是不知道有作业可以抄。
一、TinyThemeTool------主题定制的"一键换装"
前端开发有一道永恒的难题:设计师给的色值和组件库默认色值不一样。
每次设计师丢过来一份配色方案,你就要对着组件库的 CSS 文件逐行修改,改完还要全局检查有没有遗漏。一个项目改一次也就忍了,十个项目改十次?你是要原地去世吗?
TinyVue 提供了 TinyThemeTool------主题定制工具,专门解决这个痛点。
使用方式
TinyThemeTool 让你通过配置文件的方式一键生成主题,不用手改 CSS:
js
// theme.config.js ------ 你的主题配置
module.exports = {
name: 'my-custom-theme',
// 主色调配置
colors: {
primary: '#667eea', // 主色------设计师指定的品牌色
success: '#4ECDC4',
warning: '#FFE66D',
danger: '#FF6B6B',
info: '#95E1D3'
},
// 尺寸配置
sizes: {
borderRadius: '8px',
fontSize: '14px'
},
// 其他定制项...
}
运行主题生成命令后,TinyThemeTool 会自动输出一套完整的主题 CSS 文件,包含所有组件的样式适配。你只需要在项目中引入这份 CSS,全站主题一键切换。
css
/* 生成的主题文件会自动包含 --tv- 前缀的 CSS 变量 */
:root {
--tv-color-primary: #667eea;
--tv-color-success: #4ECDC4;
--tv-color-warning: #FFE66D;
--tv-color-danger: #FF6B6B;
--tv-border-radius-base: 8px;
--tv-font-size-base: 14px;
/* ...上百个变量自动生成 */
}
这就像你买了一辆车,不满意白色,去 4S 店选了个紫色,他们会帮你把所有该喷漆的地方都喷好,你不用自己拿刷子涂。
真实落地经验
某企业级项目中,同时有 5 个子系统需要不同品牌色。用了 TinyThemeTool 之后,每个子系统只需要一份配置文件,生成各自的主题包。5 个子系统,5 份配置,5 分钟搞定。以前这活儿需要一个前端改一周。
另一个经验:主题配置要做版本管理 。把 theme.config.js 纳入 Git 管理,每次设计师改色值,你只需要修改配置文件,重新生成主题,而不是手动在 CSS 里找找找改改改。
二、@opentiny/unplugin-tiny-vue------自动导入插件
为什么需要自动导入?
传统组件库使用方式是这样的:
vue
<!-- 每个组件都要手动 import -->
<script setup>
import Button from '@opentiny/vue-button'
import Alert from '@opentiny/vue-alert'
import Modal from '@opentiny/vue-modal'
import Input from '@opentiny/vue-input'
import Select from '@opentiny/vue-select'
// ...用20个组件就要写20行import
</script>
<template>
<tiny-button>提交</tiny-button>
<tiny-alert>提示</tiny-alert>
<!-- ... -->
</template>
20 个组件,20 行 import。100 个组件?你光写 import 就能写一个文件。这不是"开发",这是"抄名录"。
自动导入一键搞定
@opentiny/unplugin-tiny-vue 插件帮你自动处理 import------你在模板中写了 <tiny-button>,插件自动帮你引入 @opentiny/vue-button。就像有个隐形助手在你身后帮你填表,你只管签字就行。
js
// vite.config.js
import UnpluginTinyVue from '@opentiny/unplugin-tiny-vue/vite'
export default defineConfig({
plugins: [
UnpluginTinyVue({
// 配置选项
// 默认会自动扫描模板中所有 tiny- 前缀的组件并自动导入
})
]
})
js
// webpack 项目用 webpack 版本
const UnpluginTinyVue = require('@opentiny/unplugin-tiny-vue/webpack')
module.exports = {
plugins: [
UnpluginTinyVue()
]
}
配置完之后,你的代码可以简化成这样:
vue
<template>
<!-- 不需要 import,插件自动帮你引入 -->
<tiny-button type="primary">提交</tiny-button>
<tiny-alert type="success">操作成功</tiny-alert>
<tiny-modal v-model="visible">弹窗内容</tiny-modal>
<tiny-input v-model="value"></tiny-input>
<tiny-select v-model="selected"></tiny-select>
</template>
<script setup>
// 无 import,全部自动搞定
// 你只需要关注业务逻辑
const visible = ref(false)
const value = ref('')
const selected = ref('')
</script>
代码量直接砍半,而且再也不怕忘了 import 导致组件不渲染了。
真实落地经验
一个大中型项目中,用了自动导入插件后,每个页面的 <script setup> 平均少了 15-20 行 import 代码。整个项目少了几千行"废代码"。更重要的是------新人入职不再需要翻文档查"这个组件到底叫什么包名",直接在模板里用 tiny-xxx,插件帮你搞定一切。
注意事项:自动导入插件和按需加载插件不要同时用,功能有重叠。选择一个就好。
三、@opentiny/vue-vite-import------按需加载 Vite 插件
如果你的项目用 Vite 构建,而且不想用自动导入(比如你喜欢手动 import 的安全感),那可以用 按需加载插件。
为什么按需加载?
全量引入组件库,就像你去超市买了一整车的东西回家------你可能只需要一瓶酱油,但你把整个超市都搬回来了。项目体积暴涨,首屏加载变慢。
按需加载就是让你只买那一瓶酱油:
js
// vite.config.js
import ViteImport from '@opentiny/vue-vite-import'
export default defineConfig({
plugins: [
ViteImport({
libraryName: '@opentiny/vue',
// 只打包你实际用到的组件
})
]
})
配置后,即使你在代码中写了 import TinyVue from '@opentiny/vue'(全量引入),构建时也只会打包你实际用到的组件。就像你告诉快递员:"我买了整辆车,但其实我只要方向盘和轮胎,其他不用发货。"
真实落地经验
一个项目从全量引入切换到按需加载后,打包体积减少了 约 40%。首屏加载时间从 3.2 秒降到 1.8 秒。这效果,比你优化一百个 CSS 选择器都管用。
经验总结:
- 小项目(用不到10个组件):全量引入也没问题,体积差异不大
- 中项目(10-30个组件):按需加载明显有效
- 大项目(30+个组件):按需加载是必须的
四、@opentiny/utils------公共工具函数包
每个前端项目都有一堆"散落的工具函数"------格式化日期、防抖节流、XSS 过滤......它们像流浪猫一样在各种 utils.js 里游荡,既不统一也不安全。
TinyVue 提供了 @opentiny/utils 公共函数包,把这些常用工具统一管理起来。
常用函数示例
js
import { formatNumber, debounce, throttle, xssFilter } from '@opentiny/utils'
// 数字格式化------再也不用自己拼 toFixed 了
const price = formatNumber(1234567.89, 2) // "1,234,567.89"
// 防抖------搜索框输入延迟触发
const debouncedSearch = debounce((keyword) => {
fetchSearchResults(keyword)
}, 300)
// 节流------滚动事件不疯狂触发
const throttledScroll = throttle((event) => {
handleScrollPosition(event)
}, 100)
// XSS 过滤------含白名单配置
const safeHTML = xssFilter(userInput, {
// 白名单:允许哪些标签通过
whiteList: {
a: ['href', 'title'],
img: ['src', 'alt'],
b: [],
i: []
}
})
XSS 白名单配置------安全防线
XSS 过滤是前端安全的重中之重。@opentiny/utils 的 xssFilter 支持白名单配置,让你精确控制哪些 HTML 标签和属性是安全的:
js
// 严格白名单:只允许最基础的标签
const strictFilter = xssFilter(content, {
whiteList: {
b: [], // 只允许 <b> 粗体
i: [], // 只允许 <i> 斜体
a: ['href'] // 只允许 <a> 的 href 属性
}
})
//宽松白名单:富文本编辑器场景
const richFilter = xssFilter(content, {
whiteList: {
p: ['class'],
div: ['class', 'style'],
span: ['class', 'style'],
img: ['src', 'alt', 'width', 'height'],
a: ['href', 'target'],
ul: [], ol: [], li: [],
table: [], tr: [], td: [], th: []
}
})
这就像机场安检------你可以选择"只查行李"(严格模式)还是"抽查可疑旅客"(宽松模式),但绝不能"不开安检直接放人进来"(不做 XSS 过滤)。
真实落地经验
某项目中,用户评论区域曾被 XSS 攻击,恶意用户在评论里插入 <script> 标签。用了 xssFilter 后,所有 <script> 标签被自动过滤,恶意代码无法执行。而且白名单机制让正常的内容格式(加粗、链接等)仍然保留。
教训 :永远不要用 v-html 直接渲染用户输入!即使你的组件库很安全,业务代码的安全意识才是最后一道防线。
五、Design Config------不同主题下的交互配置
TinyVue 的主题不仅仅是"换个颜色",还包含交互行为的差异化配置。这就是 Design Config 的意义。
designSmbConfig 是什么?
不同业务场景对组件的交互要求不同。SMB(中小企业)场景可能需要更紧凑的布局、更快的响应;而大型企业场景可能需要更宽松的间距、更明确的反馈。
designSmbConfig 就是 SMB 主题下的交互配置集合:
vue
<template>
<!-- 通过 ConfigProvider 切换交互配置 -->
<tiny-config-provider :design="designSmbConfig">
<!-- 所有组件自动应用 SMB 交互规格 -->
<tiny-button>紧凑按钮</tiny-button>
<tiny-input placeholder="更小的输入框"></tiny-input>
<tiny-table :data="data"></tiny-table>
</tiny-config-provider>
</template>
<script setup>
import ConfigProvider from '@opentiny/vue-config-provider'
import { designSmbConfig } from '@opentiny/vue-common'
</script>
这就像游戏里的"难度选择"------Normal 模式和 Hard 模式用的同一套关卡,但交互参数(怪物血量、伤害倍率)不同。Design Config 就是帮你一键切换"游戏难度"的配置文件。
真实落地经验
一个同时服务大企业客户和中小企业客户的 SaaS 产品中,大企业版需要"宽松大气"的交互风格,中小企业版需要"紧凑高效"的交互风格。通过 Design Config,一套代码实现了两种交互体验,只是 ConfigProvider 的 design 属性不同。产品经理感动到想给前端发奖金(当然最后没发)。
六、真实案例汇总
案例1:某华为云内部管理系统
- 规模:200+ 页面,60+ 组件使用
- 工具使用:自动导入 + 按需加载 + TinyThemeTool
- 效果:打包体积比原方案减少 35%,主题切换从"3天"变成"5分钟"
- 踩坑:自动导入和按需加载插件曾同时使用导致构建报错,后来只用自动导入就解决了
案例2:某制造业 MES 系统
- 规模:大量表格和表单场景
- 工具使用 :
@opentiny/utils的 XSS 过滤 + Design Config - 效果:用户输入安全性100%,大屏和移动端交互行为自动适配
- 踩坑 :
v-auto-tip指令在虚拟滚动表格中需要特别注意渲染时机
案例3:某金融数据可视化平台
- 规模:20+ 图表类型,实时数据更新
- 工具使用:Chart 组件 + huicharts 包 + TinyThemeTool
- 效果:图表开发效率提升 60%,品牌配色一键应用
- 踩坑:echarts 地图模块需要额外引入中国地图数据,否则地图图表显示空白
七、工具选择决策树
面对这么多工具,到底用哪个?别纠结,我给你画个决策树:
java
你的构建工具是什么?
├── Vite
│ ├── 想自动 import?→ @opentiny/unplugin-tiny-vue
│ └── 想按需打包?→ @opentiny/vue-vite-import
│ └── 都不想?→ 手动 import + 全量引入(小项目可以)
├── Webpack
│ ├── 想自动 import?→ @opentiny/unplugin-tiny-vue(webpack版)
│ └── 都不想?→ 手动 import
│
需要主题定制?
├── 是 → TinyThemeTool
├── 微调 → CSS 变量覆盖
│
需要工具函数?
├── 是 → @opentiny/utils
├── 只需要 XSS → @opentiny/utils 的 xssFilter
│
需要交互差异?
├── 是 → Design Config(designSmbConfig 等)
八、小结
工具不是炫技用的,是让你少干活用的。案例不是讲故事用的,是让你少踩坑用的。
TinyVue 提供的这套工具链------TinyThemeTool 做主题、自动导入做效率、按需加载做体积、utils 做安全、Design Config 做交互------覆盖了企业级项目开发中 80% 的"重复性劳动"。
真实落地经验告诉我们:用好工具,少走弯路。每个工具背后都有人在真实项目中踩过坑、验证过效果。你不需要重新发明轮子,只需要知道哪里有轮子可以用。
抄作业不丢人,不知道有作业可以抄才丢人。
🏠 TinyVue 官网:opentiny.design 📦 GitHub 仓库:github.com/opentiny/ti...