Angular 2 中的多个模块
Multiple modules in Angular 2
我有一个 Angular 2 应用程序 (RC7),它最初是作为单个组件开始的,但很快以各种不同(有时完全不相关)的方式在整个项目中得到使用。
因此,单个 NgModule bootstrapping 所有组件似乎是一个糟糕的主意,并且会导致大量膨胀。
我正在努力寻找一种方法来拥有多个模块(模块 A 将包含组件 A,模块 B 将包含组件 B,等等)并且仍然允许在单个页面上 bootstrapping 多个 A2 应用程序。
在实践中,我想要实现的是:
第 1 页 bootstraps 模块 A - 有效。
第 2 页 bootstraps 模块 B - 有效。
第 3 页 bootstraps 模块 A 和模块 B - 这不起作用。
index.html
<script src="/angular2/node_modules/zone.js/dist/zone.js"></script>
<script src="/angular2/node_modules/reflect-metadata/Reflect.js"></script>
<script src="/angular2/node_modules/systemjs/dist/system.src.js"></script>
<script src="/angular2/systemjs.config.js"></script>
<script type="text/javascript">
System.import('appOne').catch(function(err){ console.error(err); });
System.import('appTwo').catch(function(err){ console.error(err); });
</script>
systemjs.config.js
(function (global) {
System.config({
paths: {
'npm:': '/angular2/node_modules/'
},
map: {
appOne: '/angular2/',
appTwo: '/angular2/',
},
packages: {
appOne: {
main: './appOne.main.js',
defaultExtension: 'js'
},
appTwo: {
main: './appTwo.main.js',
defaultExtension: 'js'
},
}
});
})(this);
AppOne 和 AppTwo 的模块只是 bootstrap 相关组件(componentOne 和 componentTwo)。但是,两者不会同时呈现在同一页面上。我在控制台中没有错误,但是 systemjs.config.js 文件中最后列出的软件包是唯一要加载的软件包。
谁能看出为什么它可能不起作用?
或者可能推荐另一种方式来构建我的模块。
我宁愿没有一个包含所有组件、服务等的父模块 - 这似乎违背了 Angular 2 的嵌套组件树的要点,并且最终会成倍地影响页面加载时间。
提前致谢。
我不知道你是否能得到你想要的确切解决方案,但你可以尝试延迟加载你的一些模块。
例如,您创建一个 AppModule(用于引导)。在 AppModule 中,您只需导入 "home" 模块(我将其称为 HomeModule)。
所有其他模块都可以延迟加载(reference)
对于任何感兴趣的人,问题是引导。这两个应用程序必须一致引导才能工作。
index.html
<script src="/angular2/node_modules/zone.js/dist/zone.js"></script>
<script src="/angular2/node_modules/reflect-metadata/Reflect.js"></script>
<script src="/angular2/node_modules/systemjs/dist/system.src.js"></script>
<script src="/angular2/systemjs.config.js"></script>
<script type="text/javascript">
System.import('appOneAndTwo').catch(function(err){ console.error(err); });
</script>
systemjs.config.js
(function (global) {
System.config({
paths: {
'npm:': '/angular2/node_modules/'
},
map: {
appOne: '/angular2/',
appTwo: '/angular2/',
appOneAndTwo: '/angular2/',
},
packages: {
appOne: {
main: './appOne.main.js',
defaultExtension: 'js'
},
appTwo: {
main: './appTwo.main.js',
defaultExtension: 'js'
},
appOneAndTwo: {
main: './appOneAndTwo.main.js',
defaultExtension: 'js'
},
}
});
})(this);
appOneAndTwo.main.ts
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppOneModule} from './app/app.one.module';
import {AppTwoModule} from './app/app.two.module';
platformBrowserDynamic().bootstrapModule(CommentAppModule);
platformBrowserDynamic().bootstrapModule(WorkflowAppModule);
它仍然不理想,因为我必须为我创建的 Angular 2 个应用程序的每个组合创建一个新的 main.ts 文件,但这确实意味着导入仅在必要时严格导入,有效负载不会膨胀到最终用户。
我目前正在查看 AoT 编译器 (https://angular.io/docs/ts/latest/cookbook/aot-compiler.html) 和 uglification/minification 使用 Webpack 进一步减少负载大小。
您可以从 AppModule 中引导一组组件,如下所示:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import {AppComponent} from "./app.component";
import {MainSidebarComponent} from "./menus/main-sidebar.component";
import {FormsModule} from "@angular/forms";
import {appRouting} from "./app.routes";
import {DashBoardComponent} from "./dashboard/dashboard.component";
import {HomeComponent} from "./home/home.component";
import {LoginComponent} from "./login/login.component";
import {UsersModule} from "./users/users.module";
import {TopBarComponent} from "./menus/top-bar.component";
@NgModule({
imports: [
BrowserModule,
FormsModule,
appRouting,
UsersModule
],
declarations: [
AppComponent,
MainSidebarComponent,
TopBarComponent,
DashBoardComponent,
HomeComponent,
LoginComponent
],
bootstrap: [ AppComponent, MainSidebarComponent, TopBarComponent ]
})
export class AppModule { }
然后在你的index.html
<!doctype html>
<head>
<base href="/">
<meta charset="UTF-8">
<!-- 1. Load libraries -->
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function (err) {
console.error(err);
});
</script>
</head>
<body class=" sidebar_main_open sidebar_main_swipe">
<header id="header_main">
<top-bar></top-bar>
</header><
<aside id="sidebar_main">
<main-sidebar></main-sidebar>
</aside>
<div id="page_content">
<div id="page_content_inner">
<my-app>Loading....</my-app>
</div>
</div>
</body>
</html>
我有一个 Angular 2 应用程序 (RC7),它最初是作为单个组件开始的,但很快以各种不同(有时完全不相关)的方式在整个项目中得到使用。
因此,单个 NgModule bootstrapping 所有组件似乎是一个糟糕的主意,并且会导致大量膨胀。 我正在努力寻找一种方法来拥有多个模块(模块 A 将包含组件 A,模块 B 将包含组件 B,等等)并且仍然允许在单个页面上 bootstrapping 多个 A2 应用程序。
在实践中,我想要实现的是:
第 1 页 bootstraps 模块 A - 有效。
第 2 页 bootstraps 模块 B - 有效。
第 3 页 bootstraps 模块 A 和模块 B - 这不起作用。
index.html
<script src="/angular2/node_modules/zone.js/dist/zone.js"></script>
<script src="/angular2/node_modules/reflect-metadata/Reflect.js"></script>
<script src="/angular2/node_modules/systemjs/dist/system.src.js"></script>
<script src="/angular2/systemjs.config.js"></script>
<script type="text/javascript">
System.import('appOne').catch(function(err){ console.error(err); });
System.import('appTwo').catch(function(err){ console.error(err); });
</script>
systemjs.config.js
(function (global) {
System.config({
paths: {
'npm:': '/angular2/node_modules/'
},
map: {
appOne: '/angular2/',
appTwo: '/angular2/',
},
packages: {
appOne: {
main: './appOne.main.js',
defaultExtension: 'js'
},
appTwo: {
main: './appTwo.main.js',
defaultExtension: 'js'
},
}
});
})(this);
AppOne 和 AppTwo 的模块只是 bootstrap 相关组件(componentOne 和 componentTwo)。但是,两者不会同时呈现在同一页面上。我在控制台中没有错误,但是 systemjs.config.js 文件中最后列出的软件包是唯一要加载的软件包。
谁能看出为什么它可能不起作用? 或者可能推荐另一种方式来构建我的模块。 我宁愿没有一个包含所有组件、服务等的父模块 - 这似乎违背了 Angular 2 的嵌套组件树的要点,并且最终会成倍地影响页面加载时间。
提前致谢。
我不知道你是否能得到你想要的确切解决方案,但你可以尝试延迟加载你的一些模块。
例如,您创建一个 AppModule(用于引导)。在 AppModule 中,您只需导入 "home" 模块(我将其称为 HomeModule)。
所有其他模块都可以延迟加载(reference)
对于任何感兴趣的人,问题是引导。这两个应用程序必须一致引导才能工作。
index.html
<script src="/angular2/node_modules/zone.js/dist/zone.js"></script>
<script src="/angular2/node_modules/reflect-metadata/Reflect.js"></script>
<script src="/angular2/node_modules/systemjs/dist/system.src.js"></script>
<script src="/angular2/systemjs.config.js"></script>
<script type="text/javascript">
System.import('appOneAndTwo').catch(function(err){ console.error(err); });
</script>
systemjs.config.js
(function (global) {
System.config({
paths: {
'npm:': '/angular2/node_modules/'
},
map: {
appOne: '/angular2/',
appTwo: '/angular2/',
appOneAndTwo: '/angular2/',
},
packages: {
appOne: {
main: './appOne.main.js',
defaultExtension: 'js'
},
appTwo: {
main: './appTwo.main.js',
defaultExtension: 'js'
},
appOneAndTwo: {
main: './appOneAndTwo.main.js',
defaultExtension: 'js'
},
}
});
})(this);
appOneAndTwo.main.ts
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppOneModule} from './app/app.one.module';
import {AppTwoModule} from './app/app.two.module';
platformBrowserDynamic().bootstrapModule(CommentAppModule);
platformBrowserDynamic().bootstrapModule(WorkflowAppModule);
它仍然不理想,因为我必须为我创建的 Angular 2 个应用程序的每个组合创建一个新的 main.ts 文件,但这确实意味着导入仅在必要时严格导入,有效负载不会膨胀到最终用户。
我目前正在查看 AoT 编译器 (https://angular.io/docs/ts/latest/cookbook/aot-compiler.html) 和 uglification/minification 使用 Webpack 进一步减少负载大小。
您可以从 AppModule 中引导一组组件,如下所示:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import {AppComponent} from "./app.component";
import {MainSidebarComponent} from "./menus/main-sidebar.component";
import {FormsModule} from "@angular/forms";
import {appRouting} from "./app.routes";
import {DashBoardComponent} from "./dashboard/dashboard.component";
import {HomeComponent} from "./home/home.component";
import {LoginComponent} from "./login/login.component";
import {UsersModule} from "./users/users.module";
import {TopBarComponent} from "./menus/top-bar.component";
@NgModule({
imports: [
BrowserModule,
FormsModule,
appRouting,
UsersModule
],
declarations: [
AppComponent,
MainSidebarComponent,
TopBarComponent,
DashBoardComponent,
HomeComponent,
LoginComponent
],
bootstrap: [ AppComponent, MainSidebarComponent, TopBarComponent ]
})
export class AppModule { }
然后在你的index.html
<!doctype html>
<head>
<base href="/">
<meta charset="UTF-8">
<!-- 1. Load libraries -->
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function (err) {
console.error(err);
});
</script>
</head>
<body class=" sidebar_main_open sidebar_main_swipe">
<header id="header_main">
<top-bar></top-bar>
</header><
<aside id="sidebar_main">
<main-sidebar></main-sidebar>
</aside>
<div id="page_content">
<div id="page_content_inner">
<my-app>Loading....</my-app>
</div>
</div>
</body>
</html>