NodeJS 不使用Promises的动态TypeScript导入

vhipe2zx  于 2023-05-28  发布在  Node.js
关注(0)|答案(3)|浏览(241)

我有这种情况。它们是动态的原因是为了防止加载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的值。

  • 是否有一种方法可以使用动态导入语法,而不需要异步加载?*
w3nuxt5m

w3nuxt5m1#

为了补充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来说是完美的。

9w11ddsr

9w11ddsr2#

根据动态导入的性质,它是异步的。
require()是同步的,因为它位于服务器端。您可以使用(例如)fs.readFileSync()同步读取文件。
对于新的动态导入,它被设计为在客户端工作,因此将有一个 AJAX 请求返回到服务器以执行导入。
因此,它必须是异步的。

6gpjuf90

6gpjuf903#

1.仅异步的动态import()an ECMAScript feature,TypeScript发展的趋势是尽可能坚持ECMAScript。

  1. TypeScript可以配置为以不同的方式输出JS,并适应不同的模块系统。确实,其中一个选项是将TS项目全部转换为使用AMD的单个JS文件,在这种情况下,TypeScript将所有导入转换为同步require() s,这意味着您可以拥有一个同步import()函数。然而,这只是所有可能的转译目标中的一个。你可以看到,如果TypeScript不想引入一种新的import()方式,这是可以理解的--与ECMAScript不兼容!- 作为仅一种可能的蒸腾模式的特殊情况。

相关问题