Angular 从 API $$_lazy_route_resource 加载路由 惰性递归错误
Angular Load routes from API $$_lazy_route_resource lazy recursive error
我收到错误:找不到模块
'src/app/settings/settings.module'.
at eval (eval at ./src/$$_lazy_route_resource lazy recursive
尝试从我的 api 添加延迟加载模块时。
让我难以调试的是,当我在 StackBlitz 上尝试这个时,它似乎工作得很好。
这是我项目的 link:Dynamic routes from API
但是,当我将项目移出 StackBlitz 并在我的电脑上重新创建它时,出现错误。
值得一提的是,当我发布来自下面 API 的路由时,您会看到它们在延迟加载模块的 'app' 之前包含 'src'( settings.module) 这样做只是因为 StackBlitz 有一个嵌套的 'src' 文件夹。此外,如果您尝试导出我的项目,则需要将目录 'src' 添加到 angular-cli.json 文件的 'main' 属性 中。我不确定这会如何影响模块。
我已经做了好几天了,如果有任何帮助,我们将不胜感激。
我正在使用这样的服务:
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 Node: 8.9.1 OS: win32 x64 Angular: ...
Package Version
------------------------------------------------------ @angular-devkit/architect 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
typescript 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 上没有问题):
您无法使用 Angular CLI 实现您想实现的目标,因为 Angular CLI 构建不会编译未引用的模块。
构建项目时,没有与 SettingsModule
关联的 JS 块,除非我们在 before 运行时定义路由。
我找到了一个演示项目,可以执行您尝试执行的操作here,但它不使用 Angular CLI 构建,而是使用 tsc && concurrently \"tsc -w\" \"http-server . -c-1 \"
。
而且我不知道 StackBlitz 使用哪个构建管道,但肯定不是 Angular CLI。
您可以只尝试 typescript 编译,但它不会解决 AOT 生产构建的问题,您将被迫使用自己的自定义构建
我设法让它在本地工作,
这是我所做的:
ng new myFirstApp
然后我复制了新的angular6项目中的app文件夹,并将angular-cli.json重命名为angular.json
和路由器一样-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()...
我推到了 github
我收到错误:找不到模块
'src/app/settings/settings.module'.
at eval (eval at ./src/$$_lazy_route_resource lazy recursive
尝试从我的 api 添加延迟加载模块时。 让我难以调试的是,当我在 StackBlitz 上尝试这个时,它似乎工作得很好。 这是我项目的 link:Dynamic routes from API 但是,当我将项目移出 StackBlitz 并在我的电脑上重新创建它时,出现错误。
值得一提的是,当我发布来自下面 API 的路由时,您会看到它们在延迟加载模块的 'app' 之前包含 'src'( settings.module) 这样做只是因为 StackBlitz 有一个嵌套的 'src' 文件夹。此外,如果您尝试导出我的项目,则需要将目录 'src' 添加到 angular-cli.json 文件的 'main' 属性 中。我不确定这会如何影响模块。 我已经做了好几天了,如果有任何帮助,我们将不胜感激。
我正在使用这样的服务:
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 Node: 8.9.1 OS: win32 x64 Angular: ...
Package Version ------------------------------------------------------ @angular-devkit/architect 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 typescript 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 上没有问题):
您无法使用 Angular CLI 实现您想实现的目标,因为 Angular CLI 构建不会编译未引用的模块。
构建项目时,没有与 SettingsModule
关联的 JS 块,除非我们在 before 运行时定义路由。
我找到了一个演示项目,可以执行您尝试执行的操作here,但它不使用 Angular CLI 构建,而是使用 tsc && concurrently \"tsc -w\" \"http-server . -c-1 \"
。
而且我不知道 StackBlitz 使用哪个构建管道,但肯定不是 Angular CLI。
您可以只尝试 typescript 编译,但它不会解决 AOT 生产构建的问题,您将被迫使用自己的自定义构建
我设法让它在本地工作, 这是我所做的:
ng new myFirstApp
然后我复制了新的angular6项目中的app文件夹,并将angular-cli.json重命名为angular.json
和路由器一样-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()...
我推到了 github