- 前端
- UI组件
【免费下载链接】moveable
Moveable! Draggable! Resizable! Scalable! Rotatable! Warpable! Pinchable! Groupable! Snappable!
本文以 packages/vue3-moveable/CHANGELOG.md 为主体,结合仓库源码与构建配置,系统梳理 vue3-moveable 从 0.4.4 到 0.28.0 共 30 余个版本的演进脉络:哪些是纯发布性版本、哪些修复了 Vue 3 类型与打包问题、哪些完成了工程化改造(如从 rollup 迁移到 vite、接入 yarn workspace),并讲解该组件如何通过统一的PROPERTIES/METHODS/EVENTS常量桥接底层 moveable 能力。读完本文,你可以快速定位任一历史版本的行为变化,理解每个版本号背后的真实改动,并掌握该包从源码到 npm 产物的完整构建链路。
一、变更日志格式与版本节奏总览
CHANGELOG 遵循 Conventional Commits 规范生成,每个版本条目包含:版本号(## [x.y.z])、发布日期、compare链接指向的版本区间,以及按 emoji 分类的变更分组:
:rocket: New Features—— 新增功能:bug: Bug Fix—— 缺陷修复:memo: Documentation—— 文档更新:house: Code Refactoring—— 代码重构:mega: Other—— 发布(publish)、依赖升级等杂项
从时间轴看,vue3-moveable 在 2022 年 4 月(0.4.4)至 2023 年 12 月(0.28.0)期间保持活跃迭代,早期版本密集发布(2022 年 4 至 8 月几乎每周一版),进入 2023 年后发布频率放缓,反映了该包从快速定型期走向稳定维护期的过程。
| 版本 | 发布日期 | 关键变更类型 |
|---|---|---|
| 0.4.4 ~ 0.4.9 | 2022-04 ~ 2022-06 | 修复 CommonJS 导入、Vue 方法返回值;接入 yarn workspace |
| 0.5.0 ~ 0.10.4 | 2022-06 ~ 2022-08 | 修复 package.json files 字段、移除错误 React 类型 |
| 0.11.0 ~ 0.17.1 | 2022-09 ~ 2022-12 | 依赖升级与发布周期 |
| 0.18.1 ~ 0.24.1 | 2023-01 ~ 2023-06 | 修复 Vue 3 类型、更新 README、rollup 迁移至 vite |
| 0.25.1 ~ 0.28.0 | 2023-07 ~ 2023-12 | 发布周期与依赖更新 |
二、早期定型阶段(0.4.4 ~ 0.10.4):关键修复集中期
2.1 修复 CommonJS 导入缺陷(0.4.9)
版本 0.4.9(2022-06-07)是早期最重要的一次修复,同时包含两条 Bug Fix:
- 修复 CommonJS 导入 bug(#650):在
require("vue3-moveable")场景下模块加载异常的问题。结合 vite.config.ts 可以看到,构建产物同时输出cjs与es两种格式(formats: ["cjs", "es"]),package.json中main指向dist/moveable.cjs.js、module指向dist/moveable.js,CJS 产物是否可被正确解析直接决定了 Node 侧与旧式打包工具的可用性。 - 修复 Vue 方法(methods)的返回值:该问题对应组件源码中方法代理机制的实现,详见下文第四节。
同一版本还完成了yarn workspace 接入(use yarn workspace,Code Refactoring)。仓库根目录 lerna.json 中"npmClient": "yarn"、"useWorkspaces": true佐证了 monorepo 使用 yarn workspace 管理多包依赖,vue3-moveable 作为packages/*下的成员包之一参与统一版本发布。
2.2 修复 package.json 的 files 字段(0.6.2 / 0.7.0)
版本 0.6.2 与 0.7.0(2022-07-17 / 2022-07-21)连续两次以#700为关联 issue 修复files 字段。当前 package.json 中的 files 配置为:
"files": [ "./*", "src/*", "dist/*", "declaration/*" ]该字段决定了 npm 发布时哪些文件被打包上传。若 files 配置错误(例如缺少dist/*或declaration/*),会导致安装后的包缺少构建产物或类型声明,表现为"装上了但无法 import"或 TS 报错,这正是 0.6.x/0.7.x 时代用户反馈的高频问题。0.7.0 同时将react-compat-moveable更新为依赖项。
2.3 移除错误的 React 类型并更新代码示例(0.8.0)
版本 0.8.0(2022-07-25)包含两条变更:
- Bug Fix:移除错误的 React 类型(#703):vue3-moveable 不应暴露 React 相关类型。早期各框架适配包(React/Vue/Preact 等)共享底层类型定义时,容易出现类型"串包"问题,此修复切断了这一错误暴露链。
- Documentation:更新 Vue3-moveable 代码示例(#704):同步修正 README 中的使用示例。可对照当前 README.md 中的
<Moveable v-bind:target="['.target']" v-bind:draggable="true" ...>写法。
2.4 后续发布型版本(0.9.2 ~ 0.10.4)
从 0.9.2(2022-08-01)到 0.10.4(2022-08-24)的多个版本均标注为:mega: Other下的publish packages,属于多包同步发布的纯发布型版本——CHANGELOG 中此类条目并不意味着 vue3-moveable 本身有代码改动,而是 monorepo 内其他包(moveable、react-moveable 等)升级后触发的整体重发。
三、功能与类型演进(0.11.0 ~ 0.17.1)
- 0.11.0(2022-09-15):
update packages,升级依赖。 - 0.12.0(2022-10-17):修复 Vue 3 类型(#766)。这是针对
defineComponent泛型与 props 类型推导问题的修复,直接影响 TS 用户在模板中的类型检查体验。 - 0.13.0(2022-11-04):
update packages+ 发布。 - 0.15.0(2022-11-27):Documentation 分组下的
fix README,修正 README 中的文档链接与描述。 - 0.17.0 / 0.17.1(2022-12):常规发布型版本。
此阶段没有新增业务功能,重点是跟随底层 moveable 包(依赖区间为moveable: "~0.53.0",见 package.json)的升级而同步发布,同时持续打磨类型定义与文档。
四、工程化改造阶段(0.18.1 ~ 0.24.1):rollup 迁移至 vite
4.1 关键重构:构建工具从 rollup 切换到 vite(0.24.1)
版本 0.24.1(2023-06-28)的:house: Code Refactoring分组记录了change rollup to vite,这是该包历史上最重要的工程化变更之一。改造后的 vite.config.ts 关键配置如下:
export default defineConfig({ build: { lib: { entry: resolve(__dirname, 'src/components/index.ts'), name: 'Moveable', formats: ["cjs", "es"], fileName: 'moveable', }, rollupOptions: { external: ["vue", "moveable", "@daybrush/utils", "framework-utils"], output: { globals: { vue: "Vue" }, }, }, minify: false, }, plugins: [vue(), dts()], })要点解读:
- 入口为
src/components/index.ts,输出格式仅保留cjs与es(无 UMD,UMD 入口由 index.umd.ts 单独提供)。 - 外部化依赖:
vue、moveable、@daybrush/utils、framework-utils不参与打包,由使用方提供,避免双实例问题。 - 类型声明:通过
vite-plugin-dts(devDependencies 中的vite-plugin-dts: ^3.0.0-beta.3)在构建时自动生成.d.ts。 - 当前 package.json 的
build脚本为vite build && vue-tsc,即先产出 JS 产物,再用vue-tsc(^1.8.1)做类型检查与声明生成。
4.2 其他同阶段变更
- 0.18.1 / 0.19.0 / 0.19.2 / 0.19.3 / 0.19.4(2023-01 ~ 2023-03):包含两次
fix README(0.19.3 修复 story URL、0.19.4 修复 README),以及依赖升级(#856、#847)。 - 0.21.0(2023-04-13):修复 vue3 类型,进一步收敛
defineComponent的类型签名问题。 - 0.22.6(2023-05-08):
update croact version(#902)属于 New Features,同时fix files filed(#910 #909 #907)再次修正了 files 字段的发布遗漏问题——可见"发布产物不完整"是该包生命周期中反复出现、需要持续守护的工程痛点。
五、组件实现原理:PROPERTIES / METHODS / EVENTS 三层代理机制
理解版本修复内容的根基,在于 Moveable.vue 的桥接实现。该组件并不自己实现任何拖拽逻辑,而是薄封装底层的VanillaMoveable:
5.1 三个常量集的来源
组件从moveable包导入PROPERTIES、METHODS、EVENTS三个常量数组(见 consts.ts):
import { PROPERTIES, EVENTS, METHODS } from "moveable";这三个数组由 react-moveable/src/ables/consts.ts 从MOVEABLE_ABLES能力清单中归约生成:MOVEABLE_PROPS聚合所有 Able 的props,MOVEABLE_EVENTS聚合所有 Able 的events。也就是说,Vue 组件的全部 props 与事件不是手工维护的,而是从底层 Able 定义自动推导的——底层新增一个 Able 属性,Vue 组件无需改代码即可透传。
5.2 方法代理
METHODS.forEach((name) => { methods[name] = function (this: any, ...args: any[]) { return this.$_moveablename; }; });组件将底层 moveable 实例的所有方法(如dragStart、getRect、request等)在mounted后代理为自身 methods,并保留返回值——这正是 0.4.9 中"修复 Vue 方法的返回值"对应的代码位置。
5.3 props 透传与 watch 同步
PROPERTIES.forEach((name) => { watch[name] = function (this: any, value: any) { this.$_moveable[name] = value; }; });所有 props 通过watch在值变化时同步写回底层实例;mounted阶段则遍历$props,用isUndefined过滤未传属性后构造MoveableOptions,并固定开启warpSelf: true(保证组件自身承载变换样式)。所有事件通过EVENTS.forEach统一$emit转发:
EVENTS.forEach((name) => { moveable.on(name as any, (e: any) => { this.$emit(name, { ...e }); }); });5.4 生命周期管理
组件在beforeUnmount中调用this.$_moveable.destroy()完成销毁清理。整体模式与 0.12.0、0.21.0 两次"修复 vue3 类型"直接相关——defineComponent的泛型签名必须准确覆盖MoveableInterface的方法集与MoveableEvents的事件签名,才能让模板中的@drag、@render等获得正确推断。
六、当前版本工程状态(0.28.0)
最新版本 0.28.0(2023-12-03)为纯发布型版本,其工程配置总结如下:
- npm 包信息:
name: "vue3-moveable"、version: "0.28.0"、types: "dist/index.d.ts"、sideEffects: false(支持 Tree Shaking),license 为 MIT。 - 依赖:运行时依赖
moveable: "~0.53.0"与framework-utils: "^1.1.0";开发依赖包括vue: ^3.3.4、vite: ^4.3.0、@vitejs/plugin-vue: ^4.2.3、vue-tsc: ^1.8.1、typescript: ^4.8 <4.9、vite-plugin-dts: ^3.0.0-beta.3(见 package.json)。 - 脚本:
dev(vite 开发服务器)、build(vite build && vue-tsc)、preview(vite preview)。 - 入口导出:index.ts 将组件以
VueMoveable命名导出并export * from 'moveable'透传全部类型与常量;index.umd.ts 将模块属性挂载到默认导出上,供全局脚本使用。 - 开发示例:App.vue 展示了最简用法——
<Moveable target=".target" :draggable="true" @render="onRender" />,在onRender中将e.cssText追加到目标元素样式上。
七、版本阅读指南与升级建议
7.1 如何阅读 CHANGELOG
- 关注
:bug: Bug Fix与:rocket: New Features分组即可定位行为变化;:mega: Other下的publish packages多为 monorepo 整体重发,可忽略。 - 每个版本条目的
compare链接可查看与上一版本的完整 diff;提交哈希(如213f346即 vite 迁移提交)可用于精确检索。
7.2 针对历史问题的升级建议
- 若你曾遇到 CJS 导入失败:升级到 0.4.9 以上即可获得修复,且应确认使用方解析到的是
main(CJS)或module(ESM)产物。 - 若安装后发现缺少 dist 产物或类型声明:请使用 0.7.0 以上版本(files 字段已修正),并可在 node_modules 中核对
dist/与declaration/目录是否存在。 - 若 TS 类型报错:建议使用 0.12.0 / 0.21.0 之后的版本(两次 Vue 3 类型修复)。
- 若需要 Tree Shaking 友好产物:0.28.0 的
sideEffects: false配合 ESM 产物(dist/moveable.js)是当前仓库中推荐形态。
八、结语
vue3-moveable 的版本史是一部典型的"框架适配包生存实录":核心逻辑全部沉淀在底层 moveable 库,适配层则持续解决三个工程问题——产物完整性(files 字段)、类型准确性(Vue 3 泛型)、构建链现代化(rollup → vite)。其通过PROPERTIES/METHODS/EVENTS常量自动推导 props、方法、事件的架构,让适配层几乎零成本跟随底层能力扩张。对于需要在 Vue 3 项目中集成 Moveable(Draggable / Resizable / Scalable / Rotatable / Warpable / Pinchable / Groupable / Snappable 等能力)的开发者而言,选择 0.24.1 之后的版本即可同时获得 vite 构建链路与持续修复后的类型体验。
- 前端
- UI组件
【免费下载链接】moveable
Moveable! Draggable! Resizable! Scalable! Rotatable! Warpable! Pinchable! Groupable! Snappable!
相关推荐
Kubernetes Python 客户端 V1QuobyteVolumeSource 模型详解:Pod 与持久卷中 Quobyte 卷的完整配置指南
Kubernetes Python 客户端 V1QuobyteVolumeSource 模型详解:Pod 与持久卷中 Quobyte 卷的完整配置指南 本篇技术
后端云原生容器编排Vue CLI 完整版本演进全解析:从 5.0 系列到 3.x 的关键变更、破坏性更新与升级实践
Vue CLI 完整版本演进全解析:从 5.0 系列到 3.x 的关键变更、破坏性更新与升级实践 Vue CLI 是基于 webpack 的 Vue.js 开发
前端开发工具构建工具Moveable 版本演进全解析:从 0.4 到 0.53 的能力矩阵、API 变迁与关键修复脉络
Moveable 版本演进全解析:从 0.4 到 0.53 的能力矩阵、API 变迁与关键修复脉络 导读 本文以 CHANGELOG.md https://li
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考