Как исправить ошибку "ReferenceError: окно не определено" в angular 6 universal server.js
Я выполняю следующую команду на инструменте командной строки angular cli, чтобы установить универсальный пакет для angular6 'ng add @ng-toolkit/universal'. Он хорошо установлен, после этого я запускаю npm run build:prod, и он также работает очень хорошо. Теперь, наконец, я запускаю 'npm run server'. Но это выдает ошибку, не давая мне запустить URL.
здесь выкидывает ошибку в файл server.js, как это исправить.
ReferenceError: window is not defined
at Object.exports.__esModule (D:\ANGULAR2\dist\server.js:122614:14)
at __webpack_require__ (D:\ANGULAR2\dist\server.js:122314:31)
at Object.exports.__esModule (D:\ANGULAR2\dist\server.js:122359:19)
at __webpack_require__ (D:\ANGULAR2\dist\server.js:122314:31)
at Object.exports.__esModule (D:\ANGULAR2\dist\server.js:122343:21)
at __webpack_require__ (D:\ANGULAR2\dist\server.js:122314:31)
at D:\ANGULAR2\dist\server.js:122334:19
at D:\ANGULAR2\dist\server.js:122337:11
at webpackUniversalModuleDefinition (D:\ANGULAR2\dist\server.js:122292:21)
at Object.exports.__esModule (D:\ANGULAR2\dist\server.js:122294:4)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! rssmtechwood@0.0.0 serverrl `node local.js`
npm ERR! Exit status 1
В качестве обходного пути я заменяю окно глобальным.
var work = global.document.createElement ('div'); но окно, элемент документа используется во многих местах server.js
function(module, exports)
{
'use strict';
exports.__esModule = true;
var tagSoup = false;
var selfClose = false;
var work = window.document.createElement('div');
}
function isBrowser()
{
return (typeof window !== 'undefined' && typeof window.document !== 'undefined');
}
Я ожидаю, что window.document, window будет заменен синтаксисом nodejs для приведенного выше примера кода.
1 ответ
При запуске приложения в Angular Universal document
, window
а также browser
объекты всегда будут undefined
и не имеют эквивалента.
Причина проста: при запуске приложения Angular на стороне клиента подается (почти) пустой HTML-файл, затем Javascript вступает во владение и модифицирует DOM с помощью window
, document
, так далее.
При запуске приложения Angular на стороне сервера контекст выполнения совершенно другой, Node.js не знает ни о каком браузере, он просто генерирует HTML в виде полной простой строки, не интерпретируя ее вообще. Вот почему эти ключевые слова не могут быть использованы в этом контексте.
Поэтому, чего бы вы ни пытались достичь с помощью этих ключевых слов, вам придется найти другой способ рендеринга на стороне сервера или просто условно отключить этот код, чтобы он выполнялся только на стороне клиента и не создавал ошибок на стороне сервера.,