Popełniłam kod, który działa u mnie lokalnie na komputerze w domu (jest tworzony w VSCode, a że działa widzę po uruchomieniu apki przez wewnętrzny live server VS Code), natomiast po wysłaniu na gh-pages i otwarciu w przglądarce już nie działa.
Klasa, która zwraca przepisanego webworkera. Nie jestem autorką - to jest z jakiegoś przykładu z sieci. Bez tego nie działało również u mnie na kompie.
export default class WebWorker {
constructor(worker) {
const code = worker.toString();
const blob = new Blob(['('+code+')()']);
return new Worker(URL.createObjectURL(blob));
}
}
Sam worker
self.addEventListener("message", e => {/* eslint-disable-line no-restricted-globals */
let startIndex = 0;
const indexStep = 40; //
let temporaryStorage = [];
var result = { error: false };
var URL = e.data;
async function recursiveSingleFetch(path) {
const fullPath = path + startIndex.toString();
try {
const x = await fetch(fullPath);
if (x) {
const resp = await x.json();
if (resp.items) {
startIndex += indexStep;
temporaryStorage = temporaryStorage.concat(resp.items);
recursiveSingleFetch(path);
}
else(self.postMessage(temporaryStorage)/* eslint-disable-line no-restricted-globals */)
}
} catch (e) {result.error = true;result.errorMessage = e.message;self.postMessage(result)/* eslint-disable-line no-restricted-globals */}
}
recursiveSingleFetch(URL);
}
);
}
Jedno i drugie jest importowane do pliku
import worker from './fetchworker';
import WebWorker from './workerSetup';
i konsumowane tak oto:
var fetchWorker = new WebWorker(worker);
fetchWorker.onmessage = e => {
const result = e.data;
if (result.errorMessage) {
console.log('result', result);
store.dispatch({type:"ERROR_SHOW", payload: result})
redirect.error();
} else {
if (result.length === 0) {redirect.not_found()}else{
result.input = formatFetchedBooks(result);
store.dispatch({ type: "BOOKS_FETCH", payload: result });
redirect.books();
}
}
};
fetchWorker.postMessage(path);
}
Jeżeli uznacie, że lepsza będzie wersja skrócona to napiszcie - w sumie same sedno działania webworkera trochę zasłania sposób wywoływania. Wersja odpalana przez gh-pages wyrzuca błąd wskazujący na to, że web worker nie istnieje (albo jego metoda onmessage nie dostaje argumentu),przy czym to bardziej moja hipoteza, komunikat błędu linkuje tylko skompilowany kod ( który niby do czegoś przypisuję, ale bez szczególnej pewności).
Gdzie szukać przyczyny? Mogę się tylko domyślać, że u mnie na kompie plik workera jeszcze występuje jako taki, natomiast w paczce, która idzie na gh-pages już nie i stąd błąd, ale jak to obejść, jeżeli to o to chodzi?