What is regenerator?
The regenerator npm package is a tool that transforms ECMAScript 2015+ (ES6+) generator functions and async functions into a form that can be used in older JavaScript environments. It allows developers to use modern JavaScript features while maintaining compatibility with older browsers and environments.
What are regenerator's main functionalities?
Transforming Generator Functions
This feature allows you to write generator functions using the `function*` syntax and transform them into code that can run in environments that do not natively support generators.
const regeneratorRuntime = require('regenerator-runtime/runtime');
function* generatorFunction() {
yield 'Hello';
yield 'World';
}
const gen = generatorFunction();
console.log(gen.next().value); // 'Hello'
console.log(gen.next().value); // 'World'
Transforming Async Functions
This feature allows you to write async functions using the `async` and `await` syntax and transform them into code that can run in environments that do not natively support async functions.
const regeneratorRuntime = require('regenerator-runtime/runtime');
async function asyncFunction() {
return await Promise.resolve('Hello World');
}
asyncFunction().then(console.log); // 'Hello World'
Other packages similar to regenerator
babel
Babel is a JavaScript compiler that includes a wide range of plugins and presets to transform modern JavaScript into a form that is compatible with older environments. It can handle transformations for generator functions, async functions, and many other modern JavaScript features. Compared to regenerator, Babel offers a more comprehensive solution for JavaScript transpilation.
traceur
Traceur is a JavaScript compiler that allows you to use features from the latest versions of JavaScript (ECMAScript) today. It supports transforming generator functions and async functions, similar to regenerator. However, Traceur is less commonly used compared to Babel and regenerator.
regenerator
This package implements a fully-functional source transformation that
takes the proposed syntax for generators/yield
from future versions of
JS (ECMAScript6 or ES6, experimentally implemented in Node.js v0.11) and
spits out efficient JS-of-today (ES5) that behaves the same way.
A small runtime library (less than 1KB compressed) is required to provide the
wrapGenerator
function. You can install it either as a CommonJS module
or as a standalone .js file, whichever you prefer.
Installation
From NPM:
npm install -g regenerator
From GitHub:
cd path/to/node_modules
git clone git://github.com/facebook/regenerator.git
cd regenerator
npm install .
npm test
Usage
You have several options for using this module.
Simplest usage:
regenerator es6.js > es5.js
regenerator --include-runtime es6.js > es5.js
regenerator src lib
Programmatic usage:
var es5Source = require("regenerator").compile(es6Source).code;
var es5SourceWithRuntime = require("regenerator").compile(es6Source, {
includeRuntime: true
}).code;
AST transformation:
var recast = require("recast");
var ast = recast.parse(es6Source);
ast = require("regenerator").transform(ast);
var es5Source = recast.print(ast);
How can you get involved?
The easiest way to get involved is to look for buggy examples using the
sandbox, and when you find
something strange just click the "report a bug" link (the new issue form
will be populated automatically with the problematic code).
Alternatively, you can
fork the repository,
create some failing tests cases in test/tests.es6.js,
and send pull requests for me to fix.
If you're feeling especially brave, you are more than welcome to dive into
the transformer code and fix the bug(s) yourself, but I must warn you that
the code could really benefit from better implementation
comments.