Angular Universal Firebase:没有 InjectionToken MODULE_MAP 的提供程序

作者:编程家 分类: angular 时间:2025-07-10

# Angular Universal Firebase: 解决 "没有 InjectionToken MODULE_MAP 的提供程序" 错误

在使用 Angular Universal 结合 Firebase 构建应用程序时,你可能会遇到一个常见的错误信息:"没有 InjectionToken MODULE_MAP 的提供程序"。这个错误通常发生在服务端渲染 (Server-Side Rendering, SSR) 的情况下,特别是当尝试在 Angular Universal 中集成 Firebase 时。在本文中,我们将深入探讨这个问题的原因,并提供一种解决方法。

## 问题背景

Angular Universal 使我们能够在服务器端渲染应用程序,以提高性能和搜索引擎优化。然而,当我们引入 Firebase 时,可能会遇到 "没有 InjectionToken MODULE_MAP 的提供程序" 错误。这个错误表明在渲染过程中,Angular Universal 缺少必要的模块映射信息。

## 错误原因

这个错误通常是由于在服务端渲染期间,Firebase 模块需要访问 Angular 的模块映射 (MODULE_MAP),以便正确处理应用程序的路由。然而,由于服务端和客户端执行环境的不同,导致了在服务端缺少这些必要的映射信息,从而触发了错误。

## 解决方法

要解决这个问题,我们需要在服务端渲染期间手动提供模块映射信息。为此,我们可以使用 Angular 提供的 InjectionToken 来确保模块映射在服务端渲染期间是可用的。

typescript

// app.module.ts

import { NgModule, Inject, PLATFORM_ID } from '@angular/core';

import { BrowserModule } from '@angular/platform-browser';

import { isPlatformBrowser, isPlatformServer } from '@angular/common';

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

import { MODULE_MAP } from '@nguniversal/module-map-ngfactory-loader';

@NgModule({

declarations: [AppComponent],

imports: [BrowserModule],

providers: [

// Other providers...

// Ensure the MODULE_MAP is available on the server side

{

provide: MODULE_MAP,

useFactory: getModuleMap,

deps: [PLATFORM_ID]

},

],

bootstrap: [AppComponent],

})

export class AppModule {}

// app.server.module.ts

import { NgModule } from '@angular/core';

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

import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader';

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

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

@NgModule({

imports: [

AppModule,

ServerModule,

ServerTransferStateModule,

ModuleMapLoaderModule,

],

bootstrap: [AppComponent],

})

export class AppServerModule {}

// app.browser.module.ts

import { NgModule } from '@angular/core';

import { BrowserModule } from '@angular/platform-browser';

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

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

@NgModule({

imports: [AppModule, BrowserModule],

bootstrap: [AppComponent],

})

export class AppBrowserModule {}

// main.ts

import { enableProdMode } from '@angular/core';

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppBrowserModule } from './app.browser.module';

const platform = platformBrowserDynamic();

platform.bootstrapModule(AppBrowserModule);

在上述代码中,我们通过 `MODULE_MAP` 提供者确保了在服务端渲染期间,模块映射信息是可用的。通过 `getModuleMap` 工厂函数,我们可以根据执行环境的不同,动态地提供正确的模块映射信息。

通过以上方法,我们可以成功解决 "没有 InjectionToken MODULE_MAP 的提供程序" 错误,确保 Angular Universal 和 Firebase 的顺利集成。希望这篇文章对你解决类似问题时有所帮助。