How to use and write plugins for Babel
Highly experimental
Internal APIs are still in a high state of flux. If you find something that is not documented on this page then you're at risk of it changing without notice.
Incomplete
Pull requests expanding on existing or adding additional documentation are extremely appreciated.
Official and Community Plugins
Checkout official plugins in the babel-plugins repo! Other community plugins can be found on npm.
Plugins are resolved relative to the current working directory.
require("babel").transform("code", {
plugins: ["foo-bar"]
});
require("babel").transform("code", {
plugins: [require("foo-bar")]
});
CLI:
$ babel --plugins foo-bar script.js
{
"plugins": ["foo-bar"]
}
By default, plugins are run before the internal ones. You can alternatively specify the position via a colon after the plugin name. ie:
require("babel").transform("code", {
plugins: ["foo-bar:after", "bar-foo:before"]
});
require("babel").transform("code", {
plugins: [{transformer: require("foo-bar"), position: 'after'}]
});
$ babel --plugins foo-bar:after bar-foo:before script.js
The Babel parser is heavily based on Acorn which makes use of the extremely common and versatile ESTree AST format:
package.json
{
"name": "babel-plugin-foo",
"version": "1.0.0",
"dependencies": {
"babel-core": "^5.6.0"
}
}
index.js
export default function ({ Plugin, types: t }) {
return new Plugin("foo-bar", {
visitor: {
// visitors
}
});
}
You can find a simple plugin example as well as usage in the sebmck/babel-plugin-example repo.
How to visit nodes
How to remove and replace nodes
How to use scoping and track variables