Synchronously Require ES6 Modules in NodeJS.
I do a lot of test-driven development and I have found that it's generally easier to write tests that can be run with a simple
node test.js. However, if a dependency of a dependency is an ES6 Module, I'll run into a "Error [ERR_REQUIRE_ESM]: require() of ES Module not supported." I won't convert my module to an ES6 Module, because I want it to simply work in a CJS environment without any additional processing or compilation steps. I can't use a dynamic import because I don't want to fork a dependency and take on that maintenance burden. In my case, it was easier to just hack the require function to work with ES6 Modules.
Furthermore, currently my issues are only with development dependencies I use for testing, so this hack doesn't apply to anything in production.
how does it work?
require(NAME_OF_ES_MODULE) and calls dynamic import while blocking the thread with deasync.
why you shouldn't use this in production
This library depends on deasync, which relies on a non-standardized NodeJS API. In other words, there's no guarantee of stability. I can also not guarantee the security of this package (or any package really), but especially deasync because it uses C++ and I'm not an expert in C++.
npm install require-esm-deasync
using r flag
// test.js const lru = require("quick-lru"); // an ES Module console.log(lru); [class QuickLRU extends Map] ...
node -r require-esm-deasync test.js
placing at top of file
// test.js // place at top of file before requiring an ES Module require("require-esm-deasync"); const lru = require("quick-lru"); ...