TypeScript动态导入

时间:2018-06-09 08:35:20

标签: typescript dynamic import

我想问一下是否可以使用自定义Promise来加载模块,而不是立即解决打字稿使用的承诺。

如果我有

function test() {
   const m: any = import("./test");
   console.log(m);
}

tsc立即(几乎;))解析调用require的Promise,如:

function test() {
   m = Promise.resolve().then(() => require("..."));
   console.log(m);
}

当从HTML脚本标记加载模块(或更好的模块包)时实际上运行良好,但我想使用自定义延迟加载器返回Promise并在自定义加载器加载模块(包)时解析它稍后在应用程序生命周期中(基本上当需要它时 - 不是在加载html时)然后使用require从加载的模块包中提供特定的模块。

这可以通过TS实现,还是需要使用不同的方法(即自定义导入功能)?我更喜欢TS方式。

目标:" esnext",模块:" commonjs"

  

编辑(答案):

首先,我的想法很糟糕。在

function timer(): Promise<void> {
   return new Promise<void>((resolve: () => void) => {
      setTimeout(resolve, 3000);
   });
}

let p = Promise.resolve().then(async() => { await timer(); } )
当.then回调完成时,

得到解决。不是在它之前。因此它不会立即解决承诺,并且在前面提到的情况下,一旦require函数返回它就会得到解决。我不知道,所以我有点困惑。

除此之外,当TSC模块设置为&#34; commonjs&#34;时,如果没有一些捆绑器或后编译器(例如babel或webpack),则无法使用动态导入。当使用babel或webpack时,动态导入可以替换为另一个加载器/解析器而不是require,以便异步加载脚本,从中执行和解析模块。我没有在节点中进行测试,它可以在不需要额外构建工具的情况下开箱即用。

使用TSC模块&#34; esnext&#34; import关键字由TSC保存在代码中,可以直接在支持它的环境中使用。

1 个答案:

答案 0 :(得分:0)

有一个丑陋的解决方案。使用“评估”。 Typescript 无法在字符串中编译您的代码。