54

I'm using Node.js and wanting to incorporate CoffeeScript into my workflow. I have two use-cases:

  1. I want to be able to write JavaScript files which require() CoffeeScript modules
  2. I want to be able to load CoffeeScript modules from within the node REPL

For case #1: I can just compile from .coffee to .js and require() the .js module, as a workaround.

For case #2: Right now I'm eval()ing the output of coffee-script.compile().

Is there a better, more unified way to do this?

Zearin
  • 1,474
  • 2
  • 17
  • 36
nicolaskruchten
  • 26,384
  • 8
  • 83
  • 101

2 Answers2

95

The coffee-script module registers its extension once required.

$ echo 'console.log "works"' > module.coffee

$ echo '
> require("coffee-script")
> require("./module")
> ' > test.js

$ node test.js
works

$ node
> require('coffee-script'); require('./module')
works
{}

Edit: This behaviour has changed with the relase of CoffeeScript 1.7.0. Now you need to do:

require('coffee-script/register');
TheHippo
  • 61,720
  • 15
  • 75
  • 100
matyr
  • 5,774
  • 28
  • 22
12

A more versatile solution would be to use better-require.

npm install better-require

It lets you require() CoffeeScript files, no pre-compilation needed. (It also lets you require() a bunch of other file formats: CoffeeScript, clojurescript, yaml, xml, etc.)

In the case of CoffeeScript, it simply requires the coffee-script module.

require('better-require')();
var myModule = require('./mymodule.coffee');
var clojurescriptModule = require('./mymodule.cljs');
// etc.

Disclosure: I wrote better-require.

Zearin
  • 1,474
  • 2
  • 17
  • 36
Olivier Lalonde
  • 19,423
  • 28
  • 76
  • 91
  • 1
    the central problem with `require.extensions`—that registering an extension changes global state, for your entire application—is, sadly, not addressed by `better-require`, meaning that things will break if any of your 3rd party sub-modules happen to depend upon a different version of, say, Yaml, or CoffeeScript. – flow Nov 23 '13 at 20:43
  • better-require also doesn't load ".litcoffee" modules by default, whereas they can be loaded via `require('coffee-script/register');` – shaunc Mar 24 '15 at 17:44