找不到“ s”的NgModule元数据。 (仅限生产)

时间:2019-07-12 10:31:10

标签: angular

我在应用程序的开头添加了用于加载配置设置的代码,这些代码可供MSAL使用。

我正在关注以下示例: https://stackblitz.com/edit/angular6-intercom-issue-shhf69

它在dev(在VS中进行调试)...和在生产中(过去的某个时候)都非常有效。 我做了一些更改,当它变成天蓝色时,它停止了工作。

仅当我部署到生产环境(Azure应用程序服务)时,我才遇到问题。

这是错误:

  

未处理的承诺拒绝:找不到“ s”的NgModule元数据。 ;区域:任务:Promise.then;值:错误:找不到“ s”的NgModule元数据。

Error

这是我的简化代码,显示了动态加载AppModule时遇到的问题。

main.ts

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

import('./app/app.module').then(module => {

  platformBrowserDynamic().bootstrapModule(module.AppModule).catch(err => console.error(err));

});

app.module.ts

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

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';

import { DashboardModule } from './components/dashboard/dashboard.module';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    DashboardModule,
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

app-routing.module.ts (请注意,为了方便阅读,我删除了一些基于页面的模块)

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { DashboardComponent } from './components/dashboard/dashboard/dashboard.component';

const routes: Routes = [
  { path: '', component: DashboardComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

我浏览了许多文章,解释了问题是与引导模块有关,但是没有解决方案可以修复我的代码。

我的引导程序不是很简单(因为我从平时更改了它),但是它确实可以在开发人员中使用。

有人可以建议吗?


编辑1:

运行“ ng build --prod”时收到以下警告

  

未启用“惰性路由发现”中的警告。因为在主文件中既没有entryModule也没有静态可分析的引导程序代码。

编辑2:

这是引发错误的未缩小代码。

在抛出错误之前,我已经设置了一个断点...

bootstrapModule(t)

...然后您会在右侧看到t的值。

enter image description here

编辑3:

我设法删除了大部分代码,同时保留了错误,并更新了上面提供的代码。

对于那些可能会问为什么我需要动态加载'./app/app.module'并想知道为什么要这样做的人...

import('./app/app.module').then(module => {

  platformBrowserDynamic().bootstrapModule(module.AppModule).catch(err => console.error(err));

});

...请查看我顶部链接的网站。我将其保留为这种形式,因为我知道这是导致问题的原因(但导入后无需在then()中使代码复杂化。但是(我认为)这是必需的。

编辑4:

这是(.NET内核中的)代码,可防止在我的本地系统上引发错误。如果我将其注释掉,该错误也会在本地引发。

spa.UseAngularCliServer(npmScript: "start");

1 个答案:

答案 0 :(得分:2)

这不是最终的解决方案,但是如果在构建中禁用AOT,可以暂时在angular.json的生产配置中将其禁用。 至少直到您得到实际的解决方案为止。这样一来,您就可以使Azure网站同时运行。

    "aot": false,
    "buildOptimizer": false

这确实不是一个很好的解决方案,但是它将同时使您的Azure应用服务正常工作。