2

到目前为止,我正在使用 Ivy 最新的 rc 候选人。

用例:我想提供几个模块,这些模块可以通过运行时的 import 语句单独编译,而不使用路由器模块中的 loadchildren。

上下文:我通过“ng generate library nodes”创建了一个名为 nodes 的库。“ng build nodes”在 dist 下生成所需的包等。到目前为止没有什么特别的。

在我的应用程序中,我想按如下方式实例化 NodesComponent:

const modulePath = '/Users/modules/nodes/nodes.umd.js'; 返回等待导入(模块路径)。然后(...)

这不起作用,因为 Ivy 编译器不知何故无法识别要按需加载的模块。

打电话时

import('/Users/modules/nodes/nodes.umd.js').then(...) 它按预期工作。

问题:

是否可以在不指定 modulePath @compile time 的情况下使用 import 从某个位置加载任意模块文件?

Ivy 应该可以从任何位置延迟加载模块,而无需在编译时指定它们。

4

1 回答 1

0

我需要通过 ClassName 字符串将类注册到字典中,以便动态加载组件和模块。在 ivy 上搜索了几天后,我发现使用 ${} 从 json 对象中取出名称并通过循环遍历类名定义数组来替换 const 导入字符串中的文本会加载组件惰性和动态。小部件数组可以从后端发送,因此它变得非常动态。驻留在小部件和模块目录中的组件将被编译为单独的 javascript 块文件。将函数放入服务中,并在需要加载特定组件或模块时通过在数组中发送该模块/组件名称来调用它们

initwidgetscomponents(){
      const widgets = [{type:'bar'},{type:'xxx'}];
      widgets.map(widget => {
           import(`../widgets/${widget.type}/${widget.type}.component`).then(x => {
            this.register(widget.type,x.default);
             });
        });
  }

initmodules(){
    const modules = [{name:'svg'},{name:'relationmanagement'}];
    modules.map(module => {
         import(`../modules/${module.name}/${module.name}.module`).then(x => {
             console.log(x);
           });
      });
}

然后在 tsconfig 的 include 部分中添加目录,如

"./src/lib/widgets/**/*.component.ts",
"./src/lib/modules/**/*.module.ts",
"./src/lib/modules/**/*.action.ts",
"./src/lib/modules/**/*.model.ts",
"./src/lib/modules/**/*.component.ts",
"./src/lib/modules/**/*.state.ts"
于 2020-04-09T18:58:52.613 回答