angular - Hur importerar man ett node-modul i ett web worker-skript?
Jag försöker bygga en Ionic-app som använder TensorFlow.js med COCO-SSD-modellen för att upptäcka objekt på bilder från kameran. Jag behöver också kunna slå på och av ficklampan medan jag använder kameran. När jag använder modellens detektionsfunktion precis som ett promise-anrop med await, stoppar det andra 'trådar' tills detektionen är klar. Detta hindrar ficklampan från att slås på omedelbart, och efter knapptryckning (knappen som slår på/av ficklampan) måste man vänta ungefär en halv sekund innan den slås på eller av.
Jag har bestämt mig för att använda coco-ssd i en webbarbetare, men jag upptäckte att jag inte kan importera nodmoduler i webbarbetare på grund av detta fel:
SyntaxError: import declarations may only appear at top level of a module worker-test.js:1
Jag har sökt efter några liknande frågor, men nästan ingen importerar moduler i webbarbetare, och de som gör det - gör det i JavaScript. För att möjliggöra modulimportering i JS behöver du bara skicka en annan parameter till worker-konstruktorn: new Worker('url/to/script.js', {type: 'module'}) Men grejen är att du inte kan skicka en andra parameter till worker-konstruktorn i TypeScript, så jag kan inte skapa en worker på det sättet.
Relevanta filer:
test.page.ts
...
ionViewDidEnter() {
this.testWorker();
}
testWorker() {
const worker = new Worker('assets/worker-test/worker-test.js');
worker.onmessage = function(event) {
console.log('onmessage');
console.log(event.data);
};
worker.postMessage('From main thread');
}
...
worker-test.js
import * as cocoSsd from '@tensorflow-models/coco-ssd';
postMessage("posting message");
onmessage = function(data) {
console.log('In worker');
console.log(data.data);
console.log(model);
};
let model;
cocoSsd.load().then((res) => {
model = res;
});
ionic info:
ionic (Ionic CLI) : 4.12.0 (~/.nvm/versions/node/v12.4.0/lib/node_modules/ionic)
Ionic Framework : @ionic/angular 4.6.2
@angular-devkit/build-angular : 0.13.9
@angular-devkit/schematics : 7.3.9
@angular/cli : 7.3.9
@ionic/angular-toolkit : 1.5.1
Tack för hjälpen i förväg.
Svar #1
Kompileringsalternativet i TypeScript bör rikta sig mot antingen es2015 eller esnext.
{
...
"compilerOptions": {
"lib": ["esnext", "webworker"],
}
}
Genom att dessutom lägga till "webworker" kommer det att indikera att projektet kommer att använda webworker-API:et.
