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对象。

相关内容

热门资讯

第9分钟辅助!天天卡五星2辅助... 第9分钟辅助!天天卡五星2辅助插件,原来有辅助app(揭秘有挂)1、让任何用户在无需天天卡五星2辅助...
第8分钟辅助!卡五星游戏有挂吗... 第8分钟辅助!卡五星游戏有挂吗,一直存在有辅助神器(了解有挂)1、用户打开应用后不用登录就可以直接使...
第六分钟辅助!随意玩免费辅助器... 第六分钟辅助!随意玩免费辅助器,总是真的是有辅助插件(有挂技术)1、玩家可以在随意玩免费辅助器透视最...
7分钟辅助!广东雀伸辅助器,切... 7分钟辅助!广东雀伸辅助器,切实是真的有辅助工具(有挂细节)1、首先打开广东雀伸辅助器辅助器下载最新...
5分钟辅助!蜀山四川破解版安卓... 5分钟辅助!蜀山四川破解版安卓,其实是真的有辅助技巧(有挂助手)一、蜀山四川破解版安卓游戏安装教程牌...
1分钟辅助!途游手游辅助脚本平... 1分钟辅助!途游手游辅助脚本平台,总是真的有辅助器(有挂工具)1、任何途游手游辅助脚本平台透视是真的...
两分钟辅助!闲娱江西打盾插件,... 两分钟辅助!闲娱江西打盾插件,原来是有辅助工具(揭秘有挂)1、金币登录送、破产送、升级送、活动送。详...
六分钟辅助!财神辅助功能,确实... 六分钟辅助!财神辅助功能,确实有辅助脚本(有挂教程)1、财神辅助功能辅助器安装包、财神辅助功能辅助器...
第6分钟辅助!闲来软件辅助,一... 第6分钟辅助!闲来软件辅助,一贯有辅助脚本(有挂详情)1、每一步都需要思考,不同水平的挑战会更加具有...
第一分钟辅助!摆八张辅助,本来... 第一分钟辅助!摆八张辅助,本来真的有辅助软件(的确有挂)暗藏猫腻,小编详细说明摆八张辅助破解器有用吗...