Preact «ReferenceError: окно не определено»

Я пытаюсь использовать веб-API в своем приложении Preact и не могу найти обходной путь для этой ошибки.

Build  [=================== ] 93% (10.2s) after chunk asset optimization
ReferenceError: window is not defined
method: UqHU

Stack:

{
    "fileName": "D:\\preact-app\\build\\ssr-build\\ssr-bundle.js",
    "lineNumber": 1,
    "functionName": "Object.UqHU",
    "methodName": "UqHU",
    "columnNumber": 93549,
    "native": false
}
This is most likely caused by using DOM or Web APIs.
Pre-render runs in node and has no access to globals available in browsers.

Consider wrapping code producing error in: "if (typeof window !== "undefined") { ... }"

Alternatively use "preact build --no-prerender" to disable prerendering.

See https://github.com/preactjs/preact-cli#pre-rendering for further information.

Я пробовал «if (typeof window !== «undefined»)», но все равно получаю ту же ошибку. Комментирование кода или использование --no-prerender решает эту проблему.

🤔 А знаете ли вы, что...
Preact предоставляет инструменты для тестирования компонентов и приложений.


66
2

Ответы:

preact-cli выполняет предварительную визуализацию вашего приложения в Node, где глобальные параметры браузера (такие как window) не существуют.

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

Если вы хотите обсудить репозиторий preact-cli и предоставить свое приложение, я могу попытаться взглянуть.


Обновлено: проблема заключается в восходящей зависимости axios, form-data. Это ненадежная проверка браузера и узла, а это означает, что любое использование axios вообще вызовет ошибку. Самым простым решением было бы исправить form-data/lib/browser.js следующим фрагментом:

module.exports = typeof self == 'object' ? self.FormData : typeof window !='undefined' ? window.FormData : undefined;

https://github.com/preactjs/preact-cli/discussions/1784


Решено

Проблема возникла из-за импорта axios, который зависит от библиотеки «form-data» и несовместим с предварительным рендерингом Preact, насколько я понимаю. Я решил использовать fetch вместо axios, чтобы исправить это, но rschristian дает больше решений в этом посте: https://github.com/preactjs/preact-cli/discussions/1784