核心概念
ICERender 的编程模型可以概括为:React 式的组件/props/state + W3C 式的事件模型 + 场景树。
第一个实时示例
下面这个画布由 ice-render 内核在你的浏览器里实时渲染(纯前端、不发请求)。它演示了三个最核心的图元:ICERect(矩形)、ICECircle(正圆)、ICEText(文本)——试着拖动它们,天生可交互:
驱动它的就是一段普通的 ICE API 调用,没有任何特殊封装:
import IceCanvas from '@site/src/components/IceCanvas';
<IceCanvas
height={300}
setup={(ICE, ice) => {
const { ICERect, ICECircle, ICEText } = ICE;
ice.addChild(new ICERect({ left: 40, top: 40, width: 160, height: 110, fill: true, stroke: true,
style: { fillStyle: '#4f8cff', strokeStyle: '#1f4fb0', lineWidth: 2 } }));
ice.addChild(new ICECircle({ left: 270, top: 40, radius: 55, fill: true, stroke: true,
style: { fillStyle: '#ff7a59', strokeStyle: '#c2410c', lineWidth: 2 } }));
}}
/>
<IceCanvas> 只在客户端(BrowserOnly)渲染,避免 Node 端访问 DOM;它负责加载 static/ice-render.js、创建 ICE 实例、把 setup(ICE, ice, canvas) 交给你,并在卸载时 ice.destroy() 释放画布。所有图元共享 ICEComponent 基类,统一支持 transform、draggable、fill/stroke 开关与可序列化渐变。更多图元见图元手册。
组件(ICEComponent)
一切可见之物都是组件。ICEComponent 是所有图元的基类,ICERect、ICEText、ICEGroup、ICEVisioLink 等都继承自它。每个组件持有:
props:描述「组件长什么样」的声明式配置(位置、尺寸、样式、交互开关……)state:组件内部的运行时状态parentNode:父组件引用,构成场景树
props 与 state 的 关系
props 是你传入的配置,state 由引擎维护。修改组件外观的正确方式是 setState:
rect.setState({ style: { fillStyle: '#ff5252' } });
引擎通过原型继承共享默认 props/state——默认配置不复制,你传入的字段会以「实例自有属性」的形式覆盖原型上的默认值。
一个 ICERect 的默认配置(props + state)只占 0.98KB/实例,而把整份默认表显式复制进每个实例约 7.7KB/实例(3.3×)。
例外是 style:它按当前主题每实例派生一份(共享会串味),不在共享默认里。
量级以本机 npm run bench:mem 为准(口径:node + 独立进程 + 双次 gc 的真增量)。
场景树
一个 ICE 实例管理一棵场景树:
ice.addChild(component); // 添加子组件(默认自动标记脏区)
ice.addChildren([a, b, c]); // 批量添加
ice.removeChild(component); // 移除
ice.clearAll(); // 清空整棵树
ice.findComponent('rect-1'); // 按 id 递归查找
ICEGroup 可以嵌套任意深度,子组件坐标相对于父容器(详见坐标系)。