как использовать плагин конденсатора в веб-воркере - PullRequest
1 голос
/ 05 мая 2020

Я добавил веб-воркера в свое приложение 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.

1 Ответ

2 голосов
/ 06 мая 2020

Длинный выстрел в темноте ... но если комментарии под вашим вопросом верны и window действительно используется только как глобальный объект для подключения подключаемых модулей, и если ничего другого из window, недоступного в Используется рабочая область, тогда вы можете просто сделать

self.window = self;

в начале вашего сценария Worker.

...