Узел J: Использование WebWorker для изменения размера изображений - PullRequest
0 голосов
/ 29 октября 2018

Я делаю приложение node.js, которое может изменять размеры изображений. Я могу сделать это успешно с jimp . Однако изменение размера изображения не является асинхронным и останавливает пользовательский интерфейс при изменении размера. Я хочу избежать этого, поэтому я попытался использовать веб-работника.

// main.js
var worker = new Worker(__dirname + '\\worker.js');

worker.addEventListener('message', function(e) {
    if (e.data == 'done') { worker.terminate() } // Done
}, false);

worker.postMessage({'buff': buf, 'filename': filename}); // Start the worker

|

// worker.js
const Jimp = require('jimp'); // Oops, this doesn't work
self.addEventListener('message', function(e) {
    resize(e.data.buf, e.data.filename);
}, false);

function resize(buf, filename) {
    Jimp.read(buf).then(image => {
        image.resize(1920, Jimp.AUTO);
        image.writeAsync(filename).then(cb => { self.postMessage('done') });
    });
}

Я обнаружил, что не могу использовать функции node.js, такие как require(), в веб-приложении. Как я могу использовать Jimp в веб-приложении или изменить размер изображения другим асинхронным способом?

Редактировать: я пытаюсь использовать webworkify, копируя ответ из @RubyJunk. Когда я пытаюсь создать работника, я получаю ошибку Uncaught TypeError: Cannot convert undefined or null to object at Function.keys (<anonymous>). Кто-нибудь знает, как это исправить?

Редактировать 2: я использую электрон для создания моего приложения Node.js. У них есть свойство окна (nodeIntegrationInWorker) , из-за которого создается впечатление, что я могу запускать функции Node.js в Web Worker, но когда я пытаюсь использовать require (), оно все равно говорит мне, что это не функция.

1 Ответ

0 голосов
/ 29 октября 2018

Попробуйте использовать webworkify , и вместо этого создайте своего работника

var work = require('webworkify');
var worker = work(require('./worker.js');

и поместите ваш рабочий метод в module.exports следующим образом

const Jimp = require('jimp');

module.exports = function(self) {
    self.addEventListener('message', function(e) {
        resize(e.data.buf, e.data.filename);
    }, false);

    function resize(buf, filename) {
        Jimp.read(buf).then(image => {
            image.resize(1920, Jimp.AUTO);
            image.writeAsync(filename).then(cb => { self.postMessage('done') });
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...