Я использую Angular2 и SystemJS для создания веб-приложения. У меня есть некоторые модули в моем приложении, и в конфигурации маршрутизатора я использую ленивую загрузку, чтобы открыть их.Angular2 lazy loading modules: как создать пакет сборки с помощью SystemJS Builder?
Вот файл маршрутизации моего приложения, ленивые нагрузки двух модулей:
const appRoutes: Routes = [
{ path: '', component: MainComponent,
canActivate: [AuthGuard],
children: [
{ path: 'dashboard', component: DashboardComponent },
{ path: 'first-section', loadChildren: 'app/modules/FIRST-SECTION/first-section.module' },
{ path: 'second-section', loadChildren: 'app/modules/SECOND-SECTION/second-section.module' },
{ path: 'documents', component: DocumentsComponent },
{ path: 'users', component: UsersComponent },
{ path: '', redirectTo: 'dashboard', pathMatch: 'full' }
]
}
];
Я использую Gulp для создания задач для сервера разработки и производства сборки. Для сборки я использую SystemJS Builder, который создает мини-JS-файл для всего приложения.
gulp.task('app-bundle', function() {
var builder = new Builder('src', 'src/systemjs.config.js');
return builder.buildStatic('app/main.js', 'build/scripts/app.min.js', { minify: true });
});
... Но если я пытаюсь запустить сервер на пакете сборки приложение не работает, когда он пытался бежать ленивые загруженные модули. Это дает мне следующую ошибку:
GET http://127.0.0.1:8080/app/modules/FIRST-SECTION/first-section.module 404 (Not Found)
Вот мой systemjs.config.js
файл:
(function (global) {
System.config({
paths: {
'npm:': './node_modules/',
},
map: {
app: 'app',
'@angular/core': 'npm:@angular/core/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
'@angular/upgrade': 'npm:@angular/upgrade/bundles/upgrade.umd.js',
'rxjs': 'npm:rxjs',
'lodash': 'npm:lodash/lodash.min.js',
'jquery': 'npm:jquery/dist/jquery.min.js',
},
packages: {
app: { main: './main.js', defaultExtension: 'js' },
rxjs: { defaultExtension: 'js' },
}
});
})(this);
EDIT:
Как описано на сайте SystemJs Builder статических расслоений нам не нужны SystemJs для загрузки модулей. На самом деле я создаю статический пакет (с buildStatic
, а не bundle
), но поскольку я исключаю SystemJs, кажется, что нет других способов ленивых модулей загрузки. Итак, как создать сборку с использованием bundle
, а затем использовать ленивые модули загрузки, но без SystemJS (без systemjs.config.js
файла в папке dist
)? Я вижу, что WebPack может это сделать ...
Это не работает, так как buildStatic из SystemJS Builder генерирует один файл js, начинающийся с main.js (как вы можете видеть в моем коде). В этом случае, как мне сопоставить ленивые модули загрузки? – smartmouse
Посмотрите, что вы имеете в виду. Можете ли вы попробовать расслоение арифметики, как описано в этом сообщении здесь, на SO..http: //stackoverflow.com/questions/38944257/create-multiple-bundles-with-systemjs-builder-for-an-angular2-application. Дайте мне знать, если это поможет –
Мне не нужно отказываться от каких-либо зависимостей. Мне просто нужно использовать ленивую загрузку на dist bundle. – smartmouse