延迟从Angular 7中的编译库加载模块

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

我试图从库中延迟加载NgModule。我有一个应用程序,其中包含一些库(项目)。这些库在其他一些项目中重用。问题是我找不到一个解决方案,可以同时使用jit和aot,以及编译/未编译的库。

文件结构是这样的

app
-projects
--lib
---(lib files)
-src
--(app files)

AppModule有路由,看起来像这样

const routes: Routes = [
    {
        path: 'eager',
        children: [
            {
                path: '',
                component: LibComponent // component imported from lib
            },
            {
                path: 'lazy',
                loadChildren: 'lib/src/lib/lazy/lazy.module#LazyModule' // module i want to load lazily
            }
        ]
    }
];

如果我像这样使用它,我试图导航到jit中的懒惰路线时出现运行时错误(aot正常工作):ERROR Error: Uncaught (in promise): TypeError: undefined is not a function TypeError: undefined is not a function

这个评论https://github.com/angular/angular-cli/issues/9488#issuecomment-370065452建议不要将LazyModule包含到任何桶文件中,但是如果我从库的public_api中排除它我会得到构建错误:

ERROR in ./projects/lib/src/lib/lazy/lazy.module.ts
Module build failed (from ./node_modules/@ngtools/webpack/src/index.js):
Error: C:\projects\lazy_minimal\lazy-minimal\projects\lib\src\lib\lazy\lazy.module.ts is missing from the TypeSc
ript compilation. Please make sure it is in your tsconfig via the 'files' or 'include' property.
    at AngularCompilerPlugin.getCompiledFile (C:\projects\lazy_minimal\lazy-minimal\node_modules\@ngtools\webpac
k\src\angular_compiler_plugin.js:752:23)
    at plugin.done.then (C:\projects\lazy_minimal\lazy-minimal\node_modules\@ngtools\webpack\src\loader.js:41:31
)
    at process._tickCallback (internal/process/next_tick.js:68:7)

有没有办法使它适用于aot和jit?

angular angular-cli lazy-loading jit
1个回答
0
投票

Angular-CLI中存在一个问题,即在延迟加载方式here中以node_modules加载编译库,它仍然打开。

最后的解决方案是:

这个帖子刚刚开通了。有了这样的评论,除了最新的评论之外,人们很难找到任何信息。但另一方面,我认为大多数人都不会审阅所有评论。看到这个帖子的新用户主要阅读第一个和最新的评论,并在两者之间丢失内容。

因此,由于上述原因(大量评论,隐藏评论,难以报告和告知人们)我正在锁定此问题以防止此评论在新评论出现时丢失。

感谢所有报告并帮助诊断问题并提供解决方法的人。

我们推荐的在角度工作空间或节点模块中延迟加载库的方法是使用代理/包装器模块。使用这种方法,延迟加载将在JIT和AOT模式下工作。还有其他解决方案仅在AOT模式下工作,例如tsconfig导入,但为了获得更好的开发体验,我们不鼓励这样做。

下面是一个推荐方法的例子;

第一个lazy/lazy.module.ts

import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { LibModule, LazyComponent } from 'my-lib';

@NgModule({
  imports: [
    LibModule,
    RouterModule.forChild([
      { path: '', component: LazyComponent, pathMatch: 'full' }
    ])
  ]
})
export class LazyModule { }

然后app.module.ts

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

import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
  ],
  imports: [
    RouterModule.forRoot([
      { path: '', component: HomeComponent, pathMatch: 'full'},
      { path: 'lazy', loadChildren: './lazy/lazy.module#LazyModule'},
    ]),
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

1月10日,对于合作者的角度锁定和有限的对话

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