This blog post describes a minimal setup for producing npm packages via Babel. You can see that setup in action in the GitHub repository for re-template-tag
.
There are two two sets of files:
esm/
has the (untranspiled) actual source code of the library.
module
in package.json
points to esm/index.js
test/
contains AVA-based tests for the files in esm/
.cjs/
has transpiled versions of the ESM files, so that they have the CommonJS format and support the features that the currently running Node.js can handle.
main
in package.json
points to cjs/index.js
This structure enables two use cases:
cjs/
.esm/
. They transpile those files via babel-preset-env
to the feature set supported by their target platforms. Details of how to do that are described in a separate blog post.One issue we have only partially tackled is how to polyfill parts of the standard library that may be missing. That will be the topic of an upcoming blog post.
.gitignore
cjs
node_modules
cjs/
is not committed to git. We only generate it on demand before publishing the package on npm.
.npmignore
node_modules
When publishing to npm, we do need to include cjs/
. That’s why we need .npmignore
in addition to .gitignore
.
package.json
package.json
The following scripts are available:
"scripts": {
"build": "babel esm --out-dir cjs",
"prepublishOnly": "npm run build",
"test": "ava"
},
build
generates the files in cjs/
.prepublishOnly
ensures that cjs/
is always built before we publish to npm.test
runs tests via AVA.Accordingly, we have the following dependencies (at development time only):
"devDependencies": {
"babel-cli": "^6.24.1",
"ava": "^0.21.0",
"babel-preset-env": "^1.5.1",
"babel-register": "^6.24.1"
},
ava
is needed for the unit tests.babel-cli
provides the command babel
.babel-register
lets AVA execute the tests via Babel.babel-preset-env
is the Babel preset we use for transpilation."main": "./cjs/index.js",
"module": "./esm/index.js",
main
is the package entry point for the CommonJS format (which includes normal modules running on Node.js).module
is the package entry point for the ESM format (which includes webpack; depending on how you set it up).For Babel, we use babel-preset-env
in the typical way, to produce code for the currently running Node.js.
"babel": {
"presets": [
[
"env",
{
"targets": {
"node": "current"
}
}
]
]
},
For AVA, we require babel-register
, which transpiles all tests and their imports via Babel. "babel": "inherit"
means that AVA uses the configuration shown in the previous section.
"ava": {
"require": [
"babel-register"
],
"babel": "inherit"
}
This was a quick tour of a minimal repository for authoring npm packages via Babel. An important aspect is that it lets clients of the package use babel-preset-env
(as described in “Delivering untranspiled source code via npm”). To that end, it does not use module
100% correctly, but with the upside of broad support and of not introducing yet another package.json
property.