我想问一下是否可以使用自定义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保存在代码中,可以直接在支持它的环境中使用。
答案 0 :(得分:0)
有一个丑陋的解决方案。使用“评估”。 Typescript 无法在字符串中编译您的代码。