🎉 TinySearchBox 重磅更新:支持 Vue2,一次满足我的所有需求!

"一次编写,到处运行" ------ 这次我们真的做到了!🎊

📢 重大更新

经过团队的努力,TinySearchBox 再度重构!采用全新的Renderless架构 (实现原理下期给大家详细介绍),TinySearchBox 现在正式支持:

  • 一套代码,两个版本Vue 2Vue 3 双版本支持

这意味着什么?无论你的项目是 Vue 2 还是 Vue 3,TinySearchBox 都能完美适配!

🚀 快速开始

Vue 3 项目

bash 复制代码
npm install @opentiny/vue-search-box@3.27.1
vue 复制代码
<template>
  <tiny-search-box v-model="tags" :items="items" />
</template>

<script setup>
import { ref } from 'vue'
import TinySearchBox from '@opentiny/vue-search-box'

const tags = ref([])
const items = ref([
  {
    label: '名称',
    field: 'name',
    options: [
      { label: '选项1' },
      { label: '选项2' }
    ]
  }
])
</script>

Vue 2 项目

bash 复制代码
npm install @opentiny/vue-search-box@2.27.1
vue 复制代码
<template>
  <tiny-search-box v-model="tags" :items="items" />
</template>

<script>
import TinySearchBox from '@opentiny/vue-search-box'

export default {
  components: {
    TinySearchBox
  },
  data() {
    return {
      tags: [],
      items: [
        {
          label: '名称',
          field: 'name',
          options: [
            { label: '选项1' },
            { label: '选项2' }
          ]
        }
      ]
    }
  }
}
</script>

📦 版本说明

包名和版本对应表

包名 Vue 版本 主题风格 版本号
@opentiny/vue-search-box Vue 3 普通主题 3.27.1
@opentiny/vue-search-box Vue 2 普通主题 2.27.1

选择指南

  • 🎯 Vue 3 项目 :使用 3.27.1 版本
  • 🎯 Vue 2 项目 :使用 2.27.1 版本

🛠️ 技术实现:Renderless 架构

🤔 为什么能做到"一套代码,四个版本"?

答案就是:Renderless 架构

核心思路

scss 复制代码
┌─────────────────────────────────────┐
│     一套源代码 (src/)                │
│  - index.ts (入口)                  │
│  - pc.vue (模板)                    │
│  - renderless.ts (逻辑)             │
└─────────────────────────────────────┘
              ↓
┌─────────────────────────────────────┐
│   构建时适配 (vite.config.*.ts)      │
│  - vue2.ts → Vue 2 构建             │
│  - vue3.ts → Vue 3 构建             │
└─────────────────────────────────────┘
              ↓
┌─────────────────────────────────────┐
│   两个独立包 (dist/)                 │
│  - vue2/                            │
│  - vue3/                            │
└─────────────────────────────────────┘

关键技术点

1. @opentiny/vue-common - 兼容层魔法

vue-common 是核心兼容层,它:

  • 提供统一的 API(defineComponentsetupreactive 等)
  • 自动适配 Vue 2 和 Vue 3 的差异
  • 让开发者无需关心底层实现
typescript 复制代码
// 在 renderless.ts 中
import { defineComponent, setup } from '@opentiny/vue-common'

// 这个代码在 Vue 2 和 Vue 3 中都能运行!
export const renderless = (props, hooks, context) => {
  const { reactive, computed, watch } = hooks
  // ... 业务逻辑
}

2. 逻辑与模板分离

  • 模板层pc.vue):只负责 UI 展示
  • 逻辑层renderless.ts):处理所有业务逻辑
  • 入口层index.ts):统一对外接口

这样的设计让:

  • 逻辑可以在不同版本间复用
  • 模板可以根据版本调整
  • 代码组织更清晰

3. 构建时适配

通过不同的 Vite 配置,在构建时:

  • Vue 2 版本 :使用 vite-plugin-vue2 和 Vue 2 运行时
  • Vue 3 版本 :使用 @vitejs/plugin-vue 和 Vue 3 运行时
typescript 复制代码
// vite.config.vue2.ts
import vue2 from 'vite-plugin-vue2'
// 使用 Vue 2 构建

// vite.config.vue3.ts
import vue from '@vitejs/plugin-vue'
// 使用 Vue 3 构建

4. 样式系统

  • 普通主题:使用 Less,编译为 CSS
less 复制代码
// theme/index.less - 普通主题
.tv-search-box {
  // 传统样式
}

💡 实现方案详解

方案架构图

bash 复制代码
源代码层
├── src/
│   ├── index.ts          # 组件入口
│   ├── pc.vue            # 模板(UI)
│   ├── renderless.ts     # 逻辑(业务)
│   └── composables/      # 功能模块
│
构建配置层
├── vite.config.vue2.ts           # Vue 2 构建
└── vite.config.vue3.ts       # Vue 3 构建
│
样式层
└── theme/            # 主题样式
    └── index.less
│
输出层
└── dist/
    ├── vue2/            # Vue 2 包
    └── vue3/            # Vue 3 包

关键技术实现

1. Renderless 架构

typescript 复制代码
export const renderless = (
  props,                    // 组件属性
  hooks,                    // Vue 响应式 API(来自 vue-common)
  context                   // 上下文(emit, nextTick, vm 等)
) => {
  // 业务逻辑
  return api                // 返回给模板使用的 API
}

关键点

  • hooks 来自 vue-common,自动适配 Vue 2/3
  • context 统一了 Vue 2/3 的差异(如 emitslots
  • 返回的 api 对象会被注入到模板中

2. 模板连接

vue 复制代码
<!-- pc.vue -->
<script lang="ts">
import { defineComponent, setup } from '@opentiny/vue-common'
import { renderless, api } from './renderless'

export default defineComponent({
  setup(props, context) {
    // 关键:通过 setup 连接 renderless
    return setup({ props, context, renderless, api })
  }
})
</script>

关键点

  • setup 函数来自 vue-common
  • 自动处理 Vue 2/3 的差异
  • renderless 返回的 API 注入到模板

🎯 使用场景

场景 1:Vue 2 老项目升级

问题:你的项目还在用 Vue 2,但想用现代化的搜索组件?

解决方案:直接安装 Vue 2 版本!

bash 复制代码
npm install @opentiny/vue-search-box@2.27.1

无需升级 Vue,无需重构代码,开箱即用

场景 2:Vue 3 新项目

问题:新项目想用最新的技术栈?

解决方案:使用 Vue 3 版本!

bash 复制代码
npm install @opentiny/vue-search-box@3.27.1

享受 Vue 3 的性能优势和 Composition API!

🔥 核心优势

1. 真正的"一次编写,到处运行"

  • ✅ 一套源代码
  • ✅ 两个构建版本
  • ✅ 零代码差异

2. 完美的兼容性

  • ✅ Vue 2.6.14+ 支持
  • ✅ Vue 3.x 支持
  • ✅ TypeScript 支持
  • ✅ 完整的类型定义

3. 灵活的主题系统

  • ✅ 主题:经典企业级风格
  • ✅ 支持样式定制

4. 优秀的开发体验

  • ✅ 完整的 TypeScript 类型
  • ✅ 详细的文档和示例
  • ✅ 丰富的 API
  • ✅ 活跃的社区支持

📚 文档资源


🎊 总结

TinySearchBox 现在真正做到了:

  • 🎯 Vue 2 和 Vue 3 全支持 - 维护成本低,兼容性高
  • 💪 Renderless 架构 - 代码组织清晰,易于扩展

还在等什么?赶紧试试吧! 🎉

bash 复制代码
# Vue 3 项目
npm install @opentiny/vue-search-box@3.27.1

# Vue 2 项目
npm install @opentiny/vue-search-box@2.27.1

🤝 贡献与反馈

  • 🐛 发现问题?提交 Issue
  • 💡 有好的想法?提交 PR
  • ⭐ 觉得不错?给个 Star 吧!

Happy Coding! 🎉

记住:选择 TinySearchBox,就是选择了兼容性灵活性可维护性

关于OpenTiny

欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~

OpenTiny 官网:opentiny.design

OpenTiny 代码仓库:github.com/opentiny

TinyVue 源码:github.com/opentiny/ti...

TinyEngine 源码: github.com/opentiny/ti...

欢迎进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI、TinyEditor~ 如果你也想要共建,可以进入代码仓库,找到 good first issue 标签,一起参与开源贡献~

相关推荐
@大迁世界2 小时前
面了 100+ 次前端后,我被一个 React 问题当场“打回原形”
前端·javascript·react.js·前端框架·ecmascript
苏打水com2 小时前
第十九篇:Day55-57 前端工程化进阶——从“手动低效”到“工程化高效”(对标职场“规模化”需求)
前端·css·vue·html
小六*^____^*2 小时前
虚拟列表学习
前端·javascript·学习
JIngJaneIL2 小时前
基于java+ vue学生选课系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
十月不到底2 小时前
vue3手机端列表加载组件
前端·vue
小周同学:2 小时前
vue2 +driver 实现页面导航提示引导
vue.js
岁月宁静2 小时前
LangGraph 技术详解:基于图结构的 AI 工作流与多智能体编排框架
前端·python·langchain
岁月宁静2 小时前
LangChain 技术栈全解析:从模型编排到 RAG 实战
前端·python·langchain
1024肥宅2 小时前
工程化工具类:实现高效的工具函数库
前端·javascript·面试