【问题标题】:Dynamic TypeScript imports without using Promises不使用 Promises 的动态 TypeScript 导入
【发布时间】:2018-05-15 03:48:03
【问题描述】:

我有这种情况。它们之所以是动态的,是为了防止加载 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
}

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

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

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

【问题讨论】:

  • 基本上我在寻找“同步动态导入”而不是“异步动态导入”
  • 你有没有观察到仅仅包含所有这些实际上会影响性能?
  • @JLRishe 会有一个命中,无论多么小,它都会加载很多文件,并可能记录我不想记录的内容,等等。

标签: node.js typescript typescript2.0


【解决方案1】:

由于动态导入的性质,它是异步的。

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

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

因此它必须是异步的。

【讨论】:

  • 好像是这样,如果我没有得到更多信息,将不得不接受这个答案
  • 为什么不希望它是异步的?你不满意 Promise 语法还是....?
【解决方案2】:

只是为了补充 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。

【讨论】:

  • 是的,坦率地说,我不明白为什么支持动态 同步 导入是不可能的,但我想这是 TS 必须遵守的 ES 限制
  • 是的,但这是一个很好的限制,我认为不需要动态同步导入。我宁愿看到一个顶级的await 构造。但同样,运行时可以添加额外的功能,比如 Node 添加 require,所以没有问题。
  • @kumaresan_sd 如果您阅读此处提出的问题,您会发现它与您在帖子中提出的问题不同。我读了你的帖子,你有一个不同且不相关的问题。我很乐意为您提供帮助,但是对一个很大程度上不相关的问题的答案投反对票是没有帮助的,该问题被认为是为了获得您自己的帮助,特别是因为您没有仔细阅读这里的问题。您的问题是您从错误的路径加载并获得 404。这是一个不同的问题。
猜你喜欢
  • 2018-11-19
  • 1970-01-01
  • 2019-12-18
  • 2019-02-08
  • 1970-01-01
  • 2019-05-20
  • 2013-08-09
  • 2019-01-22
  • 2017-12-22
相关资源
最近更新 更多