Библиотека Interact.js представляет собой модульную систему, в которой различные возможности взаимодействия с элементами реализованы как независимые модули. Основные функции библиотеки — drag-and-drop, resizable, gestures, autoScroll, inertia, modifiers — построены поверх общего ядра событийной системы.
Исходный код проекта разделён на несколько логических уровней:
Ядро отвечает за:
Ключевые концепции ядра:
Interactable — объект, описывающий элемент DOM и его возможности взаимодействия.
Interaction — конкретная активная сессия взаимодействия (например, текущее перетаскивание).
Action — тип действия:
dragresizegestureModifier — функция, изменяющая параметры взаимодействия (ограничения, снаппинг, границы).
Исходники организованы по директориям:
packages/
core/
actions/
drag/
resize/
gesture/
modifiers/
snap/
restrict/
restrictEdges/
restrictSize/
utils/
inertia/
auto-scroll/
Каждый модуль подключается к ядру через систему plugin registration.
Пример подключения модуля:
import interact from '@interactjs/interact'
import resize from '@interactjs/actions/resize'
interact.use(resize)
Внутри плагина регистрируются:
Проект Interact.js использует современный стек сборки Jav * aScript:
Основные инструменты:
Rollup применяется для создания различных вариантов сборки:
Типичная схема сборки:
TypeScript → Babel → Rollup → dist/
Перед сборкой требуется установить зависимости.
Клонирование репозитория:
git clone https://github.com/taye/interact.js
cd interact.js
Установка зависимостей:
npm install
или
yarn install
После установки формируется структура:
node_modules/
packages/
scripts/
rollup.config.js
tsconfig.json
Исходный код Interact.js написан на TypeScript, что обеспечивает:
Основные настройки находятся в файле:
tsconfig.json
Пример ключевых параметров:
{
"compilerOptions": {
"target": "ES2017",
"module": "ESNext",
"declaration": true,
"sourceMap": true,
"strict": true,
"moduleResolution": "node",
"esModuleInterop": true
}
}
Параметры означают:
| Параметр | Назначение |
|---|---|
| target | версия ECMAScript |
| module | формат модулей |
| declaration | генерация .d.ts |
| sourceMap | карты исходников |
| strict | строгая типизация |
Rollup используется для создания финальных пакетов библиотеки.
Файл конфигурации:
rollup.config.js
Пример базовой конфигурации:
import typescript from '@rollup/plugin-typescript'
import babel from '@rollup/plugin-babel'
import { terser } from 'rollup-plugin-terser'
export default {
input: 'packages/interactjs/index.ts',
output: [
{
file: 'dist/interact.js',
format: 'umd',
name: 'interact'
},
{
file: 'dist/interact.min.js',
format: 'umd',
name: 'interact',
plugins: [terser()]
},
{
file: 'dist/interact.esm.js',
format: 'esm'
}
],
plugins: [
typescript(),
babel({ babelHelpers: 'bundled' })
]
}
Основные параметры:
| Параметр | Назначение |
|---|---|
| input | точка входа |
| output | форматы сборки |
| plugins | плагины обработки |
После сборки в каталоге dist/ появляются различные
версии библиотеки.
interact.js
Используется напрямую в браузере:
<script src="interact.js"></script>
interact.min.js
Содержит:
interact.esm.js
Используется современными сборщиками:
import interact from 'interactjs'
Используется Node.js и некоторыми сборщиками.
В package.json определены команды сборки.
Пример:
{
"scripts": {
"build": "rollup -c",
"dev": "rollup -c -w",
"lint": "eslint packages/",
"test": "npm run lint"
}
}
Основные команды:
| Команда | Назначение |
|---|---|
| build | полная сборка |
| dev | сборка в режиме наблюдения |
| lint | проверка кода |
| test | запуск тестов |
Запуск сборки:
npm run build
Во время разработки используется watch mode.
Запуск:
npm run dev
Rollup начинает отслеживать изменения файлов:
packages/**/*.ts
При изменении исходников автоматически выполняется:
Для удобства отладки генерируются source maps.
Файлы:
interact.js.map
Позволяют браузеру сопоставлять минифицированный код с исходным TypeScript.
Пример подключения:
//# sourceMappingURL=interact.js.map
В инструментах разработчика браузера отображается исходный TypeScript.
Перед публикацией библиотеки проверяется корректность сборки.
Типичная последовательность:
1. сборка
2. запуск тестов
3. проверка линтинга
4. проверка типов
Пример запуска:
npm run build
npm run test
После сборки библиотеку можно подключить локально.
Структура:
dist/
interact.js
interact.min.js
Использование в HTML:
<script src="./dist/interact.js"></script>
Пример Jav * aScript:
interact('.item')
.draggable({
listeners: {
move(event) {
const target = event.target
const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx
const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy
target.style.transform = `translate(${x}px, ${y}px)`
target.setAttribute('data-x', x)
target.setAttribute('data-y', y)
}
}
})
После успешной сборки библиотека публикуется в npm.
Основные шаги:
npm version patch
или
minor
major
npm run build
npm publish
В пакет включаются:
dist/
types/
package.json
README.md
Для уменьшения размера итогового файла используются несколько стратегий.
Rollup удаляет неиспользуемые модули.
Работает только с ESM.
Пример:
import interact from '@interactjs/interact'
Если не используется gesture, соответствующий код не
попадёт в сборку.
Плагин:
rollup-plugin-terser
Удаляет:
Пример:
Исходный код:
function calculatePosition(x, y) {
return x + y
}
Минифицированный:
function a(b,c){return b+c}
В production-сборке удаляются:
Это уменьшает размер библиотеки.
Interact.js предоставляет файлы типов для TypeScript.
После компиляции создаются:
dist/index.d.ts
Пример типа:
interface Interactable {
draggable(options?: DraggableOptions): Interactable
resizable(options?: ResizableOptions): Interactable
}
Преимущества:
После полной сборки пакет выглядит следующим образом:
interactjs/
dist/
interact.js
interact.min.js
interact.esm.js
types/
index.d.ts
package.json
README.md
Каждый формат предназначен для своей среды:
| Файл | Среда |
|---|---|
| interact.js | браузер |
| interact.min.js | production |
| interact.esm.js | современные сборщики |
| index.d.ts | TypeScript |
Причины:
Решение:
npm run lint
или
tsc --noEmit
Возможные причины:
Решение — проверка:
rollup.config.js
Некоторые библиотеки используют:
CommonJS
Rollup может требовать дополнительный плагин:
@rollup/plugin-commonjs
Пример подключения:
import commonjs from '@rollup/plugin-commonjs'
plugins: [
commonjs()
]
При разработке новых возможностей библиотеки:
Пример регистрации модуля:
export default function myPlugin(interact) {
interact.actions.myAction = function () {
// реализация
}
}
Подключение:
interact.use(myPlugin)
Модуль автоматически становится частью системы взаимодействий.
Размер бандла проверяется инструментами:
rollup-plugin-visualizer
или
webpack-bundle-analyzer
Это позволяет определить:
В проектах с открытым исходным кодом сборка обычно выполняется автоматически.
Типичный pipeline:
1. install dependencies
2. lint
3. test
4. build
5. publish
Пример GitHub Actions:
steps:
- uses: actions/checkout@v3
- run: npm install
- run: npm run build
- run: npm test
Автоматизация гарантирует, что каждая версия библиотеки собирается из корректных исходников и проходит все проверки.