未定义角度通用窗口

时间:2020-02-17 11:07:30

标签: angular angular8 server-side-rendering angular-universal

我试图在我的angular8项目上运行SSR,但是当我运行server.js时会发生此错误

    home/daba/client/dist/server/main.js:288235
})(window, document, 'Hammer');
^

ReferenceError: window is not defined
at Object.yLV6 (/home/daba/client/dist/server/main.js:288235:4)
at webpack_require (/home/daba/client/dist/server/main.js:20:30)
at Object.ZAI4 (/home/daba/client/dist/server/main.js:171354:1)
at webpack_require (/home/daba/client/dist/server/main.js:20:30)
at Object.V7fC (/home/daba/client/dist/server/main.js:161821:10)
at webpack_require (/home/daba/client/dist/server/main.js:20:30)
at Object.K011 (/home/daba/client/dist/server/main.js:125145:37)
at webpack_require (/home/daba/client/dist/server/main.js:20:30)
at Object.0 (/home/daba/client/dist/server/main.js:1251:18)
at webpack_require (/home/daba/
client/dist/server/main.js:20:30)
`

我尝试了很多事情,但还是没做

2 个答案:

答案 0 :(得分:2)

服务器端应用程序不能引用仅浏览器的全局对象,例如窗口,文档,导航器或位置。您必须检查代码是在服务器端还是在客户端运行:

constructor(
    @Inject(PLATFORM_ID) private platformId: Object
)

...
myFunction() {
    if (isPlatformBrowser(this.platformId)) {
        // do something with window here
    }
}

答案 1 :(得分:0)

您是否曾尝试在const app = express();之前将此代码添加到server.ts中?避免第三方库不允许在服务器端使用它们可能会有所帮助。

import * as fs from 'fs';
import * as domino from 'domino';

const template = fs.readFileSync('browser/index.html').toString();
const win = domino.createWindow(template);

global['window'] = win;
global['document'] = win.document;
global['navigator'] = win.navigator;
global['Event'] = null;