基本上我想创建一个动态插件系统。我需要能够部署新的插件,而无需重新部署主插件系统。
基本上如果我要使用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,但它有一些检查,看看网址是静态的还是动态的。我可以忍受传递一个静态文件夹并且不得不将插件放入该文件夹 - 这似乎无法在任何地方工作,但在应用程序本身内部。答案 0 :(得分:1)
不幸的是,据我所知,在一天结束时,您需要将动态组件添加到当前模块的entryComponents
,否则Angular不会让您动态加载它会抱怨。
无论哪种方式,您都必须静态加载组件并将其放在entryComponents
内,因此使用SystemJS或其他东西没什么意义,您可以创建一个字典并在以后使用它你想要的是:
从某处';
导入{MyComponentClass}const dictionary = {
component1 = MyComponentClass
}
this.createComponent(dictionary[urlOrName]);
另一种可能的解决方案是为您要动态加载的每个组件创建一个模块,然后将该组件添加到该模块的entryComponents
,这样,您就可以动态导入/下载该模块,但我不确定您是否可以动态地将该动态模块添加到根模块(路由器在lazyLoading时这样做!~~)。
Angular过去在引入AOT
之前对动态组件要简单得多,他们老老实实地通过引入AOT