Angular2 RC7 和 angular-cli webpack 中的延迟加载
Lazy loading in Angular2 RC7 and angular-cli webpack
我已经使用 ng new
创建了一个新应用程序,但是当我尝试配置一个模块以使用延迟加载进行加载时,我总是收到找不到该模块的错误消息。
EXCEPTION: Uncaught (in promise): Error: Cannot find module 'app/home/home.module'
package.json
"dependencies": {
"@angular/common": "2.0.0-rc.7",
"@angular/compiler": "2.0.0-rc.7",
"@angular/core": "2.0.0-rc.7",
"@angular/forms": "2.0.0-rc.7",
"@angular/http": "2.0.0-rc.7",
"@angular/platform-browser": "2.0.0-rc.7",
"@angular/platform-browser-dynamic": "2.0.0-rc.7",
"@angular/router": "3.0.0-rc.3",
"core-js": "^2.4.1",
"rxjs": "5.0.0-beta.12",
"ts-helpers": "^1.1.1",
"zone.js": "^0.6.21"
},
"devDependencies": {
"@types/jasmine": "^2.2.30",
"angular-cli": "1.0.0-beta.11-webpack.9-4",
"codelyzer": "~0.0.26",
"jasmine-core": "2.4.1",
"jasmine-spec-reporter": "2.5.0",
"karma": "1.2.0",
"karma-chrome-launcher": "^2.0.0",
"karma-cli": "^1.0.1",
"karma-jasmine": "^1.0.2",
"karma-remap-istanbul": "^0.2.1",
"protractor": "4.0.5",
"ts-node": "1.2.1",
"tslint": "3.13.0",
"typescript": "2.0.2"
}
- angular2 RC7
- angular-cli:1.0.0-beta.11-webpack.9-4
- 节点:6.5.0
- os: win32 x64
app.routing.ts:
import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const appRoutes: Routes = [{
path: '',
redirectTo: 'home',
pathMatch: 'full'
},
{
path: `home`,
loadChildren: `app/home/home.module`
}];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AppComponent } from './app.component';
import { routing } from './app.routing';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
routing
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css']
})
export class AppComponent {
title = 'app works!';
}
app.component.html
<router-outlet></router-outlet>
我确定我遗漏了一些愚蠢的东西,但我尝试了各种选择,但到目前为止没有任何效果。根据我的配置,我是否遗漏了什么?
提前致谢,
斯蒂芬
RC7 中不再存在该问题。
{path:"lazy", loadChildren: 'app/path/to/module#Class'}
会起作用。
您使用的机制仍然是基于 systemjs 的。我无法使用 "path#class" 语法让它与 webpack 一起工作。所以我们直接 require
模块:
首先我们需要 es6-promise-loader:
npm i --save-dev es6-promise-loader
然后像这样定义你的路线:
{path:"lazy", loadChildren: () => require('es6-promise!./path/to/module')('ClassName')}
es6-promise-loader 将上面的替换为:
loadChildren: () => new Promise(function (resolve) {
require.ensure([], function (require) {
resolve(require('./path/to/module')['ClassName']));
});
});
这是使用 webpack 加载模块的正确方法,但放入每个路由都很麻烦。
使用RC7,您可以进行如下操作:
const appRoutes: Routes = [
{
path: 'home',
loadChildren: 'app/home/home.module#HomeModule',
}
];
别忘了“#”
然后杀死 ng serve 并重新启动它
它将与 angular-cli@webpack
一起工作
P.S:angular 约定是在延迟加载的文件夹前加上 (+),例如+家/
我已经使用 ng new
创建了一个新应用程序,但是当我尝试配置一个模块以使用延迟加载进行加载时,我总是收到找不到该模块的错误消息。
EXCEPTION: Uncaught (in promise): Error: Cannot find module 'app/home/home.module'
package.json
"dependencies": {
"@angular/common": "2.0.0-rc.7",
"@angular/compiler": "2.0.0-rc.7",
"@angular/core": "2.0.0-rc.7",
"@angular/forms": "2.0.0-rc.7",
"@angular/http": "2.0.0-rc.7",
"@angular/platform-browser": "2.0.0-rc.7",
"@angular/platform-browser-dynamic": "2.0.0-rc.7",
"@angular/router": "3.0.0-rc.3",
"core-js": "^2.4.1",
"rxjs": "5.0.0-beta.12",
"ts-helpers": "^1.1.1",
"zone.js": "^0.6.21"
},
"devDependencies": {
"@types/jasmine": "^2.2.30",
"angular-cli": "1.0.0-beta.11-webpack.9-4",
"codelyzer": "~0.0.26",
"jasmine-core": "2.4.1",
"jasmine-spec-reporter": "2.5.0",
"karma": "1.2.0",
"karma-chrome-launcher": "^2.0.0",
"karma-cli": "^1.0.1",
"karma-jasmine": "^1.0.2",
"karma-remap-istanbul": "^0.2.1",
"protractor": "4.0.5",
"ts-node": "1.2.1",
"tslint": "3.13.0",
"typescript": "2.0.2"
}
- angular2 RC7
- angular-cli:1.0.0-beta.11-webpack.9-4
- 节点:6.5.0
- os: win32 x64
app.routing.ts:
import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const appRoutes: Routes = [{
path: '',
redirectTo: 'home',
pathMatch: 'full'
},
{
path: `home`,
loadChildren: `app/home/home.module`
}];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AppComponent } from './app.component';
import { routing } from './app.routing';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
routing
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css']
})
export class AppComponent {
title = 'app works!';
}
app.component.html
<router-outlet></router-outlet>
我确定我遗漏了一些愚蠢的东西,但我尝试了各种选择,但到目前为止没有任何效果。根据我的配置,我是否遗漏了什么?
提前致谢, 斯蒂芬
RC7 中不再存在该问题。
{path:"lazy", loadChildren: 'app/path/to/module#Class'}
会起作用。
您使用的机制仍然是基于 systemjs 的。我无法使用 "path#class" 语法让它与 webpack 一起工作。所以我们直接 require
模块:
首先我们需要 es6-promise-loader:
npm i --save-dev es6-promise-loader
然后像这样定义你的路线:
{path:"lazy", loadChildren: () => require('es6-promise!./path/to/module')('ClassName')}
es6-promise-loader 将上面的替换为:
loadChildren: () => new Promise(function (resolve) {
require.ensure([], function (require) {
resolve(require('./path/to/module')['ClassName']));
});
});
这是使用 webpack 加载模块的正确方法,但放入每个路由都很麻烦。
使用RC7,您可以进行如下操作:
const appRoutes: Routes = [
{
path: 'home',
loadChildren: 'app/home/home.module#HomeModule',
}
];
别忘了“#”
然后杀死 ng serve 并重新启动它
它将与 angular-cli@webpack
一起工作P.S:angular 约定是在延迟加载的文件夹前加上 (+),例如+家/