使用 AOT 的 Angular 多入口点

Posted

技术标签:

【中文标题】使用 AOT 的 Angular 多入口点【英文标题】:Angular Multiple Entry Points with AOT 【发布时间】:2018-05-06 12:32:18 【问题描述】:

我有一个使用 webpack 编译并使用多个入口点的 Angular 应用程序:

    entry: 
        'app1': helpers.root('src', 'app1', 'main.ts'),
        'app2': helpers.root('src', 'app2', 'main.ts')
    

我使用CommonsChunkPlugin 在这些应用程序之间合并供应商文件,效果很好。不过,我现在也想使用 AOT 编译。

使用@ngtools/webpack我只能aotify一个应用程序。有没有办法为这两个应用程序执行此操作?

    new ngToolsWebpack.AngularCompilerPlugin(
        tsConfigPath: helpers.root('tsconfig.json'),
        entryModule: helpers.root('src', '[name]', 'app', 'app.module#AppModule'),
    ),

使用[name](类似于webpack 的output)不起作用(见上文)。有没有办法以另一种方式实现相同的目标?

【问题讨论】:

我现在选择忽略 CommonsChunksPlugin 以支持 AOT 性能提升和文件大小减少。不确定是否有办法同时使用两者。 【参考方案1】:

不要指定entryModule

...
            plugins: [
            new AngularCompilerPlugin(
                tsConfigPath: ./tsconfig-aot.json,
            ),
    ]

...

【讨论】:

【参考方案2】:

很遗憾,使用 Aot 编译,它不允许您使用多个 entryModule 构建多个应用程序。如果要执行 AoT 编译,则需要将 app1、app2 拆分为两个 webpack 配置。每个配置将具有以下内容:

app1.config.js:
     new ngToolsWebpack.AngularCompilerPlugin(
        tsConfigPath: helpers.root('tsconfig.json'),
        entryModule: helpers.root('src', '[name]', 'app', 'app1.module#AppModule'),
    ),

app2.config.js:
    new ngToolsWebpack.AngularCompilerPlugin(
        tsConfigPath: helpers.root('tsconfig.json'),
        entryModule: helpers.root('src', '[name]', 'app', 'app2.module#AppModule'),
    )

【讨论】:

【参考方案3】:

如果你使用 webpack 4,你不应该使用 commonsChunk 插件,你应该使用 Optimize.splitChunks。它适用于 AOT。

【讨论】:

以上是关于使用 AOT 的 Angular 多入口点的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Angular library 的 secondary entry points?

错误:目标入口点“@angular/flex-layout”缺少依赖项:-@angular/cdk/bidi

iPhone 密码入口点

C#提示不只定义了一个入口点,请使用/main进行编译以指定包含入口点的类型

在没有虚拟内存的系统上如何处理ELF入口点地址?

入口点大小限制:代码拆分以限制 vue cli 3.x 中入口点的大小