VRender 1.1.0 升级指南
VRender 1.1.0 是一次面向状态系统、动画语义和多端运行时接入方式的稳定版升级。核心变化是:状态样式、动画帧和静态属性真值的边界被明确拆开,跨端环境初始化也收敛到 App 级入口。
如果你使用 VRender 作为 VChart、VTable 或自研渲染层的底层依赖,建议在升级前阅读本文并按迁移清单检查项目。本文面向所有升级用户,覆盖结构变化、破坏性变化和迁移方式。
适用范围
本文面向从 1.0.x 或 1.1.0 alpha 版本升级到 1.1.0 的用户,重点覆盖:
- 图元状态和 shared state。
- appear/update/state 动画。
- Browser、Node、小程序、Lynx、Harmony 等环境的创建方式。
- root/default 与按需 register/profile 的能力边界。
- poptip 等组件或插件的显式安装方式。
- 上层库如何减少对 VRender 内部属性缓存的直接维护。
安装
正式发布后可以按常规方式安装:
npm install @visactor/vrender@1.1.0
如果你按包使用,也应保证 @visactor/vrender-core、@visactor/vrender-animate、@visactor/vrender-components、@visactor/vrender-kits 等 VisActor VRender 包版本一致。
重要变化概览
状态系统
- 状态静态真值统一为:
baseAttributes + resolvedStatePatch -> attribute
sharedStateDefinitions是推荐的共享状态定义入口。graphic.setStates(states, { animate, animateSameStatePatchChange })支持同状态刷新和同状态 patch 变化动画。- 动态 resolver 会收到有效的
StateResolveContext.graphic。 graphic.states是图元本地状态定义入口;共享状态优先使用sharedStateDefinitions。动态状态属性应写成StateDefinition.resolver,graphic.stateProxy已移除。
动画系统
- 动画帧不再是新的静态属性真值来源。
- appear/fade 推荐写法是先设置最终静态属性,再使用
animate().from(...)表示起始帧。 animate().to(...)不应被当作“动画结束后写入 baseAttributes”的接口。- update 动画中的多个 sibling 配置不会再互相提前提交对方负责动画的属性。
- 内置
TagPointsUpdate可以从标准 update target 来源读取目标points/segments。 scaleIn新增可配置起点能力:fromScale、fromScaleX、fromScaleY。
App 级运行时
- 推荐使用环境专属 App 入口创建 VRender:
createBrowserVRenderApp()createNodeVRenderApp()createWxVRenderApp()createLynxVRenderApp()createHarmonyVRenderApp()
- 使用
app.createStage()创建具体视图。 - 旧的根级
createStage()仍作为兼容入口保留,但不推荐新代码继续使用。 - 同一页面、容器或服务进程内如果会创建多个 VRender 视图,优先复用同一个 App。
结构和兼容边界
Root/default 保持完整能力
@visactor/vrender root/default 仍保持完整易用性。1.1.0 不会为了包体积优化从默认入口中删除用户期望的完整能力。
如果业务对包体积敏感,应使用更窄的 public subpath/register 组织自己的 profile,而不是要求默认入口自动变成 lite 入口。
按需能力通过明确 register/profile 暴露
按需能力通过更窄的 public subpath/register 暴露,例如:
import { registerAnimate } from '@visactor/vrender-animate/register'; import { registerBasicCustomAnimate } from '@visactor/vrender-animate/custom/register-basic'; export function registerVRenderBasicAnimationProfile() { registerAnimate(); registerBasicCustomAnimate(); }
上层如果要做按需加载,应提供用户可理解的 profile,例如 full、basic、richtext、story、disappear。用户选择 lite/profile 后,如果缺少某种 animation type 或组件能力,应由上层给出清晰提示,不应由 VRender 在图元热路径自动加载 full。
组件和插件注册更明确
组件、插件、动画 custom register 的边界在 1.1.0 中更清晰:
- full/root 入口继续保持完整注册行为。
- lite/simple/profile 入口可以只注册需要的图元、renderer、picker、bounds、component 或 custom animation。
- custom animation 可以选择
basic、richtext、disappear、story或 full register。 poptip插件需要通过loadPoptip()或installPoptipToApp(app)显式触发,不属于默认 bootstrap。
自定义 Runtime Contribution 使用统一 Installer
如果上层需要注入 renderer contribution、draw interceptor 或 picker contribution,应使用 VRender 的 runtime contribution installer,而不是自己维护 DI/container 刷新顺序:
import { installRuntimeContributionModule } from '@visactor/vrender/entries/runtime-contribution'; installRuntimeContributionModule(customContributionModule, { targets: ['graphic-renderer', 'draw-contribution'] });
未传 app 时,VRender 会把 module 记录为 pending runtime contribution,并刷新当前已经存在的 shared app。它不会创建新 app;后续新建 app 会在默认 bootstrap 完成后安装这份 pending module,保证 replacement module 在执行 rebind 前可以看到内置 contribution token。
如果 app 已经存在,或由宿主传入,应显式传入 app:
installRuntimeContributionModule(customContributionModule, { app, targets: ['graphic-renderer'] });
如果 module 注册 picker contribution,在 targets 中加入 { picker: CanvasPickerContribution }。同一个 module object 对同一个 binding context 只会加载一次,因此上层可以在 app 创建前调用一次,并在拿到 app 后再次调用。