Как исправить ошибку «ReferenceError: окно не определено» в angular 6 universal server.js - PullRequest
0 голосов
/ 15 апреля 2019

Я выполняю следующую команду в инструменте командной строки 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 Ответ

2 голосов
/ 15 апреля 2019

При запуске приложения в Angular Universal объекты document, window и browser всегда будут undefined и не имеют эквивалента.

Причина проста: при запуске приложения Angular на стороне клиента подается (почти) пустой HTML-файл, затем Javascript вступает во владение и модифицирует DOM с помощью window, document и т. Д.

При запуске приложения Angular на стороне сервера контекст выполнения совершенно другой, Node.js не знает ни о каком браузере, он просто генерирует HTML в виде полной простой строки, не интерпретируя ее вообще. Вот почему эти ключевые слова не могут быть использованы в этом контексте.

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

...