Slim.js — это легковесный фреймворк для создания веб-компонентов и реактивных интерфейсов. Несмотря на компактность, он поддерживает интеграцию с Web Workers, что позволяет выполнять ресурсоёмкие задачи в фоновом потоке, не блокируя основной поток браузера и интерфейс пользователя.
Web Worker создаётся с помощью стандартного API Jav * aScript:
const worker = new Worker('worker.js');
В файле worker.js располагается код, который будет
выполняться отдельно от основного потока. В Slim.js для взаимодействия с
компонентом используется отправка и получение сообщений через
события.
// worker.js
self.onmess age = function(event) {
const data = event.data;
const result = data.num * 2; // пример обработки
self.postMessage(result);
};
В компоненте Slim.js создаётся слушатель сообщений:
class MyComponent extends Slim {
onBeforeCreated() {
this.worker = new Worker('worker.js');
this.worker.onmess age = (e) => {
this.updateResult(e.data);
};
}
handleClick() {
const value = parseInt(this.shadowRoot.querySelector('#input').value, 10);
this.worker.postMessage({ num: value });
}
updateResult(result) {
this.shadowRoot.querySelector('#output').textContent = result;
}
get template() {
return `
<input id="input" type="number">
<button oncl ick="this.handleClick()">Вычислить</button>
<div id="output"></div>
`;
}
}
Slim.tag('my-component', MyComponent);
Для эффективного использования ресурсов важно правильно управлять жизненным циклом Web Worker:
onBeforeCreated или
onCreated.onDisconnected, чтобы избежать утечек памяти:onDisconnected() {
this.worker.terminate();
}
Взаимодействие происходит через postMessage и
onmessage. Данные могут быть любыми объектами,
поддерживаемыми структурным клонированием (структура JSON-подобная):
// Отправка
this.worker.postMessage({ action: 'compute', payload: { x: 5, y: 10 } });
// Получение
this.worker.onmess age = (e) => {
const { action, result } = e.data;
if (action === 'compute') {
this.updateResult(result);
}
};
Для сложных операций часто создают структуру команд
с action и payload, чтобы Worker мог
обрабатывать разные типы задач в одном файле.
Slim.js не ограничивает количество Workers. Можно создавать пул для параллельной обработки:
this.workers = [];
for (let i = 0; i < 4; i++) {
const worker = new Worker('worker.js');
worker.onmess age = this.handleWorkerMessage.bind(this);
this.workers.push(worker);
}
Данные распределяются между ними, а результаты собираются через
централизованный метод handleWorkerMessage.
Web Workers хорошо подходят для асинхронных вычислений и операций с большим объёмом данных:
// worker.js
self.onmess age = async function(event) {
const { data } = event;
const result = await heavyCalculation(data.input);
self.postMessage(result);
};
async function heavyCalculation(input) {
// симуляция тяжёлой обработки
return new Promise(resolve => {
setTimeout(() => resolve(input ** 2), 1000);
});
}
В Slim.js асинхронные результаты легко интегрируются с реактивными свойствами компонента, обновляя интерфейс без блокировки основного потока.
onDisconnected.Slim.js не имеет собственного API для Workers, но интеграция через стандартный JavaScript полностью совместима. Реактивность Slim.js позволяет автоматически обновлять DOM при получении данных из Worker, сохраняя производительность и отзывчивость интерфейса.