节点Js:使用WebWorker调整图像大小

时间:2018-10-29 00:58:01

标签: javascript node.js electron

我正在制作一个可以调整图像大小的node.js应用程序。我可以通过jimp成功地做到这一点。但是,调整图像大小不是异步的,并且在调整大小时会冻结UI。我想避免这种情况,所以我尝试使用Webworker。

// 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') });
    });
}

我发现我无法在Webworker中使用诸如require()之类的node.js函数。如何在Webworker中使用Jimp或以其他异步方式调整图像大小?

编辑:我正在尝试使用webworkify,从@RubyJunk复制答案。当我尝试创建工作程序时,出现错误Uncaught TypeError: Cannot convert undefined or null to object at Function.keys (<anonymous>)。有谁知道该如何解决?

编辑2:我正在使用电子创建我的Node.js应用程序。它们具有窗口属性(nodeIntegrationInWorker),似乎可以在Web Worker中运行Node.js函数,但是当我尝试使用require()时,它仍然告诉我它不是函数。

1 个答案:

答案 0 :(得分:0)

尝试使用webworkify,然后像这样创建您的工作程序

this.camera.recordAsync(recordingConfig).then(async data => {
 console.log(data.uri)
})

并将您的worker方法放入module.exports中,

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