Я добавил веб-воркера в свое приложение Ionic / React. Это отдельная кодовая база машинописного текста, связанная с /assets/dist/worker.js
. Чтобы воспроизвести настройку, вы можете использовать этот минимальный пример веб-воркера:
import {v4} from 'uuid'
console.log('worker running');
onmessage=(e)=>{
console.log('received message');
postMessage(v4());
}
дать ему собственный tsconfig.json
с "lib": ["WebWorker", "WebWorker.ImportScripts"],
и свяжите его с выбранным вами сборщиком.
Убедитесь, что связанный javascript размещен в / assets, и вы можете использовать его для создания такого веб-воркера:
const myWorker = new Worker('assets/dist/worker.js');
export default function App(){
const [v4, setV4] = useState("waiting for worker");
myWorker.postMessage('go');
myWorker.onmessage=(e)=>{
setV4(e.data);
}
return (
<IonApp>
<p>{v4}</p>
</IonApp>
)};
Пока это работает хорошо. Но он не может получить доступ к плагинам конденсатора. Я хотел бы использовать веб-воркер, чтобы разгрузить некоторые тяжелые вычисления, и они включают вызовы настраиваемого собственного кода. Этот собственный код доступен через плагин конденсатора. Но любой импорт плагина конденсатора создает сообщение об ошибке. Добавьте к работнику следующий код:
import {Plugins} from '@capacitor/core';
const {Device} = Plugins;
, и он выдаст:
ReferenceError: window is not defined
Обновление: Пробовал обходной путь:
(<any> self).window = self; // <------ here
import {v4} from 'uuid'
import {Plugins} from '@capacitor/core';
const {CustomNativePlugin} = Plugins;
console.log('worker running');
onmessage=(e)=>{
console.log(CustomNativePlugin.customCall());
postMessage(v4());
}
Это создает новое сообщение об ошибке:
Uncaught (in promise) CustomNativePlugin does not have web implementation.