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

时间:2018-03-22 14:44:54

标签: angular firebase google-cloud-functions angular-universal

为什么我

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

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

    NullInjectorError: No provider for InjectionToken MODULE_MAP!

尝试使用firebase进行部署时?

我确实使用

extraProviders: [

  provideModuleMap(LAZY_MODULE_MAP)

]

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

@NgModule({

  imports: [

    ServerModule,

    AppModule,

    ModuleMapLoaderModule,

  ],

  bootstrap: [AppComponent],

})

export class AppServerModule { }

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 };

main.bundle.js确实会在firebase脚本中正确导入,因为如果我更改require(...)中的某些字母,则会收到该文件未知的错误。那么LAZY_MODULE_MAP有什么问题?它看起来像是一个字符串路由到工厂的map / js-object,它会被导出。那么为什么provideModuleMap无法正确解决? BlogModule只有Hello-World-Stub组件的声明。

是的,这里有一个类似的问题,但没有回复:Angular5 Universal lazy loading on firebase hosting and seo

2 个答案:

答案 0 :(得分:8)

TLDR;

npm uninstall @nguniversal/common
npm uninstall @nguniversal/module-map-ngfactory-loader

并从ModuleMapLoaderModule中删除app.server.module.ts

TSWM;

在Angular <9中,Universal依靠@nguniversal/common@nguniversal/module-map-ngfactory-loader处理延迟加载的模块。现在,使用Angular 9+,他们可以提供开箱即用的ngExpressEngine。您所需要的只是@nguniversal/express-engine(如the docs所述。

答案 1 :(得分:2)

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

卸载模块(npm卸载“ package-name”)。并删除ModuleMapLoaderModule对我有用。

see here for detail