Breakdown of 7 different ways to use ES modules with npm today.
This approach uses babel with babel-preset-env to transpile all Node.js and browser source files into dist/
. It is relatively simple, with package.json
properly supporting all three main
, module
, and browser
fields.
- Source files end in
.mjs
- Babel transpiles all source files to commonjs
- Tests are run on the transpiled source, which could make debugging slightly harder
- Currently, our
main
andbrowser
are commonjs exports that supportnode >= 4
(or whatever we specify in our babel-preset-env config), whereas themodule
export is an es module that supportsnode >=8
due to its usage ofasync await
. - Unfortunately AFAIK, package.json
engines
doesn't support specifying thatmain
supports a certain node version whereasmodule
supports a different module version, and I'd go so far as to say this is a bad practice. - To get around this, we could specify the minimum node version to be
node >= 8
like we did here or add a second babel step which transpiles the node version to an esm folder, although I find this somewhat clunky.
- naive - The most naive possible use of ES modules supporting our functionality. This approach is broken and provided as an example starting point.
- babel - Uses babel to transpile all Node.js and browser source files.
- esm-rollup - Uses esm for Node.js and babel+rollup to compile browser source files.
- esm-webpack - Uses esm for Node.js and babel+webpack to compile browser source files.
- rollup - Uses babel+rollup to compile all Node.js and browser source files.
- webpack - Uses babel+webpack to compile all Node.js and browser source files.
- typescript - Uses typescript to transpile all Node.js and browser source files.
MIT © Travis Fischer