вебворкеры, кажется, не работают в производстве

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

Вычисления выполняются локально с работающими веб-воркерами, но в prod я почти не понимаю, почему это не работает.

Следует отметить, что, поскольку мне нужен импортированный контекст определенных функций (определенных вне рабочего контекста), я последовал совету, предложенному здесь: ( Создание веб-воркера внутри React ), и я сначала вставляю его в строку и сначала превращаю в большой двоичный объект.

`

export const buildBlobUrlFromCode = (code) => {
    // returns a DOMString that links context to the code within the blob
    code = code.substring(code.indexOf("{") + 1, code.lastIndexOf("}"));
    const blob = new Blob([code], { type: "application/javascript" });

    return URL.createObjectURL(blob);
}

export class WebWorker {
    constructor(worker) {
        let code = worker.toString();
        // const blobUrl = strDecoratedBuildBlobUrlFromCode(code);
        const blobUrl = buildBlobUrlFromCode(code);

        return new Worker(blobUrl);
    }
}

и как я использую приведенный выше код: const workerInstance = new WebWorker(MyWorker);

где MyWorker — это fn, экспортированный с определенным onmessage и всеми операциями, определенными внутри.

Я добавил несколько журналов и, по сути, код прерывается, когда я начинаю вычисление с помощью: workerInstance.postMessage([data]);

Также следует отметить, что я использую приложение react-create-app для создания своего приложения, и я еще не извлек его, поэтому конфигурации веб-пакета не тронуты.

Кроме того, исходные файлы для этих рабочих процессов полностью пусты при развертывании, но заполняются локально (как я вижу фактический код в файлах worker.js)

Heroku — сломано: На героку (сломан) -- развернуто

Локальный -- работает: Локально (работает) --


person Brian Zhou    schedule 18.06.2018    source источник


Ответы (1)


Мы боролись с аналогичной проблемой, и мы обнаружили следующее...

Мы также используем Webpack и, что немаловажно, производственную конфигурацию, которая упростила код. В ходе этого процесса мы обнаружили, что функциональная переменная onmessage отбрасывалась, так как она больше нигде не вызывалась. Это объясняет, почему в экземпляре рабочей сборки производственной сборки не было видно никакого кода.

Мы также обнаружили еще одну потенциальную ловушку в том, что процесс искажения заменял все имена переменных на отдельные символы. Этот процесс также сделал бы функцию onmessage бесполезной.

Чтобы это исправить, вместо объявления переменной onmessage присвойте onmessage глобальному объекту (this)

this.onmessage = (event) => {}

Таким образом, при искажении код не был удален, а имя функции не было изменено.

Я знаю, что это поздно, но надеюсь, что это поможет.

person Tom Duckworth    schedule 16.05.2019