Маршруты загрузки Angular из API $$ _ lazy_route_resource ленивая рекурсивная ошибка

Я получаю сообщение об ошибке: не могу найти модуль

'src/app/settings/settings.module'.
    at eval (eval at ./src/$$_lazy_route_resource lazy recursive

При попытке добавить ленивые загружаемые модули из моего api. Что затрудняет отладку для меня, так это тот факт, что, когда я попробовал это на StackBlitz, он, похоже, работал нормально. Вот ссылка на мой проект: Динамические маршруты из API Однако, когда я перемещаю проект из StackBlitz и заново создаю его на своем компьютере, я получаю сообщение об ошибке.

Важно отметить, что когда я опубликовал свои маршруты, которые поступают из API ниже, вы увидите, что они включают 'src' перед 'app' для модуля с отложенной загрузкой (settings.module), это делается только потому, что StackBlitz имеет вложенный Папка src. Кроме того, если вы попытаетесь экспортировать мой проект, вам нужно будет добавить каталог src в свойство main файла angular-cli.json. Я не уверен, как это может повлиять на модули. Я занимаюсь этим несколько дней, и любая помощь будет принята с благодарностью.

Я использую такую ​​услугу:

import {
  Injectable,
  Compiler,
  NgModuleFactory,
  NgModuleFactoryLoader,
  Injector,
  NgModuleRef,
} from '@angular/core';
import { Router } from '@angular/router';
import { ApiRoute } from '../models/apiroutes.interface';

@Injectable()
export class ModuleFactoryLoader {
  private moduleRef: NgModuleRef<any>;
  constructor(
    private loader: NgModuleFactoryLoader,
    private injector: Injector,
    private router: Router,
  ) {
  }

  load(apiRoute: ApiRoute): void {
    this.loader.load(apiRoute.loadChildren).then(moduleFactory => {
      this.moduleRef = moduleFactory.create(this.injector).instance;
      this.router.config.unshift({
        path: apiRoute.path,
        loadChildren: apiRoute.loadChildren,
      });
      console.debug('moduleRef', this.moduleRef);
    }).catch(err => {
        console.error('error loading module', err);
      });
  }
}

и мои маршруты, которые исходят из моего (фиктивного) api:

[
{
path: "test",
component: "TestComponent",
data: {
icon: "check"
}
},
{
path: "settings",
loadChildren: "src/app/settings/settings.module#SettingsModule"
},
{
path: "home",
component: "HomeComponent",
data: {
icon: "home"
}
},
{
path: "self-service",
component: "RouteSelfServiceComponent",
data: {
icon: "build"
}
}
]

Версия Angular, работающая на моем компьютере:

Angular CLI: 6.0.8 Узел: 8.9.1 ОС: win32 x64 Angular: ...

Версия пакета ------------------------------------------------ ------ @ angular-devkit / architecture 0.6.8 @ angular-devkit / core 0.6.8 @ angular-devkit / schematics 0.6.8 @ schematics / angular 0.6.8 @ schematics / update 0.6.8 rxjs 6.2. 1 машинописный текст 2.7.2

package.json:

{
  "name": "angular-template",
  "description": "",
  "homepage": "https://stackblitz.com/edit/angular-dynamic-components-and-routes",
  "dependencies": {
    "@angular/animations": "6.0.5",
    "@angular/cdk": "6.3.0",
    "@angular/common": "6.0.0",
    "@angular/compiler": "6.0.0",
    "@angular/core": "6.0.0",
    "@angular/forms": "6.0.0",
    "@angular/http": "^5.0.0",
    "@angular/material": "6.3.0",
    "@angular/platform-browser": "6.0.0",
    "@angular/platform-browser-dynamic": "6.0.0",
    "@angular/router": "6.0.0",
    "core-js": "2.5.5",
    "file-system": "2.2.2",
    "fs": "0.0.2",
    "path": "0.12.7",
    "rxjs": "6.1.0",
    "util": "0.11.0",
    "zone.js": "0.8.26"
  },
  "version": "0.0.0",
  "license": "MIT",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.6.8",
    "@angular/cli": "^6.0.8",
    "@angular/compiler-cli": "^1.7.4",
    "@angular/language-service": "^5.0.0",
    "@types/jasmine": "~2.5.53",
    "@types/jasminewd2": "~2.0.2",
    "@types/node": "~6.0.60",
    "angular-router-loader": "^0.8.5",
    "codelyzer": "~3.0.1",
    "jasmine-core": "~2.6.2",
    "jasmine-spec-reporter": "~4.1.0",
    "karma": "~1.7.0",
    "karma-chrome-launcher": "~2.1.1",
    "karma-cli": "~1.0.1",
    "karma-coverage-istanbul-reporter": "^1.2.1",
    "karma-jasmine": "~1.1.0",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.1.2",
    "ts-node": "~3.0.4",
    "tslint": "~5.3.2",
    "typescript": "~2.4.2"
  }
}

Вот полученная ошибка (ошибка ТОЛЬКО на локальном. Нет проблем на StackBlitz):  введите описание изображения здесь


person Kevin192291    schedule 10.07.2018    source источник
comment
Ссылка на stackblitz не работает   -  person Nery Ortez    schedule 13.07.2018
comment
Какая версия Angular установлена ​​на вашем компьютере? Это обновлено?   -  person Nery Ortez    schedule 13.07.2018
comment
stackoverflow.com/questions/48947314/   -  person Radonirina Maminiaina    schedule 13.07.2018
comment
Не могли бы вы обновить свой вопрос с помощью Angular version + angular-cli version?   -  person Radonirina Maminiaina    schedule 13.07.2018
comment
Я обновил ссылку и убедился, что она работает, я также добавил версию angular pand pc, которую использую. Спасибо за помощь.   -  person Kevin192291    schedule 13.07.2018
comment
Эта демонстрация динамического маршрута / компонента чертовски крута   -  person Drenai    schedule 18.07.2018
comment
Спасибо чувак! Я считаю, что это имеет смысл сделать с точки зрения тестирования, поскольку данные легко переместить из стадии подготовки в продукт без изменения кода.   -  person Kevin192291    schedule 19.07.2018


Ответы (2)


Мне удалось заставить его работать локально, вот что я сделал:

ng new myFirstApp

затем я скопировал папку приложения в новый проект angular 6 и переименовал angular-cli.json в angular.json

Как и в router-loader.service.ts, я не мог заставить его работать API_ENDPOINTS Я скопировал контент

 of([
    {
      "path": "test",
      "component": "TestComponent",
      "data": {
        "icon": "check"
      }
    },
    {
      "path": "settings",
      "loadChildren": "src/app/settings/settings.module#SettingsModule"
    },
    {
      "path": "home",
      "component": "HomeComponent",
      "data": {
        "icon": "home"
      }
    },
    {
      "path": "self-service",
      "component": "RouteSelfServiceComponent",
      "data": {
        "icon": "build"
      }
    }
  ])
.toPromise()...

Я запихнул это на гитхаб

https://github.com/antoniocasino/dynamicly-load-modules

person Antonio    schedule 19.07.2018
comment
Это выглядит великолепно, я добавил параметр в конструктор компонента сообщения, и он сломался, я думаю, что с инжектором все еще что-то не так, но я уверен, что это можно выяснить довольно быстро. Спасибо за отличный ответ! - person Kevin192291; 19.07.2018

Вы не можете делать то, чего хотите, с помощью Angular CLI, потому что сборка Angular CLI не компилирует модули, на которые нет ссылок.

При создании проекта не существует JS-фрагмента, связанного с SettingsModule, за исключением тех случаев, когда мы определяем маршрут до среды выполнения.

Я нашел демонстрационный проект, который делает то, что вы пытаетесь сделать здесь, но он не использует сборку Angular CLI, а вместо этого использует tsc && concurrently \"tsc -w\" \"http-server . -c-1 \".

И я не знаю, какой конвейер сборки использует StackBlitz, но это определенно не Angular CLI.

Вы можете попробовать только компиляцию машинописного текста, но это не решит проблему для производственной сборки AOT, и вам придется использовать свою собственную сборку.

person Guerric P    schedule 13.07.2018