AIRI 开发日志解析:把 yui540 的 CSS 动画移植成可复用的 Vue 舞台转场组件库
【免费下载链接】airi💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve Neuro-sama's altitude. Capable of realtime voice chat, Minecraft, Factorio playing. Web / macOS / Windows supported.项目地址: https://gitcode.com/GitHub_Trending/ai/airi
本篇技术文章以 AIRI 项目 2025-03-06 的开发日志(DevLog-2025.03.06)为主线,深度解析 AIRI 团队如何把日本前端作者 @yui540 的 CSS 动画作品移植为开箱即用的 Vue 转场组件,并结合仓库中packages/ui-transitions的真实源码,拆解其生命周期 Hook 机制、definePage路由配置方案、Netlify Playground 部署模式,以及当日对 DeepSeek 开源基础设施、AIBrix LLM 网关与 Phi-4-mini 小模型的调研结论。读完本文,你将掌握一个「动画组件 → 路由集成 → 页面落地」的完整技术闭环,可直接复用到自己的 Vue 项目中。
一、开发日志背景:从 CSS 动画到可复用 Vue 组件
2025-03-06 的开发日志记录了一个明确的工程目标:把 @yui540 创作的"基础动画与转场(fundamental animations and transitions)"移植并适配成一个可复用的 Vue 组件,让任意 Vue 项目都能直接使用。前一天作者还在 DevStream 直播中演示了这一进展,当日日志则聚焦于把成果沉淀成真正可复用、可扩展的机制。
该移植成果对应的正是仓库中的packages/ui-transitions,其定位在 README 中写得很直白:
A set of UI transition animations for fade-in / fade-out of scenes.
即一组用于场景淡入 / 淡出的 UI 转场动画集合。这个包并不是对 yui540 原作的简单复制,而是面向"换页 / 换场景"这类 Vue 应用高频需求做了工程化封装——这也是当日日志中反复强调的:"前一日的目标是把 CSS 拆进 Vue 组件,但真正可复用的部分还没完成,还需要设计一套可扩展、灵活的机制给其他页面使用。"
二、组件清单:七种转场动画的包内结构
packages/ui-transitions包的组件层位于 src/components,共导出 7 个转场组件:
| 组件名 | 转场名称(路由 meta 中使用的 key) | 注册时长 duration |
|---|---|---|
SlideTransition | slide | 2700ms |
SlopeSlideTransition | slope-slide | 2700ms |
ArrowTransition | arrow | 2700ms |
MultipleBlocksRevealTransition | multiple-blocks-reveal | 2800ms |
FantasyFallTransition | fantasy-fall | 2700ms |
RectanglesRotateTransition | rectangles-rotate | 2700ms |
BubbleWaveOutTransition | bubble-wave-out | 1000ms |
日志中提到当日又从 cowardly-witch 移植了 3 个额外的转场(对应MultipleBlocksRevealTransition、FantasyFallTransition、RectanglesRotateTransition等新增成员),它们已经全部上线到 Netlify Playground 演示页。
在源码层面,每个转场组件都保留了对原作者工作的高透明度致敬。例如 ArrowTransition.vue 的样式区直接以注释标注了灵感来源与原始代码出处:
/** * Author: yui540 * Source code at: https://github.com/yui540/css-animations/blob/.../transitions/index.html#L160-L233 */其实现方式是纯 CSS 动画:::before/::after两个全屏伪元素配合clip-path多边形路径的arrowIn/arrowOut关键帧,实现箭头形状的遮罩开合;--delay与--sharpness(默认 40%)两个 CSS 变量控制时序与箭头锐度。值得注意的移植细节是:原作者用 CSS 变量写死的颜色,在这里被提升为组件 Props 驱动的主题系统。
三、核心机制:StageTransitionGroup 的生命周期 Hook 与导航编排
真正体现"可复用机制设计"的是 StageTransitionGroup.vue(180 行核心逻辑),它把"转场动画"抽象成一条与路由导航深度绑定的生命周期管线,从源码结构看,这套设计包含四个层次:
3.1 七阶段生命周期事件
组件定义了一套完整的转场生命周期(见 L51-L58),每个阶段都是一个可挂载 Hook 的事件点:
| 阶段 | 语义 |
|---|---|
before-enter | 动画开始前 |
enter-active | 入场动画已开始 |
navigation | 到达导航时机(由组件自行决定何时调用next()) |
after-enter | 入场动画完成 |
before-leave | 退场动画开始前 |
leave-active | 退场动画已开始 |
after-leave | 完整动画周期结束 |
3.2 转场注册表(transitions registry)
组件内部用shallowRef维护了一张名称 → 配置的映射表(见 L71-L100),每条配置包含:
component:实际的转场 Vue 组件duration:转场总时长(毫秒)exitDuration:可选的退场时长nextDelay:可选的导航触发延迟
导航时机的默认逻辑为nextDelay ?? duration / 3,即默认在转场进行到约 1/3 处发起路由跳转,保证"新页面在遮罩打开的过程中就开始加载"的流畅观感。
3.3 Hook 系统与编排流程
组件提供addTransitionHook(hook)API(L106-L116),调用方注册 Hook 后会拿到一个移除函数用于解绑;triggerHooks(L119-L131)会按注册顺序依次await执行所有 Hook,并在单个 Hook 抛错时打印Error in transition hook at stage "..."而不会中断整个流程。
导航编排是这套系统的关键(L133-L242):
- 名字为
none或未注册的转场直接放行next(); - 通过临时注册的
navigationHook 响应navigation阶段,用hasNavigated标志保证next()只调用一次; - 若上一个转场仍在播放(
showTransition为真),会先快进触发退场阶段、等待 50ms 再启动新转场; - 提供了多重兜底:
navigation阶段超时未处理时强制导航,finally中还会以duration * 2的保守超时再次兜底,确保路由永远不会被卡死。
3.4 与 vue-router 的自动集成
组件在setup中直接注册了router.beforeEach全局前置守卫(L251-L284),逻辑清晰:
- 传入
disableTransitions时直接放行(方便测试与降级); - 目标路由
to.meta.stageTransition不是对象时放行; usePageSpecificTransitions且页面声明了pageSpecificAvailable时放行(页面级自定义转场优先);- 否则用组件 Props 中的
primaryColor/secondaryColor/tertiaryColor/colors/zIndex覆盖meta 中的对应字段,再触发triggerTransition(stageTransition, next)。
模板层则通过<component :is="...">动态渲染当前激活的转场组件,并透传stageTransition参数(L287-L294)。从源码结构看,这套设计的目标是把"主题色、层级、禁用开关"全部收敛到<StageTransitionGroup>一个入口上,页面侧只需声明"我想用什么转场"。
四、definePage:用路由 meta 声明页面转场
日志提到当日实验了unplugin-vue-router提供的definePage宏,并确认"非常适合我的场景,决定沿用这条路线"。Playground 中的页面源码印证了这套用法,例如 playground/src/pages/index.vue:
import { definePage } from 'vue-router/experimental' import Buttons from '../components/Buttons.vue' definePage({ meta: { stageTransition: { name: 'slide', }, }, })也就是说,每个页面只需要在definePage里声明stageTransition.name(以及可选的颜色、方向等字段),路由切换时转场就会被自动触发——页面代码零动画逻辑,转场完全由StageTransitionGroup统一接管。这正是日志中"设计一套可扩展、灵活的机制供其他页面使用"的落地形态。Playground 中 transition-2.vue 到 transition-7.vue 共 6 个演示页 + 首页,覆盖了全部 7 种转场效果的在线试玩。
五、Playground 与 Netlify 部署约定
日志宣布了一条团队约定:从今往后,每个包的 Playground 都以proj-airi+${subDirectory}+${packageName}模式命名 Netlify 部署。例如本次的转场组件库部署在:
- Playground 演示页:
https://proj-airi-packages-ui-transitions.netlify.app/#/ - 官方部署(已集成进主站舞台):
https://airi.moeru.ai
仓库中 packages/ui-transitions/netlify.toml 与 playground 目录即为该 Playground 的实际载体。这种"一包一 Playground + 统一命名空间"的模式,让每个 UI 包都拥有可独立预览、可被 CI/CD 自动发布的演示环境,便于社区直接体验效果。当日日志还提到为/docs路径配置 200 重定向代理的折腾过程(最终已解决,细节留待后续 DevLog 记录),反映了文档站点与主站多域名共存的部署权衡。
六、落地与踩坑:主站舞台集成与移动端修复
日志的 DevStream 部分记录了把舞台转场组件集成进 AIRI 官网主舞台的真实过程:并不顺利——作者在之前的动画组件设计中发现了几个 bug(当日已修复),并且直播结束后在手机上实测时,发现"桌面和平板正常,但移动端动画被意外破坏",计划次日修复。
这条记录传达了两个工程经验:
- 转场动画的组件化不是终点,集成到真实路由系统后才会暴露设计缺陷(时序、
position: fixed在移动端视口下的表现、软键盘 / 地址栏变化对视口高度的影响等); - 必须多端回归验证:全屏遮罩类动画在桌面、平板、手机上的渲染差异很大,而 DevStream 的实时演示恰好提供了"发现问题 → 当场修复 → 次日跟进"的快速迭代节奏。
七、当日模型与生态调研:Phi-4-mini、DeepSeek 开源基础设施与 AIBrix
日志后半部分记录了面向 AIRI 智能体能力的行业调研,属于当日技术视野的延伸:
- Microsoft Phi-4-mini:日志确认该模型原生内置 function calling 能力,这意味着"终于可以基于预训练支持来构建 Agent 了",不再需要为小模型额外做工具调用的对齐/微调;
- DeepSeek 开源基础设施索引(open-infra-index):调研了 DeepSeek 团队此前一周发布的开源仓库集合,为 AIRI 的推理与服务链路选型提供参考;
- 字节跳动开源的 LLM 网关 AIBrix:作为 vLLM 生态下的 LLM 网关方案被纳入调研范围,这类网关通常负责路由、限流、模型编排,与 AIRI 的多模型接入诉求直接相关。
需要说明的是,日志只是记录了"调研"这一动作与初步结论(Phi-4-mini 的 function calling 能力),并未给出最终集成决策;AIRI 的核心 Agent 能力由仓库中的packages/core-agent承载,读者可以结合该包继续深入。
八、总结:从 DevLog 看可复用动画工程的四步方法论
通读 2025-03-06 的 DevLog 并结合packages/ui-transitions源码,可以提炼出一条清晰的工程路径:
- 选型与致敬:选定 @yui540 的高质量 CSS 动画作为美学基础,保留原作者署名与来源注释;
- 组件化封装:把 CSS 变量提升为组件 Props,让颜色、层级、时长可被外部主题系统覆盖;
- 路由级编排:通过
StageTransitionGroup的七阶段生命周期 +definePage元信息声明,把"页面级转场"从页面代码中彻底解耦,同时用多重兜底保证导航永不卡死; - 持续迭代验证:借助 Netlify Playground 与 DevStream 演示加速反馈,并针对移动端等真实环境持续修复。
如果你也在为自己的 Vue 项目设计转场系统,这套「注册表驱动 + 生命周期 Hook + 路由守卫集成」的架构是很好的参考范本——而 AIRI 的整个演进过程,都记录在仓库 docs/content/en/blog 的每日 DevLog 序列中,值得持续追踪。
【免费下载链接】airi💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve Neuro-sama's altitude. Capable of realtime voice chat, Minecraft, Factorio playing. Web / macOS / Windows supported.项目地址: https://gitcode.com/GitHub_Trending/ai/airi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考