2011-01-22 15 views
50

Estoy usando Node.js y quiero incorporar CoffeeScript en mi flujo de trabajo. Tengo dos casos de uso:require() 'ing un archivo de CoffeeScript desde un archivo de JavaScript o REPL

  1. Quiero ser capaz de escribir archivos JavaScript que require() módulos CoffeeScript
  2. Quiero ser capaz de cargar módulos CoffeeScript desde dentro de la REPL nodo

Para el caso n. ° 1:, puedo compilar desde .coffee a .js y require() el módulo .js, como una solución alternativa.

Para la caja n. ° 2: En este momento estoy eval() ing la salida de coffee-script.compile().

¿Existe una manera mejor y más unificada para hacer esto?

+0

¿Qué hay del CoffeeScript REPL, 'coffee'? –

+0

Esa REPL es muy primitiva en comparación con el nodo uno: carece de color, autocompletado, declaraciones de varias líneas, etc. – nicolaskruchten

+5

Actualización: el 'coffee' REPL es ahora increíble :) – nicolaskruchten

Respuesta

91

El coffee-script módulo registra su extensión una vez requerida.

$ 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 
{} 

Editar: Este comportamiento ha cambiado con la relase de CoffeeScript 1.7.0. Ahora tiene que hacer:

require('coffee-script/register'); 
+0

¿Eh, por qué no pensé en eso? :) – nicolaskruchten

+2

'require.extensions' ahora está en desuso y todavía no hay ninguna alternativa. – vaughan

+0

Espero que se quede porque es una característica estable y, como mencionaste, todavía no hay alternativas. – Gunchars

11

Una solución más versátil sería usar better-require.

npm install better-require 

Le permite require() archivos CoffeeScript, no es necesaria una compilación previa. (También le permite require() un montón de otros formatos de archivo: CoffeeScript, clojurescript, yaml, xml, etc.)

En el caso de CoffeeScript, simplemente requiere el módulo coffee-script.

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

Revelación: escribí better-require.

+1

el problema central con 'require.extensions' -que registrar una extensión cambia el estado global, para toda su aplicación- lamentablemente no se trata con' better-require', lo que significa que las cosas se romperán si alguno de sus terceros los módulos dependen de una versión diferente de, por ejemplo, Yaml o CoffeeScript. – flow

+0

mejor-requiere también no carga módulos ".litcoffee" por defecto, mientras que se pueden cargar a través de 'require ('coffee-script/register');' – shaunc

Cuestiones relacionadas