使用Angular CLI

时间:2017-07-06 08:26:41

标签: angular angular-cli

基本上我想创建一个动态插件系统。我需要能够部署新的插件,而无需重新部署主插件系统。

基本上如果我要使用SystemJS,我可以做一些像

这样的事情
System.import(url).then(plugin => {
  this.createComponent(plugin.default);
});

url是动态的东西 - 可以从db或config等读取它。

以上可能会有效 - 除了我使用Angular CLI,它使用Webpack。使用CLI是对整个项目的选择 - 所以我坚持使用Webpack和CLI。

由于Angular CLI做了很多抽象,我无法修改webpack配置(我可以,但是我必须手动维护它,这又会破坏简单性)。

Webpack不是模块加载,而是捆绑器 - 意味着它应该事先知道这些模块,我不能只是在某处删除一个新模块并更新它的配置以动态加载它。

我的选择是什么?

编辑:Webpack有自己的System.import,但它有一些检查,看看网址是静态的还是动态的。我可以忍受传递一个静态文件夹并且不得不将插件放入该文件夹 - 这似乎无法在任何地方工作,但在应用程序本身内部。

1 个答案:

答案 0 :(得分:1)

不幸的是,据我所知,在一天结束时,您需要将动态组件添加到当前模块的entryComponents,否则Angular不会让您动态加载它会抱怨。

无论哪种方式,您都必须静态加载组件并将其放在entryComponents内,因此使用SystemJS或其他东西没什么意义,您可以创建一个字典并在以后使用它你想要的是:

从某处';

导入{MyComponentClass}
const dictionary = {
    component1  = MyComponentClass
}

 this.createComponent(dictionary[urlOrName]);

另一种可能的解决方案是为您要动态加载的每个组件创建一个模块,然后将该组件添加到该模块的entryComponents,这样,您就可以动态导入/下载该模块,但我不确定您是否可以动态地将该动态模块添加到根模块(路由器在lazyLoading时这样做!~~)。

Angular过去在引入AOT之前对动态组件要简单得多,他们老老实实地通过引入AOT

来扼杀简单性