Install
openclaw skills install @zhenyangze/leafer-js-skill为 Claude 提供 LeaferJS Canvas 图形引擎的全面支持。 当用户需要创建、开发或调试 LeaferJS 应用时,请立即使用此 Skill。 LeaferJS 是一个现代化的 Canvas 引擎,专注于图形编辑、复杂 UI 构建和交互应用开发。 支持瞬间创建100万个图形,性能卓越。 适用于以下场景: - 创建图形编辑器(如 Figma、Canva 类工具) - 开发互动应用、小游戏 - 构建可视化系统、数据大屏 - 开发 AI 无限画布应用 - 生成图片与短视频内容 - 创建组态软件、工业监控 当用户提到以下关键词时触发:LeaferJS、Leafer、Canvas 引擎、图形编辑、 画布应用、可视化、图形交互、动画系统、UI 布局、图形编辑器 即使用户没有明确说"Skill",只要涉及 LeaferJS 相关开发,都应该使用此 Skill。
openclaw skills install @zhenyangze/leafer-js-skillLeaferJS 是一款革新、好用的 Canvas 引擎,轻松实现专业图形编辑。
# 基础 UI 包(推荐,70KB min+gzip)
npm install leafer-ui
# 全量包(含所有插件)
npm install leafer
import { Leafer, Rect } from 'leafer-ui'
const leafer = new Leafer({
view: window,
fill: '#333'
})
const rect = new Rect({
x: 100,
y: 100,
width: 100,
height: 100,
fill: '#32cd79',
draggable: true
})
leafer.add(rect)
import { App, Rect } from 'leafer-ui'
import '@leafer-in/editor'
import '@leafer-in/viewport'
const app = new App({
view: window,
editor: {} // 自动创建 tree 层、sky 层、editor
})
app.tree.add(Rect.one({
editable: true,
fill: '#32cd79'
}, 100, 100))
ES Module 导入(推荐):
import { Leafer, Rect } from 'leafer-ui'
CDN Script 引入:
<!-- 生产环境 -->
<script src="https://unpkg.com/leafer-ui@2.1.0/dist/web.min.js"></script>
<!-- 开发环境 -->
<script src="https://unpkg.com/leafer-ui@2.1.0/dist/web.js"></script>
<!-- ES Module -->
<script type="module">
import { Leafer } from 'https://unpkg.com/leafer-ui@2.1.0/dist/web.module.min.js'
</script>
<script>
const { Leafer, Rect } = LeaferUI
// 注意:Image、PointerEvent、DragEvent 需使用别名
const { MyImage, MyPointerEvent, MyDragEvent } = LeaferUI
</script>
<script setup lang="ts">
import { onMounted, onUnmounted } from 'vue'
import { Leafer, Rect } from 'leafer-ui'
let leafer: Leafer
onMounted(() => {
leafer = new Leafer({ view: 'leafer-view' })
leafer.add(new Rect({
x: 100, y: 100,
width: 200, height: 200,
fill: '#32cd79',
draggable: true
}))
})
onUnmounted(() => {
leafer?.destroy() // 必须销毁
})
</script>
<template>
<div id="leafer-view"></div>
</template>
<style scoped>
#leafer-view {
position: absolute;
top: 0; left: 0;
width: 100%;
height: 100%;
}
</style>
注意事项:leafer 及元素不能直接挂载到响应式数据上,会造成内部层层代理,拖慢运行速度。
import { useEffect, useRef } from 'react'
import { Leafer, Rect } from 'leafer-ui'
export default function LeaferCanvas() {
const leaferRef = useRef<Leafer | null>(null)
useEffect(() => {
let isDestroy = false
import('leafer-ui').then(({ Leafer, Rect }) => {
if (isDestroy) return
leaferRef.current = new Leafer({ view: 'leafer-view' })
leaferRef.current.add(new Rect({
x: 100, y: 100,
width: 200, height: 200,
fill: '#32cd79',
draggable: true
}))
})
return () => {
leaferRef.current?.destroy() // 必须销毁
isDestroy = true
}
}, [])
return (
<div
id="leafer-view"
style={{
position: 'absolute',
top: 0, left: 0,
width: '100%',
height: '100%'
}}
/>
)
}
'use client' // 标识为客户端组件
import { useEffect, useRef, useState } from 'react'
export default function LeaferView() {
const leaferRef = useRef<any>(null)
useEffect(() => {
let isDestroy = false
import('leafer-ui').then(({ Leafer, Rect }) => {
if (isDestroy) return
leaferRef.current = new Leafer({ view: 'leafer-view' })
leaferRef.current.add(new Rect({
x: 100, y: 100,
width: 200, height: 200,
fill: '#32cd79',
draggable: true
}))
})
return () => {
leaferRef.current?.destroy()
isDestroy = true
}
}, [])
return <div id="leafer-view" style={{ width: '100%', height: '100%' }} />
}
npm install @leafer-ui/worker
// main.js
const worker = new Worker('./worker.js')
worker.onmessage = (e) => {
const image = new Image()
image.src = e.data
document.body.appendChild(image)
}
// worker.js
importScripts('https://unpkg.com/@leafer-ui/worker@2.1.0/dist/worker.min.js')
const { Leafer, Rect } = LeaferUI
const leafer = new Leafer({ width: 800, height: 600 })
leafer.add(Rect.one({ fill: '#32cd79' }, 100, 100))
leafer.export('jpg').then((result) => {
self.postMessage(result.data)
})
npm install @leafer-ui/node skia-canvas
import { Leafer, Rect, useCanvas } from '@leafer-ui/node'
import skia from 'skia-canvas'
useCanvas('skia', skia) // 必须
const leafer = new Leafer({ width: 800, height: 600 })
leafer.add(Rect.one({ fill: '#32cd79' }, 100, 100))
// 生成图片
const result = await leafer.export('png')
// result.data 是 base64 图片数据
// HTTP 服务示例
import http from 'http'
http.createServer(async (req, res) => {
const leafer = new Leafer({ width: 800, height: 600 })
leafer.add(Rect.one({ fill: '#32cd79' }, 100, 100))
const result = await leafer.export('png')
res.writeHead(200, { 'Content-Type': 'text/html' })
res.write(`<img src="${result.data}" />`)
res.end()
}).listen(3000)
npm install @leafer-ui/miniapp
// index.ts
import { Leafer, Rect } from '@leafer-ui/miniapp'
Page({
onReady() {
const leafer = new Leafer({
view: 'leafer',
eventer: this
})
leafer.add(new Rect({
x: 100, y: 100,
width: 100, height: 100,
fill: '#32cd79',
draggable: true
}))
},
receiveEvent() {} // 约定接收交互事件的方法名
})
<!-- index.wxml -->
<canvas
id="leafer"
type="2d"
catchtouchstart="receiveEvent"
catchtouchmove="receiveEvent"
catchtouchend="receiveEvent"
catchtouchcancel="receiveEvent"
/>
/* index.wxss */
page { height: 100%; }
#leafer { width: 100%; height: 100%; }
小程序环境要求:微信小程序基础库 >= 3.6.0
# 创建 Vue + Leafer 项目
npm create leafer@latest my-vue-app -- --template vue
# 创建 React + Leafer 项目
npm create leafer@latest my-react-app -- --template react
# 创建纯 Leafer 项目
npm create leafer@latest my-app
# 使用 pnpm
pnpm create leafer@latest my-app
# 在现有项目中安装 Leafer
npm create leafer@latest -- --init
# 安装基础包
npm install leafer-ui
# 安装插件(按需)
npm install @leafer-in/animate @leafer-in/editor @leafer-in/viewport
# 安装类型支持
npm install -D @types/node
examples/ # 完整可运行示例代码
guide/ # 教程文档
reference/ # API 参考文档
plugin/ # 插件文档
src/ # TypeScript 源码(用于理解类结构)
reference/display/ - 所有图形元素reference/property/ - UI 属性和方法reference/event/ - 所有事件plugin/in/ - 官方插件使用文档guide/basic/ - 分步骤教程App
├── tree (Leafer) - 设计层,存放主要内容
│ ├── Group/Box/Frame - 容器
│ │ ├── Rect/Ellipse/Text/Image/Path - 图形元素
│ └── Editor - 编辑器
└── sky (Leafer) - 天空层,放置UI控件
关键元素:
图形元素:
必需插件(通过 leafer 全量包自动安装):
@leafer-in/animate - 动画系统@leafer-in/editor - 图形编辑器@leafer-in/viewport - 视口控制@leafer-in/scroll - 滚动条@leafer-in/arrow - 箭头@leafer-in/html - HTML 渲染@leafer-in/state - 交互状态@leafer-in/flow - 自动布局@leafer-in/text-editor - 文本编辑@leafer-in/robot - 游戏精灵@leafer-in/find - 查找@leafer-in/filter - 滤镜@leafer-in/export - 导出@leafer-in/resize - 调整大小@leafer-in/color - 颜色处理@leafer-in/motion-path - 路径动画@leafer-in/scale-fixed - 固定缩放@leafer-in/corner - 圆角@leafer-in/bright - 亮度UI 事件:
生命周期事件:
编辑器事件:
动画事件:
所有图形元素的完整参考,包括:
所有官方插件的使用方法:
完整的动画功能:
所有事件类型的详细说明:
视觉样式完整参考:
图形编辑器完整指南:
前端框架集成指南:
各运行环境配置:
实际应用场景示例:
调试和性能优化:
创建自定义 UI 元素和扩展:
import { App, Rect } from 'leafer-ui'
import '@leafer-in/editor'
const app = new App({ view: window, editor: {} })
const rect = new Rect({
width: 100,
height: 100,
fill: '#32cd79',
editable: true // 关键:使元素可被编辑
})
app.tree.add(rect)
import { Animate } from '@leafer-in/animate'
// 方式1:使用 Animate 类
new Animate(rect,
{ x: 500, rotation: 360 }, // 目标状态
{ duration: 2, loop: true } // 选项
)
// 方式2:使用 animate() 方法
rect.animate(
{ x: 500 },
{ duration: 2, easing: 'ease-out' }
)
// 方式3:使用 transition 属性
rect.transition = { duration: 0.5 }
rect.x = 500 // 自动动画
import { PointerEvent, DragEvent } from 'leafer-ui'
rect.on(PointerEvent.TAP, (e) => {
console.log('点击了矩形')
})
rect.on(DragEvent.DRAG, (e) => {
console.log('拖拽中:', e.x, e.y)
})
import { Box } from 'leafer-ui'
import '@leafer-in/flow'
const container = new Box({
flow: 'x', // 水平排列
gap: 10, // 间距
padding: 20, // 内边距
fill: '#333'
})
// 子元素自动排列
container.add(new Rect({ fill: 'red', width: 50, height: 50 }))
container.add(new Rect({ fill: 'blue', width: 50, height: 50 }))
import '@leafer-in/state'
const rect = new Rect({
fill: '#32cd79',
hoverStyle: { fill: '#ffcd00' }, // 悬停状态
pressStyle: { fill: '#ff6b6b' }, // 按下状态
selectedStyle: { stroke: '#0066ff' } // 选中状态
})
import '@leafer-in/export'
// 导出整个画布
const blob = await app.tree.export('png')
// 导出指定元素
const blob2 = await rect.export('png', {
pixelRatio: 2 // 高分辨率
})
import { Leafer, Rect, Debug } from 'leafer-ui'
const leafer = new Leafer({ view: window })
// 启用调试
Debug.enable = true
Debug.filter = 'RunTime'
const startTime = Date.now()
// 使用 addMany 批量添加
const rects = []
for (let i = 0; i < 100000; i++) {
rects.push(new Rect({
x: (i % 100) * 12,
y: Math.floor(i / 100) * 12,
width: 10, height: 10,
fill: `hsl(${(i * 3) % 360}, 70%, 60%)`,
draggable: true
}))
}
leafer.addMany(rects) // 批量添加,性能更好
console.log('创建10万个矩形用时:', Date.now() - startTime, '毫秒')
// 使用 set() 批量设置属性
rect.set({
x: 100,
y: 100,
fill: '#ff0000'
})
// 避免频繁更新
rect.x = 100 // ❌ 触发渲染
rect.y = 100 // ❌ 触发渲染
rect.fill = 'red' // ❌ 触发渲染
rect.set({ x: 100, y: 100, fill: 'red' }) // ✅ 只触发一次渲染
性能优化
leafer.addMany() 批量添加set() 批量设置visible: false 隐藏而非销毁暂时不用的元素内存管理
element.destroy()off() 避免内存泄漏leafer.destroy()编辑器开发
editable: true 使元素可被选择编辑app.tree 添加主要内容,app.sky 添加 UI 控件动画性能
willReadFrequently 优化Animate 实例控制精细动画框架集成注意事项
guide/basic/leafer.md 快速入门教程guide/basic/ 目录下的交互、动画、布局教程examples/ 中的完整示例代码reference/ 和 plugin/ 完整 API 文档2.1.0 或最新版本view 参数为 id 字符串时不加 # 号