动态TypeScript导入而不使用Promises

时间:2017-12-01 04:22:10

标签: node.js typescript typescript2.0

我有这种情况。它们是动态的原因是为了防止加载10倍于我需要加载的代码量来执行某个命令行任务。

if (diagnostics) {
  require('./lib/cli-commands/run-diagnostics').run(sumanOpts);
}
else if (script) {
  require('./lib/cli-commands/run-scripts').run(sumanConfig, sumanOpts);
}
else if (tscMultiWatch) {
  require('./lib/cli-commands/run-tscmultiwatch').run(sumanOpts);
}
else if (repair) {
  require('./lib/cli-commands/run-repair').run(sumanOpts);
}
else if (postinstall) {
  require('./lib/cli-commands/postinstall').run(sumanOpts);
}
else{
  // etc etc
}

如果我尝试动态加载导入调用,我会得到:

enter image description here

显然会返回Promise而不是module.exports值。

有没有办法在没有异步加载的情况下使用动态导入语法?

2 个答案:

答案 0 :(得分:4)

只是要添加到Unional的正确答案中,使用Promise返回动态导入语法非常容易。

(async function () {
  if (diagnostics) {
    const run = await import('./lib/cli-commands/run-diagnostics');
    run(sumanOpts);
  }
  else if (script) {
    const run = await import('./lib/cli-commands/run-scripts');
    run(sumanConfig, sumanOpts);
  }
}());

请注意,如果您使用的是--module commonjs模块,那么最好坚持使用require。但是,上述内容非常适合--module amd--module system,当然还有--module esnext

答案 1 :(得分:3)

根据动态导入的性质,它是异步的。

require()是同步的,因为它位于服务器端。您可以使用(例如)fs.readFileSync()同步读取文件。

对于新的动态导入,它被设计为在客户端工作,因此将有一个ajax请求返回服务器以执行导入。

因此它必须是异步的。