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不会传输字符串。这是可能的。请参阅下面的我的答案。它很难看,但可以工作。