skyline-worklet

Builds smooth, responsive animations for touch gestures and interactions in apps.

Installation
Run `npx skills add "https://github.com/wechat-miniprogram/skyline-skills" --skill "skyline-worklet"` to install this skill, then follow its SKILL.md instructions for my next request.

Paste this into Claude Code, Cursor, or any agent that can run commands.

What this skill does
What it does: - Enables smooth animations and interactive effects in WeChat mini programs that respond instantly to user touches and gestures - Allows animations to run directly on the display thread instead of going through the messaging system, making them feel fast and responsive - Provides different animation types like timing, spring bounce, and decay effects - Lets you combine multiple animations together and control them with shared variables When to use it: - You want to create smooth drag and drop interactions - You need animations that follow the user's finger movement in real time - You want spring bounce or elastic effects that feel natural - You are building interactive features that need to respond instantly without delay
SKILL.mdShow the author's original SKILL.md (not in English)
---
name: skyline-worklet
description: Skyline Worklet 动画系统技能。使用 worklet 函数、共享变量(SharedValue)、动画类型(timing/spring/decay)、Easing 缓动函数、组合动画和线程通信(runOnUI/runOnJS)开发高性能交互动画时使用此技能。适用于拖拽、手势跟随、弹簧回弹等需要 UI 线程直接响应的动画场景。触发关键词:worklet、worklet 动画、SharedValue、共享变量、timing、spring、decay、Easing、runOnUI、runOnJS、applyAnimatedStyle、交互动画、手势动画、UI 线程动画。
---

# Worklet 动画系统

## 适用场景

- 实现手势跟随、拖拽等交互动画
- 使用 timing/spring/decay 创建动画效果
- 通过 SharedValue 驱动节点样式变化
- 组合多段动画(序列、重复、延迟)
- 在 UI 线程和 JS 线程间传递数据

## 核心概念

### 双线程架构与 Worklet 的意义

小程序双线程架构中,UI 事件需跨线程传递到 JS 线程再回传,**交互动画会有明显延迟**。Worklet 动画让动画逻辑直接运行在 UI 线程,实现类原生动画体验。

### 三大核心概念

| 概念 | 说明 | 关键 API |
|------|------|----------|
| **worklet 函数** | 可运行在 JS 或 UI 线程的函数,顶部声明 `'worklet'` 指令 | `runOnUI()`, `runOnJS()` |
| **共享变量** | 跨线程同步的变量,通过 `.value` 读写 | `shared()`, `derived()` |
| **动画驱动** | 将 SharedValue 绑定到节点样式 | `applyAnimatedStyle()` |

### 基本流程

```js
const { shared, timing } = wx.worklet

// 1. 创建共享变量
const offset = shared(0)

// 2. 绑定到节点样式(updater 为 worklet 函数)
this.applyAnimatedStyle('#box', () => {
  'worklet'
  return { transform: `translateX(${offset.value}px)` }
})

// 3. 修改值驱动动画
offset.value = timing(300, { duration: 200 })
```

## 文档索引

根据需求快速定位(路径相对于 `references/`):

| 我想要... | 查阅文档 |
|-----------|----------|
| 了解 worklet 架构和完整概念 | `core/worklet-overview.md` |
| 使用 SharedValue 和 DerivedValue | `base/shared-derived.md` |
| 在 worklet 中操作 scroll-view | `base/scroll-view-context.md` |
| 使用 timing/spring/decay 动画 | `animation/timing-spring-decay.md` |
| 查看 Easing 缓动函数 | `animation/easing.md` |
| 使用序列/重复/延迟组合动画 | `animation/combine-animation.md` |
| 了解 runOnUI/runOnJS 线程通信 | `tool/thread-communication.md` |

## 强制规则

### MUST: worklet 函数必须声明 `'worklet'` 指令

```js
// ✅ Correct
function handleGesture(evt) {
  'worklet'
  offset.value += evt.deltaX
}

// ❌ Incorrect - 缺少 'worklet' 指令,无法在 UI 线程执行
function handleGesture(evt) {
  offset.value += evt.deltaX
}
```

### MUST: SharedValue 必须通过 `.value` 读写

```js
// ✅ Correct
const offset = shared(0)
offset.value = 100

// ❌ Incorrect - 直接赋值会替换整个 SharedValue 对象
const offset = shared(0)
offset = 100
```

### MUST: 访问非 worklet 函数必须使用 `runOnJS`

```js
// ✅ Correct
function showModal(msg) {
  wx.showModal({ title: msg })
}
function handleTap() {
  'worklet'
  const fn = this.showModal.bind(this)
  runOnJS(fn)('hello')
}

// ❌ Incorrect - worklet 中直接调用普通函数
function handleTap() {
  'worklet'
  this.showModal('hello')
}
```

### MUST: 页面方法必须通过 `this.methodName.bind(this)` 访问

```js
// ✅ Correct
handleTap() {
  'worklet'
  const showModal = this.showModal.bind(this)
  runOnJS(showModal)(msg)
}

// ❌ Incorrect - 未 bind(this),this 指向丢失
handleTap() {
  'worklet'
  runOnJS(this.showModal)(msg)
}
```

### MUST: Worklet 动画仅在 Skyline 渲染模式下可用
   - 确保 app.json 配置 `"renderer": "skyline"`
   - 确保开发者工具勾选「将 JS 编译成 ES5」

### NEVER: 在 worklet 函数中直接调用 `wx` API

必须通过 `runOnJS` 回到 JS 线程。

### NEVER: 通过解构 `this.data` 访问属性

会导致 `Object.freeze` 冻结 `this.data`,`setData` 将失效。

```js
// ✅ Correct
handleTap() {
  'worklet'
  const msg = this.data.msg
}

// ❌ Incorrect - 解构会冻结整个 this.data
handleTap() {
  'worklet'
  const { msg } = this.data
}
```

## Quick Reference

### API 速查表

| 分类 | API | 说明 |
|------|-----|------|
| 基础 | `shared(initialValue)` | 创建 SharedValue |
| 基础 | `derived(updaterWorklet)` | 创建衍生值(类比 computed) |
| 基础 | `cancelAnimation(sharedValue)` | 取消动画 |
| 动画 | `timing(toValue, options?, callback?)` | 时间曲线动画(默认 300ms) |
| 动画 | `spring(toValue, options?, callback?)` | 弹簧物理动画 |
| 动画 | `decay(options?, callback?)` | 滚动衰减动画 |
| 组合 | `sequence(anim1, anim2, ...)` | 依次执行 |
| 组合 | `repeat(anim, reps, reverse?, callback?)` | 重复(负值=无限) |
| 组合 | `delay(ms, anim)` | 延迟执行 |
| 工具 | `runOnUI(workletFn)` | 在 UI 线程执行 |
| 工具 | `runOnJS(normalFn)` | 回调 JS 线程 |

### 场景 → 方案映射

| 场景 | 推荐方案 |
|------|----------|
| 点击后平滑移动 | `timing` + `Easing` |
| 手势松开回弹 | `spring` |
| 手势松开惯性滑动 | `decay` + `velocity` |
| 先移动再弹回 | `sequence(timing, spring)` |
| 循环脉动效果 | `repeat(timing, -1, true)` |
| 延迟后开始动画 | `delay(ms, timing/spring)` |

## 相关技能

| 场景 | 推荐技能 | 说明 |
|------|----------|------|
| 手势组件 | `skyline-components` | pan/tap/long-press 手势处理 |
| 渲染引擎概览 | `skyline-overview` | Skyline 配置和迁移 |
| 样式开发 | `skyline-wxss` | WXSS 支持与差异 |
| 路由转场 | `skyline-route` | 自定义路由动画 |

## References 目录结构

```
references/
├── animation/
│   ├── combine-animation.md
│   ├── easing.md
│   └── timing-spring-decay.md
├── base/
│   ├── scroll-view-context.md
│   └── shared-derived.md
├── core/
│   └── worklet-overview.md
└── tool/
    └── thread-communication.md
```

Ships with 7 supporting files:

  • references/animation/combine-animation.md
  • references/animation/easing.md
  • references/animation/timing-spring-decay.md
  • references/base/scroll-view-context.md
  • references/base/shared-derived.md
  • references/core/worklet-overview.md
  • references/tool/thread-communication.md

Mirrored from the author's public source. Install counts from the open skills registry.

The systems behind these skills get built for partners every week.

Partner with us