错误:
factory(require("jquery"), document, window, navigator);
^ReferenceError: document is not defined
面对问题角度通用渲染服务器端,我搜索了这个并经历了很多帖子但没有得到任何有用的资源。
答案 0 :(得分:1)
Jquery在浏览器端工作,服务器端不支持浏览器功能。 例如,如果你想在angular universal中使用jquery,你必须确保你只在浏览器端使用它。
例如,您可以执行以下操作。
在component.ts文件中导入以下内容。
import { isPlatformServer } from '@angular/common';
import * as $ from 'jquery';
然后在你的ngOnInit函数中执行以下操作
constructor(@Inject(PLATFORM_ID) private platformId: any) {}
ngOnInit() {
if (isPlatformBrowser(this.platformId)) {
/* jQuery here */
$("#test-button").click(function () {
alert('WOOOW');
$(this).css("background","#000");
});
}
}
答案 1 :(得分:0)
如果您使用服务器端,则必须添加检查平台是否为浏览器或服务器,因为文档,窗口等关键字在服务器端支持中不可用
你可以使用角度来看isPlatformBrowser。
答案 2 :(得分:0)
为避免错误,您可以在NodeJS服务器实现document
中为window
和server.ts
对象创建模拟:
// ssr DOM
const domino = require('domino');
const fs = require('fs');
const path = require('path');
// index from browser build!
const template = fs.readFileSync(path.join(DIST_FOLDER, 'index.html')).toString();
// for mock global window by domino
const win = domino.createWindow(template);
// mock
global['window'] = win;
// not implemented property and functions
Object.defineProperty(win.document.body.style, 'transform', {
value: () => {
return {
enumerable: true,
configurable: true,
};
},
});
// mock documnet
global['document'] = win.document;
// othres mock
global['CSS'] = null;
// global['XMLHttpRequest'] = require('xmlhttprequest').XMLHttpRequest;
global['Prism'] = null;
Here you can find working example
修改后,再次重建服务器源。
答案 3 :(得分:0)
我遇到了同样的问题,进行了搜索。在https://github.com/angular/universal-starter/issues/623
上找到了这个答案将此代码放在您的server.ts文件中
const domino = require("domino");
const fs = require("fs");
const path = require("path");
const templateA = fs
.readFileSync(path.join("dist/browser", "index.html"))
.toString();
const win = domino.createWindow(templateA);
win.Object = Object;
win.Math = Math;
global["window"] = win;
global["document"] = win.document;
global["branch"] = null;
global["object"] = win.object;