Angular Universal Firebase:没有InjectionToken MODULE_MAP的提供者

Phi*_*hil 6 firebase google-cloud-functions angular-universal angular

我为什么得到

Error: StaticInjectorError(AppServerModule)[NgModuleFactoryLoader -> InjectionToken MODULE_MAP]: 

  StaticInjectorError(Platform: core)[NgModuleFactoryLoader -> InjectionToken MODULE_MAP]: 

    NullInjectorError: No provider for InjectionToken MODULE_MAP!
Run Code Online (Sandbox Code Playgroud)

什么时候尝试使用firebase进行部署?

我确实用过

extraProviders: [

  provideModuleMap(LAZY_MODULE_MAP)

]
Run Code Online (Sandbox Code Playgroud)

并在我的app-server.module我导入ModuleMapLoaderModule(顺便说一下,我尝试以不同的顺序导入ServerModule和AppModule,我被告知它可能是问题,但它没有用):

@NgModule({

  imports: [

    ServerModule,

    AppModule,

    ModuleMapLoaderModule,

  ],

  bootstrap: [AppComponent],

})

export class AppServerModule { }
Run Code Online (Sandbox Code Playgroud)

main.bundle.js包含这个:

Object.defineProperty(exports, "__esModule", { value: true });

var app_server_module_ngfactory_1 = __webpack_require__("./src/app/app.server.module.ngfactory.js");

exports.AppServerModuleNgFactory = app_server_module_ngfactory_1.AppServerModuleNgFactory;

var __lazy_0__ = __webpack_require__("./src/app/features/blog/blog.module.ngfactory.js");

var app_server_module_1 = __webpack_require__("./src/app/app.server.module.ts");

exports.AppServerModule = app_server_module_1.AppServerModule;

exports.LAZY_MODULE_MAP = { "app/features/blog/blog.module#BlogModule": __lazy_0__.BlogModuleNgFactory };
Run Code Online (Sandbox Code Playgroud)

main.bundle.js是否正确导入firebase脚本,因为如果我更改了一些字母require(...),我会收到一个错误,该文件未知.那有什么不对LAZY_MODULE_MAP?它看起来像是一个字符串路由到工厂的map/js-object,它会被导出.那为什么不能provideModuleMap正确解决呢?在BlogModule只有一个Hello-世界存根组件的声明.

顺便说一句,这里有一个类似的问题,但没有回复:Angular5 Universal在firebase托管和seo上的延迟加载

use*_*075 12

TLDR;

npm uninstall @nguniversal/common
npm uninstall @nguniversal/module-map-ngfactory-loader
Run Code Online (Sandbox Code Playgroud)

ModuleMapLoaderModule从您的app.server.module.ts.

TSWM;

在 Angular < 9 中,Universal 依赖@nguniversal/common@nguniversal/module-map-ngfactory-loader处理延迟加载的模块。使用 Angular 9+,他们现在提供开箱即用的ngExpressEngine处理此问题的方法。所有你需要的是@nguniversal/express-engine作为该文档提到。


小智 3

当我尝试添加 module-map-ngfactory-loader 来启用延迟加载时,我偶然发现了这个错误,但在新版本的 Angular 中,您不需要手动添加此模块。Ivy 不支持基于字符串的延迟加载语法,因此@nguniversal/module-map-ngfactory-loader不再需要。

卸载模块( npm uninstall "package-name" )。删除 ModuleMapLoaderModule 对我有用。

详细信息请参见此处