Angular 7 SSR 报错 "ReferenceError: document is not defined" 的原因是 document 对象在服务器端渲染中未定义。
创始人
2024-10-16 20:00:45
0

在服务器端渲染(SSR)中,由于没有浏览器环境,因此没有定义document对象。在Angular中,通常使用document对象来执行DOM操作,但在服务器端渲染时,需要避免直接使用document对象。

解决这个问题的一种方法是使用Angular Universal,它是Angular官方提供的服务器端渲染解决方案。Angular Universal可以在服务器上渲染Angular应用,避免了在服务器端使用浏览器特定的API。

以下是使用Angular Universal解决此问题的示例代码:

1.首先,安装Angular Universal:

ng add @nguniversal/express-engine

2.创建一个Angular Universal的服务:

ng generate universal my-universal-app

3.在app.server.module.ts文件中,使用PlatformServer模块替换BrowserModule模块:

import { NgModule } from '@angular/core';
import { ServerModule, ServerTransferStateModule } from '@angular/platform-server';

import { AppModule } from './app.module';
import { AppComponent } from './app.component';

@NgModule({
  imports: [
    AppModule,
    ServerModule,
    ServerTransferStateModule,
  ],
  bootstrap: [AppComponent],
})
export class AppServerModule {}

4.在main.ts文件中,使用createServerRenderer函数替换原来的platformBrowserDynamic函数:

import { enableProdMode } from '@angular/core';
import { createServerRenderer } from 'aspnet-prerendering';

import { AppServerModule } from './app/app.server.module';

enableProdMode();

export default createServerRenderer(params => {
  const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = (module as any).exports;
  const options = {
    document: params.data.originalHtml,
    url: params.url,
    extraProviders: [
      provideModuleMap(LAZY_MODULE_MAP)
    ]
  };

  return AppServerModuleNgFactory
    .then(factory => factory(options))
    .then(moduleRef => {
      const appRef: ApplicationRef = moduleRef.injector.get(ApplicationRef);
      const state = moduleRef.injector.get(TransferState);
      const stateData = JSON.stringify(state.toJson());
      return {
        html: options.document,
        globals: {
          app: {
            provide: createTransferScript({ AppServerModule, stateData }),
            useFactory: (transferData: any) => transferData,
            deps: [TransferState]
          }
        }
      };
    });
});

通过使用Angular Universal,你可以在服务器端渲染Angular应用,并避免在服务器端使用浏览器特定的API,如document对象。

相关内容

热门资讯

总算了解!wepoker公共底... 1、总算了解!wepoker公共底牌,aapoker发牌逻辑,教你教程(有挂攻略)。2、aapoke...
今日头条!wepoker挂,h... 今日头条!wepoker挂,hhpoker底牌透视脚本,可靠技巧(有挂技巧);亲真的是有正版授权,小...
1.9分钟了解!wepoker... 1.9分钟了解!wepoker破解器激活码,aapoker怎么开辅助器,大神讲解(有挂神器)科技教程...
我来教大家!wepoker游戏... 我来教大家!wepoker游戏的安装教程,德普之星透视软件免费入口官网,攻略教程(有挂神器)关于德普...
一分钟秒懂!pokemmo辅助... 一分钟秒懂!pokemmo辅助器手机版下载,智星德州插件怎么下载,2025新版(有挂技巧);人气非常...
科技分享!德普之星私人局辅助器... 科技分享!德普之星私人局辅助器,pokernow辅助控制,可靠技巧(有挂教程);人气非常高,ai更新...
大神推荐!we-poker辅助... 自定义wepoker一直输的号能继续打吗系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑...
必知教程!sohoo竞技联盟辅... 1、必知教程!sohoo竞技联盟辅助器,wejoker辅助软件价格,安装教程(有挂方法);详细教程。...
如何分辨真伪!wepoker私... 如何分辨真伪!wepoker私人局可以透视,wepoker底牌透视脚本,AI教程(有挂教程)1、点击...
玩家必备教程!wepoker有... 玩家必备教程!wepoker有辅助功能吗,wepoker数据分析工具,wpk教程(有挂技巧);wep...