不使用 Promises 的动态 TypeScript 导入
Dynamic TypeScript imports without using Promises
我有这种情况。它们是动态的原因是为了防止加载 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
}
如果我尝试动态加载导入调用,我会得到:
显然 return 是 Promise
而不是 module.exports
值。
有没有办法在不异步加载的情况下使用动态导入语法?
根据动态导入的性质,它是异步的。
require()
是同步的,因为它存在于服务器端。您可以使用(例如)fs.readFileSync()
.
同步读取文件
对于新的动态导入,它设计为在客户端工作,因此会有一个 ajax 请求返回服务器以执行导入。
因此它必须是异步的。
补充一下 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
模块,那么最好坚持要求。但是,以上内容非常适合 --module amd
、--module system
,当然还有 --module esnext
.
我有这种情况。它们是动态的原因是为了防止加载 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
}
如果我尝试动态加载导入调用,我会得到:
显然 return 是 Promise
而不是 module.exports
值。
有没有办法在不异步加载的情况下使用动态导入语法?
根据动态导入的性质,它是异步的。
require()
是同步的,因为它存在于服务器端。您可以使用(例如)fs.readFileSync()
.
对于新的动态导入,它设计为在客户端工作,因此会有一个 ajax 请求返回服务器以执行导入。
因此它必须是异步的。
补充一下 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
模块,那么最好坚持要求。但是,以上内容非常适合 --module amd
、--module system
,当然还有 --module esnext
.