
* Show an appropriate error if the user tries to use --transpile via the CLI and babel-core isn’t installed * Update documentation around global/local * Fix #4713: Use Babel’s built-in `filename` option to let Babel search for its options, rather than us doing so * Improve transpilation docs * Colons are good * Docs cleanup * Rewrite transpilation docs * Better identifier for compiled scripts that didn’t come from files; better resolving of paths
4.5 KiB
Transpilation
CoffeeScript 2 generates JavaScript that uses the latest, modern syntax. The runtime or browsers where you want your code to run might not support all of that syntax. In that case, we want to convert modern JavaScript into older JavaScript that will run in older versions of Node or older browsers; for example, { a } = obj
into a = obj.a
. This is done via transpilers like Babel, Bublé or Traceur Compiler.
Quickstart
From the root of your project:
npm install --save-dev babel-core babel-preset-env
echo '{ "presets": ["env"] }' > .babelrc
coffee --compile --transpile --inline-map some-file.coffee
Transpiling with the CoffeeScript compiler
To make things easy, CoffeeScript has built-in support for the popular Babel transpiler. You can use it via the --transpile
command-line option or the transpile
Node API option. To use either, babel-core
must be installed in your project:
npm install --save-dev babel-core
Or if you’re running the coffee
command outside of a project folder, using a globally-installed coffeescript
module, babel-core
needs to be installed globally:
npm install --global babel-core
By default, Babel doesn’t do anything—it doesn’t make assumptions about what you want to transpile to. You need to provide it with a configuration so that it knows what to do. One way to do this is by creating a .babelrc
file in the folder containing the files you’re compiling, or in any parent folder up the path above those files. (Babel supports other ways, too.) A minimal .babelrc
file would be just { "presets": ["env"] }
. This implies that you have installed babel-preset-env
:
npm install --save-dev babel-preset-env # Or --global for non-project-based usage
See Babel’s website to learn about presets and plugins and the multitude of options you have. Another preset you might need is transform-react-jsx
if you’re using JSX with React (JSX can also be used with other frameworks).
Once you have babel-core
and babel-preset-env
(or other presets or plugins) installed, and a .babelrc
file (or other equivalent) in place, you can use coffee --transpile
to pipe CoffeeScript’s output through Babel using the options you’ve saved.
If you’re using CoffeeScript via the Node API, where you call CoffeeScript.compile
with a string to be compiled and an options
object, the transpile
key of the options
object should be the Babel options:
CoffeeScript.compile(code, {transpile: {presets: ['env']}})
You can also transpile CoffeeScript’s output without using the transpile
option, for example as part of a build chain. This lets you use transpilers other than Babel, and it gives you greater control over the process. There are many great task runners for setting up JavaScript build chains, such as Gulp, Webpack, Grunt and Broccoli.
Polyfills
Note that transpiling doesn’t automatically supply polyfills for your code. CoffeeScript itself will output Array.indexOf
if you use the in
operator, or destructuring or spread/rest syntax; and Function.bind
if you use a bound (=>
) method in a class. Both are supported in Internet Explorer 9+ and all more recent browsers, but you will need to supply polyfills if you need to support Internet Explorer 8 or below and are using features that would cause these methods to be output. You’ll also need to supply polyfills if your own code uses these methods or another method added in recent versions of JavaScript. One polyfill option is babel-polyfill
, though there are many other strategies.