I'm building a discord.js Discord bot. Now for some reason, discord.js doesn't work with ESM modules (a totally separate issue), so my bot app uses CommonJS modules. Now I have another project on my system called Lib, which has a lot of utility functions that I plan to use in several different projects so I don't have to rewrite them. This Lib project uses ESM modules. Since I have to import Lib from DiscordBot, I use the dynamic import syntax in typescript. Now, whenever I transpile my DiscordBot project, the dynamic imports get converted into some ugly javascript module code, and that ugly module code ultimately ends up using require(). Since require() can't import ESM modules, my bot ends up crashing.
I tried however to stop my ts compiler, copy the code from my ts file that imports Lib then pasting that code into the corresponding JS file manually (and removing TS-exclusive features like type annotations and interfaces). Then I ran my bot app, and it worked perfectly fine. But I don't want to have to do this every time. So it's tsc's compiling that's the problem. How do I fix this?
So I understand the purpose is:
Option 1:
If
"module"intsconfig.jsonis set to"commonjs", currently there's no way to prevent TypeScript from transpiling dynamicimport()intorequire()- except that you hide the code in a string and useevalto execute it. Like this:No way TypeScript transpiles a string!
Option 2
Set
"module"intsconfig.jsonto"es2020". By doing this, dynamic import would not be transpiled intorequire(), and you can use dynamic import to import a CommonJS or ES Module. Or, you can use theconst someModule = require("someModule")syntax to import a CommonJS module (would not be transpiled to ES6 import syntax). You cannot use the ES6 import syntax such asimport * as someModule from "someModule"orimport someModule from "someModule". These syntaxes will emit ES Module syntax imports ("module" is set to "es2020") and cannot be run in CommonJS package.Below is a bit information:
If
"module"is set to"es2020": dynamic importimport()is not transpiled.If
"module"is set to `"es2015": there's an error:If
"module"is set to"commonjs": dynamic imports are transpiled.Quote
tsconfig.jsonreference for"module"field: