【问题标题】:Angular 4.0.0 could not find bootstrap codeAngular 4.0.0 找不到引导代码
【发布时间】:2017-04-11 06:55:33
【问题描述】:

错误:试图查找引导代码,但指定静态可分析的引导代码或将 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 } 

【问题讨论】:

  • 你想达到什么目的?只需获取 json 并将其传递给 ?....
  • 我想获取 json 并希望通过 @Ngmodules providers { provide: Config, useValue: conf }
  • JSON 只是应用程序配置还是createAppModule() 根据conf 变量中的值创建不同的模块?您可以将该代码添加到您的问题中吗?

标签: angular angular2-modules


【解决方案1】:

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

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

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

【讨论】:

  • 如果您想在导入模块的配置中使用配置设置(比如 url),这不起作用。例如。 myFancyLib.forRoot({ backend: environment.backend }) :(
【解决方案2】:

cli 正在尝试使用提前编译。因此,它需要能够找到您的主要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

【讨论】:

  • 实际上你可以在tsconfig.json中指定入口模块...我已经做了很长时间了:`“angularCompilerOptions”:{“entryModule”:“app/app/ app.module#AppModule" }`
【解决方案3】:

接受的答案对我不起作用。 提取 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();
});

【讨论】:

  • 我的应用有条件地进行引导。这解决了我的问题,这似乎也合乎逻辑。有人反对这个修复吗?为什么这个解决方案没有人赞成?
猜你喜欢
  • 2020-09-22
  • 2017-09-29
  • 1970-01-01
  • 2023-04-08
  • 2018-07-29
  • 2015-06-04
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
相关资源
最近更新 更多