AOT - 不支持函数调用Module.forRoot

问题描述 投票:1回答:1

我一直在尝试使用AOT和@ angualar / compiler-cli来编译我的Angular应用程序但是我在编译过程中遇到了一个我无法解决的错误。错误说明:

Error encountered resolving symbol values statically. 
Calling function 'PanelModule', function calls are not supported.
Consider replacing the function or lambda with a reference to an exported function.

我有我的主要AppModule和另一个名为PanelModule的模块。在PanelModule我有一个forRoot方法,我从AppModule调用这样:

app.module.ts / AppModule

@NgModule( {
    imports: [
        BrowserModule,
        routing,
        PanelModule.forRoot(), <----------- If not present it compiles OK
    ],
    declarations: [
        AppComponent,
        LoginView,
        WorkbenchView,
        ErrorView,
        NotFoundErrorView,
        DashboardView,
        BackgroundVideoComponent
    ],
    providers: [
        {
            provide: APP_BASE_HREF,
            useValue: URL_BASE
        },
        CARBON_PROVIDERS,
        CARBON_SERVICES_PROVIDERS,
        appRoutingProviders,
        Title,
    ],
    bootstrap: [ AppComponent ],
} )
export class AppModule {}

panel.module.ts / PanelModule

@NgModule( {
    imports: [
        CommonModule,
        RouterModule,
        SemanticModule,
        DirectivesModule,
        FormsModule
    ],
    declarations: [
        HeaderComponent,
        ...
        PaginatorComponent,
    ],
    exports: [
        HeaderComponent,
        ...
        PaginatorComponent,
    ],
    providers: []
} )

export class PanelModule {

    static forRoot():ModuleWithProviders {
        return {
            ngModule: PanelModule,
            providers: [ HeaderService, SidebarService, RouterService, MyAppsSidebarService, ErrorsAreaService ]
        };
    }
}

如你所见,我在PanelModule上没有lambda函数。我也看到你只能在forRoot中只有一个return语句和一个return语句,但这不是我的情况。我不知道发生了什么。

angular angular2-aot
1个回答
0
投票

我会把这作为一个答案,试着提供一些帮助,让你前进。我已经有了一些关于这个问题的背景知识,并且已经根据我的需求解决了这个问题,所以我可以告诉你我在这里看到的内容,也许它可以提供帮助。

如果你有任何非静态可解析的逻辑,你将在forRoot中得到AOT错误。例如,如果你这样做:

( passing this obj as args: "{ production: true }" )

forRoot ( args ) {
 if ( args.production )...
 (or a ternary, e.g. args.production ? this : that)
}

它将在AOT中崩溃。

甚至导出功能和使用工厂等,这是经常推荐的“修复”,但结果并不一致和可靠。我尝试了我能找到的每一个推荐的编译器属性配置,都无济于事(正如许多其他人遇到的那样)。

有一个令人惊讶的直截了当的方式,但显然这不是你的问题。你没有条件,函数调用或任何东西。

但AOT正在为此而哭泣。所以,某种方式,你在forRoot中拥有的东西不能被AOT编译器静态解析。事实上似乎是,forRoot功能还没有真正准备好迎接黄金时段,它非常天真。例如,您无法直接动态配置导入,因为ModuleWithProviders不允许您修改导入(您实际上可以,但不能以任何文档的方式)。

所以答案是:我发现可疑的第一件事就是你没有向forRoot提供任何参数。如果您不使用forRoot来动态配置提供程序,则没有太多意义。事实上,我认为forRoot需要一个参数。所以我会检查出来。

如果做不到这一点,我的猜测就是,这是你的一个进口产品,或者是你的供应商之一。其中一个元素以某种方式做了一些AOT编译器无法静态解析的东西。也许你的自定义类型?

我,我将它们全部删除并尝试编译。如果它有效,你就会知道问题所在。如果没有,则问题在树上更高。

有了整个(可编译的)代码库,我可能会帮助你更多。但就目前而言,当我遇到这个问题时,这就是我追求这个问题的方法。我设法缩小了有问题的因素,这使我开始寻求解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.