6

错误:尝试查找引导代码,但指定可静态分析的引导代码或将 entryModule 传递给插件选项。

main.ts

getHttp().get('/assets/config.json').toPromise()
 .then((res: Response) => {
 let conf = res.json();
 platformBrowserDynamic().bootstrapModule(createAppModule(conf));
})

我正在使用 angular-cli。使用 angular v2.3.1,此代码运行良好。

我想获取 json 并将其传递给 @Ngmodules 提供者

{ provide: Config, useValue: conf } 
4

3 回答 3

3

如果您从中获取的数据config.json只是应用程序模块的配置,并且您正在尝试创建一个Config服务来存储它们,我认为最好将其分配给您的服务并稍后environment在您的服务中读取它。可在 中使用Config,因此无需 hacking ( )。environmentmain.tscreateAppModule

import { environment } from './environments/environment';
import { AppModule } from './app/';

getHttp().get('/assets/config.json').toPromise()
   .then((res: Response) => {
       let conf = res.json();
       environment.settings = conf;
       platformBrowserDynamic().bootstrapModule(AppModule);
});

environment您还必须在src/environments/environment.ts文件中声明所有新属性。

于 2017-04-14T08:52:50.567 回答
2

cli 正在尝试使用提前编译。因此,它需要能够找到您的 main NgModule

通常,AOT 编译器仅通过查找引导调用就能够静态地执行此操作。但是,您不会立即引导,因此编译器需要您明确告诉它您的应用程序模块的名称,以便它可以编译它以及它的所有组件。

解决方案

ng eject并手动配置entryModule

首选的解决方案是告诉 cli 你的entryModule. 这将允许 AOT 工作并为您提供它的所有好处。但是 cli 目前不支持这个(但是有一个 PR 可以添加一个选项#4077)。

当前的解决方法是使用ng eject --aot切换到基于 webpack 的手动构建。然后你可以entryModule直接配置你的。

  1. ng eject --aot
  2. 打开webpack.config.js并搜索new AotPlugin
    • 添加以下内容并替换您的AppModule姓名
      entryModule: 'path/to/app.module#AppModule'

跳过 AOT

--no-aot如果您只需要构建工作,您可以使用该标志完全跳过此问题。不建议这样做,因为您的应用程序会比平时慢得多且更大(它必须在运行时编译组件,并且您必须提供大型编译器)。

ng prod --no-aot

于 2017-04-17T18:15:33.897 回答
2

接受的答案对我不起作用。提取 bootstrapModule 部分将让 Angular 找到引导代码。

import { environment } from './environments/environment';
import { AppModule } from './app/';

const bootstrap = () => {
  platformBrowserDynamic().bootstrapModule(AppModule);
};

getHttp().get('/assets/config.json').toPromise()
    .then((res: Response) => {
       let conf = res.json();
       environment.settings = conf;
       bootstrap();
});
于 2017-11-08T09:32:07.353 回答