在 Angular 9 中,服务器端渲染 (Server Side Rendering - SSR) 使用了 Angular Universal 模块。但是,由于服务器端没有浏览器环境,因此无法访问 DOM 对象,如 document 或 window。
出现错误 ReferenceError: document is not defined 的原因是在服务器端代码中使用了 document 对象。为了解决这个问题,我们需要在服务器端代码中进行一些修改。
下面是一个解决方法的代码示例:
const domino = require('domino');
const fs = require('fs');
const path = require('path');
const template = fs.readFileSync(path.join(__dirname, 'dist/browser', 'index.html')).toString();
const win = domino.createWindow(template);
global['window'] = win;
global['document'] = win.document;
import { enableProdMode } from '@angular/core';
import { createServerRenderer } from 'aspnet-prerendering';
import { AppServerModuleNgFactory } from './main.server';
enableProdMode();
export default createServerRenderer(params => {
const { AppServerModule, AppServerModuleNgFactory } = require('./main.server');
return AppServerModuleNgFactory
.then(moduleFactory => platformServer().bootstrapModuleFactory(moduleFactory))
.then(appModule => appModule.renderToString());
});
这样,通过创建一个虚拟的 document 对象,我们就可以在服务器端进行渲染而不会出现错误 ReferenceError: document is not defined。
请注意,以上代码示例是基于 Angular 9 版本的,如果你使用的是其他版本的 Angular,可能需要进行一些适应性调整。
希望以上解决方法能够帮助到你!