Javascript 如何防止typescript将动态导入传输到require()?

Javascript 如何防止typescript将动态导入传输到require()?,javascript,node.js,typescript,tsc,dynamic-import,Javascript,Node.js,Typescript,Tsc,Dynamic Import,我正在构建一个discord.jsdiscord机器人。现在由于某种原因,discord.js不适用于ESM模块(这是一个完全独立的问题),因此我的机器人应用程序使用CommonJS模块。现在我在我的系统上有另一个名为Lib的项目,它有很多实用功能,我计划在几个不同的项目中使用,所以我不必重写它们。此Lib项目使用ESM模块。因为我必须从DiscordBot导入Lib,所以我在typescript中使用了动态导入语法。现在,每当我传输我的DiscordBot项目时,动态导入就会转换成一些丑陋的j

我正在构建一个
discord.js
discord机器人。现在由于某种原因,
discord.js
不适用于
ESM
模块(这是一个完全独立的问题),因此我的机器人应用程序使用
CommonJS
模块。现在我在我的系统上有另一个名为
Lib
的项目,它有很多实用功能,我计划在几个不同的项目中使用,所以我不必重写它们。此
Lib
项目使用
ESM
模块。因为我必须从
DiscordBot
导入
Lib
,所以我在typescript中使用了动态导入语法。现在,每当我传输我的
DiscordBot
项目时,动态导入就会转换成一些丑陋的javascript模块代码,而丑陋的模块代码最终会使用require()。由于require()无法导入ESM模块,因此我的bot最终崩溃


然而,我试图停止我的ts编译器,从导入
Lib
的ts文件中复制代码,然后手动将代码粘贴到相应的JS文件中(并删除ts专有功能,如类型注释和接口)。然后我运行了我的机器人应用程序,它运行得非常好。但我不想每次都这么做。所以问题出在tsc的编译上。我如何解决这个问题?

好的,想出一个答案。然而,它是如此丑陋,它让我发抖

async function body (pMap:any){
   // do something with module pMap here
}

eval ("import('p-map').then(body)");
Typescript无法传输字符串

我的赏金对一个不那么难看的答案仍然有效

=============================================

使用“tsconfig.json”进行更多的实验,并在此处记录我的发现:

如果“模块”设置为“es2020”,则不传输动态导入“导入()

如果将“模块”设置为“es2015”,则出现错误TS1323:
仅当“--module”标志设置为“es2020”、“esnext”、“commonjs”、“amd”、“system”或“umd”时,才支持动态导入。

如果“模块”设置为“commonjs”,则传输动态导入

引用“模块”字段的“tsconfig.json”参考:

如果您想知道ES2015和ES2020之间的区别, ES2020增加了对动态导入和import.meta的支持


目前这是不可能的。GitHub()中有一个非常新的问题,但尚未实现。因此,您现在所能做的就是使用
Lib
项目从ESM切换到CommonJS。

您使用的是什么编译器/绑定器?我假设tsc基于上下文

我建议使用esbuild来编译和捆绑您的TS。您也可以在使用tsc后简单地使用它来转换TS。它有一个名为“格式”的选项,可以删除任何模块样式导入。看

下面是一个简单的使用示例

build.js

const esbuild=require(“esbuild”);
esbuild.build({
allowOverwrite:是的,
写:是的,
入口点:[“我的主文件.ts”],
outfile:“some file.bundle.js”,
格式:“cjs”//format选项设置为cjs使所有导入成为通用的js样式
是的,
}).然后(()=>{
console.log(“完成!”);
});
然后,您可以向package.json中添加类似的内容

“脚本”:{
“build”:“node build.js”,
…其余脚本

这里有一个额外的链接,介绍了使用带有typescript的esbuild时的一些注意事项。这些都不应该是你的问题。

你已经研究过了吗?当然,是的。这就是我如何将
Lib
设置为ESM模块,将
DiscordBot
设置为公共JS模块的方法。你能在这里共享你的
tsconfig.json
吗?我向OP询问了一个
tsconfig.json
,但我现在意识到这个问题有多老了,它只出现在我面前,因为你给了我一笔赏金。你能不能共享一个
tsconfig.json
?最好是一个最小的测试用例。可能是粘贴的,甚至可能是一个新的问题。我的答案与tsconfig.json无关。如果在tsconfig中设置.json可以阻止typescript将动态导入传输到require(),这将是一个漂亮的答案。我的答案很难看-它将动态导入语法隐藏在字符串中,并使用“eval”来执行它。typescript不会传输字符串。这是可能的。请参阅下面的我的答案。它很难看,但可以工作。