Библиотека mo.js изначально спроектирована с возможностью расширения функциональности через плагины. Это позволяет добавлять новые типы анимаций, кастомные рендереры, эффекты и поведение без изменения исходного кода библиотеки. Плагины интегрируются в экосистему через прототипы классов и внутренние механизмы lifecycle-обработки.
Ключевые принципы:
Позволяют создавать новые типы фигур, которые можно использовать в
mojs.Shape.
Примеры стандартных фигур:
Кастомные фигуры регистрируются через mojs.addShape.
Пример создания пользовательской фигуры:
class StarShape extends mojs.CustomShape {
getShape() {
return '<path d="M10 1 L12 7 H18 L13 10 L15 16 L10 12 L5 16 L7 10 L2 7 H8 Z"/>';
}
}
mojs.addShape('star', StarShape);
Использование:
new mojs.Shape({
shape: 'star',
fill: 'yellow',
scale: { 0: 1 },
duration: 1000
});
Особенности:
getShapeЭффекты — это расширения, изменяющие поведение анимации.
Можно создавать:
Расширение easing-функций:
mojs.easing.myCustomEase = function (p) {
return Math.sin(p * Math.PI);
};
Использование:
new mojs.Tween({
duration: 1000,
easing: 'myCustomEase',
onUpdate: (progress) => {
console.log(progress);
}
});
Расширяют поведение массовых анимаций.
Можно кастомизировать:
Пример кастомной логики для Burst:
const burst = new mojs.Burst({
count: 10,
children: {
radius: { 0: 50 },
angle: (i) => i * 36,
delay: (i) => i * 50
}
});
Плагин может вмешиваться в генерацию этих значений.
Позволяют добавлять:
Пример расширения Timeline:
mojs.Timeline.prototype.pauseAll = function () {
this._timelines.forEach(t => t.pause());
};
mojs.addShape(name, shapeClass);
name — строковый идентификаторshapeClass — класс, наследуемый от
CustomShapemojs.Shape.prototype.myMethod = function () {
console.log('custom behavior');
};
Важно:
mo.js не имеет формальной системы хуков, но жизненный цикл можно перехватывать через:
onStartonUpdateonCompleteПример:
new mojs.Tween({
duration: 1000,
onStart() {
console.log('start');
},
onUpdate(progress) {
console.log(progress);
},
onComplete() {
console.log('done');
}
});
Плагин может оборачивать эти методы:
function wrapOnUpdate(tween) {
const original = tween._props.onUpdate;
tween._props.onUpd ate = function (p) {
console.log('before');
original && original(p);
console.log('after');
};
}
mo.js использует внутренние объекты:
_props — параметры анимации_state — текущее состояние_render — функция рендерингаПлагины могут взаимодействовать с ними, но это требует осторожности.
Пример вмешательства:
const shape = new mojs.Shape({...});
const originalRender = shape._render;
shape._render = function () {
console.log('custom render');
originalRender.call(this);
};
Крупные плагины объединяют несколько возможностей:
Структура плагина:
const MyPlugin = {
install(mojs) {
mojs.addShape('custom', CustomShape);
mojs.easing.customEase = (p) => p * p;
mojs.Shape.prototype.customMethod = function () {
console.log('extended');
};
}
};
Использование:
MyPlugin.install(mojs);
Рекомендуется:
Пример структуры:
/plugin
/shapes
Star.js
/easing
customEase.js
index.js
При разработке плагинов важно учитывать:
Проблемы:
Создание уникальных форм для кнопок, уведомлений, загрузчиков
Использование плагинов для процедурных эффектов
Взрывы, частицы, следы движения
Кастомные формы и easing для фирменного стиля
onUpdateПример кеширования:
class CachedShape extends mojs.CustomShape {
constructor() {
super();
this.cached = this.generate();
}
getShape() {
return this.cached;
}
generate() {
return '<circle cx="10" cy="10" r="10"/>';
}
}
Методы:
Инструменты:
Форматы:
Пример экспорта:
export default MyPlugin;
Подключение:
import MyPlugin from 'mojs-plugin';
MyPlugin.install(mojs);
Плагины в mo.js позволяют превратить библиотеку из набора инструментов анимации в полноценную платформу для создания сложных визуальных систем.