【问题标题】:Routing to sub routing module without lazy loading无延迟加载路由到子路由模块
【发布时间】:2017-08-01 20:24:17
【问题描述】:

我想拥有多个routing 模块,以保持我的应用程序干净且易于阅读。我目前对SubComponent 使用延迟加载,但我不想这样做。所以我正在寻找一种方法来改变这一点。无论如何,这是当前工作的代码。

我有以下两个路由文件。

app-routing.module.ts

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

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'sub', loadChildren: './sub/sub.module#SubModule' }
];

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

sub-routing.module.ts

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

const routes: Routes = [
  { path: '', component: SubComponent, children: [
    { path: 'new', component: SubEditComponent }
  ] },
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})

这种方式可以正常工作,但我不想对这个SubComponent 应用延迟加载。所以,理想情况下,我想将app-routing.module.ts 更改为:

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

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'sub', component: SubComponent }
];

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

这将不起作用并导致以下错误:

ERROR Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'sub/new'
Error: Cannot match any routes. URL Segment: 'sub/new'

SubComponent 的大小将大幅增长,出于我自己的原因,我不想应用延迟加载。那么无论如何,有没有办法在避免延迟加载的同时使用多个路由文件呢?

【问题讨论】:

    标签: angular routing lazy-loading router angular-routing


    【解决方案1】:

    你试过这样加载吗:

    { path: 'sub', loadChildren: () => SubModule }

    您可以找到更多详细信息here

    【讨论】:

    • 谢谢,我会通读一遍,明天试试你的解决方案。如果可行,会及时通知您并点赞。
    • 这将禁用延迟加载功能。
    • 它适用于重新编译,但在构建或重新运行应用程序时出现语法错误。您如何克服此错误:无法读取未定义的属性“loadChildren”中的错误
    • 请注意,此解决方案可能会导致生产版本出现问题。错误将是:ERROR: Runtime Compiler is Not Loaded 或类似的东西。参考:GithubStack-Overflow
    【解决方案2】:

    您忘记将子路由声明到new

    const routes: Routes = [
      { path: '', component: HomeComponent },
      { 
        path: 'sub', 
        component: SubComponent,
        children: [
          { path: 'new', component: SubEditComponent }
        ] 
      }
    ];
    

    如果你想保留第二个路由模块,那么

    sub-routing.module.ts

    const routes: Routes = [
      { path: 'sub', component: SubComponent, children: [
        { path: 'new', component: SubEditComponent }
      ] },
    ];
    

    sub.module.ts

    @NgModule({
      ...
      imports: [
       ...
       SubRoutingModule,
    

    app.module.ts

    @NgModule({
    
      imports: [
        ...,
        AppRoutingModule,
        SubModule
    

    Plunker Example

    【讨论】:

    • 这会使第二个路由模块过时——这是我明确想要避免的。
    • 感谢您的编辑,但导入已存在且无法正常工作。
    • @Spurious 我想你忘了把 { path: '', component: SubComponent 改成 { path: 'sub', component: SubComponent in sub-routing.module.ts
    • 这是适用于 prod (AOT) 构建的正确答案。总而言之,将子模块导入 AppModule,并将路由仅放在子模块中。子模块路由不需要 AppModule 中的任何路由条目。
    【解决方案3】:

    app.module.ts

     @NgModule({
        
          imports: [
            ...,
           SubModule,   /* subModule with routing, the order is very important */ 
           AppRoutingModule,  // put it at the end
          ]
    }
    

    路由模块的顺序很重要。

    AppRoutingModule.ts

    const routes: Routes = [
      // filter path '**' will prevent routing to the subModule
      { path: '**', component: PageNotFoundComponent },
    ];
    

    【讨论】:

      【解决方案4】:

      您可以像 eminlala 所说的那样使用箭头功能,但如果您运行 prod 构建,它将不起作用。

      { path: 'sub', loadChildren: () => SubModule }
      

      因此,为了使其在 prod 构建中工作,您需要创建一个导出函数,如下所示。

      import SubModule from 'path-to-sub-module';
      
      export function loadSubModule() {
        return SubModule;
      }
      
      export const SUB_MODULE_ROUTING = {
        path: 'sub',
        loadChildren: loadSubModule,
      };
      

      我用这个conf创建一个文件并将它导入到AppRoutingModule中,但是你可以将它写在AppRoutingModule里面。

      希望对你有帮助。

      【讨论】:

      • 建议的解决方案对 prod 构建没有任何影响。
      猜你喜欢
      • 1970-01-01
      • 2017-08-21
      • 2018-12-22
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多