2011-01-22 20 views
50

Sto usando Node.js e voglio incorporare CoffeeScript nel mio flusso di lavoro. Ho due casi d'uso:require() 'un file CoffeeScript da un file JavaScript o REPL

  1. voglio essere in grado di scrivere i file JavaScript che require() moduli CoffeeScript
  2. voglio essere in grado di caricare i moduli CoffeeScript a partire dal nodo REPL

Per il caso n. 1: posso semplicemente compilare da .coffee a .js e require() il modulo .js, come soluzione alternativa.

Per il caso n. 2: Al momento sono eval() nell'output di coffee-script.compile().

C'è un modo migliore, più univoco per farlo?

+0

Cosa ne pensi di CoffeeScript REPL, 'coffee'? –

+0

Questo REPL è molto primitivo rispetto al nodo uno: manca di colore, completamento automatico, istruzioni multilinea ecc. – nicolaskruchten

+5

Aggiornamento: il REPL 'caffè' è fantastico :) – nicolaskruchten

risposta

91

Il modulo coffee-script registra la sua estensione una volta richiesto.

$ 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: Questo comportamento è cambiato con la relase di CoffeeScript 1.7.0. Ora devi fare:

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

Huh, perché non ci ho pensato? :) – nicolaskruchten

+2

'require.extensions' è ora deprecato e non ci sono ancora alternative. – vaughan

+0

Mi aspetto che rimanga fermo visto che si tratta di una funzionalità stabile e, come hai detto, non ci sono ancora alternative. – Gunchars

11

Una soluzione più versatile sarebbe quella di utilizzare better-require.

npm install better-require 

Consente di visualizzare i file CoffeeScript require(), senza necessità di precompilazione. (Ti consente inoltre di aggiungere altri tipi di formati di file: CoffeeScript, clojurescript, yaml, xml, ecc.)

Nel caso di CoffeeScript, richiede semplicemente il modulo coffee-script.

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

Disclosure: ho scritto better-require.

+1

il problema centrale con 'require.extensions'-che la registrazione di un'estensione cambia stato globale, per l'intera applicazione, purtroppo non viene affrontata da' better-require', il che significa che le cose si interromperanno se qualcuno dei tuoi subappaltatori di terze parti i moduli dipendono da una versione diversa di, per esempio, Yaml o CoffeeScript. – flow

+0

better-require inoltre non carica i moduli ".litcoffee" per impostazione predefinita, mentre possono essere caricati tramite 'require ('coffee-script/register');' – shaunc

Problemi correlati