You can install js2coffee
via npm. So run the following:
npm -g install js2coffee
[~/src/coffee/coffeepress]$ js2coffee --version 2.0.3 [~/src/coffee/coffeepress]$ js2coffee --help Usage: js2coffee FILES [options] Options: --ast prints the AST (for debugging) -V, --verbose prints more AST stuff (used with --ast) -i, --indent N indent by N spaces (default: 2) -i, --indent tab indent by tabs Modes: --compat compatibility mode * (implement workarounds to keep full compatibility) Other options: -h, --help print usage information -v, --version show version info and exit
Vamos a convertir nuestros ficheros *.js
a coffee:
~/src/coffee/coffeepress]$ ls *js **/*js bin/* app.js bin/www routes/index.js routes/users.js [~/src/coffee/coffeepress]$ js2coffee app.js > app.coffee [~/src/coffee/coffeepress]$ js2coffee routes/index.js > routes/index.coffee [~/src/coffee/coffeepress]$ js2coffee routes/users.js > routes/users.coffeeCuando probamos con el main obtenemos un error:
[~/src/coffee/coffeepress]$ js2coffee bin/www > bin/www.coffee bin/www:1:0: [error] Unexpected token ILLEGALEl error es debido a la primera línea para la bash con la definición del intérprete:
[/tmp/coffeepress]$ cat -n bin/www 1 #!/usr/bin/env node 2 3 /** 4 * Module dependencies. 5 */ 6 7 var app = require('../app'); 8 var debug = require('debug')('coffeepress:server'); 9 var http = require('http'); 10 11 /** 12 * Get port from environment and store in Express. 13 */ 14 15 var port = normalizePort(process.env.PORT || '3000'); 16 app.set('port', port); 17 18 /** 19 * Create HTTP server. 20 */ 21 22 var server = http.createServer(app); 23 24 /** 25 * Listen on provided port, on all network interfaces. 26 */ 27 28 server.listen(port); 29 server.on('error', onError); 30 server.on('listening', onListening); 31 32 /** 33 * Normalize a port into a number, string, or false. 34 */ 35 36 function normalizePort(val) { 37 var port = parseInt(val, 10); 38 39 if (isNaN(port)) { 40 // named pipe 41 return val; 42 } 43 44 if (port >= 0) { 45 // port number 46 return port; 47 } 48 49 return false; 50 } 51 52 /** 53 * Event listener for HTTP server "error" event. 54 */ 55 56 function onError(error) { 57 if (error.syscall !== 'listen') { 58 throw error; 59 } 60 61 var bind = typeof port === 'string' 62 ? 'Pipe ' + port 63 : 'Port ' + port 64 65 // handle specific listen errors with friendly messages 66 switch (error.code) { 67 case 'EACCES': 68 console.error(bind + ' requires elevated privileges'); 69 process.exit(1); 70 break; 71 case 'EADDRINUSE': 72 console.error(bind + ' is already in use'); 73 process.exit(1); 74 break; 75 default: 76 throw error; 77 } 78 } 79 80 /** 81 * Event listener for HTTP server "listening" event. 82 */ 83 84 function onListening() { 85 var addr = server.address(); 86 var bind = typeof addr === 'string' 87 ? 'pipe ' + addr 88 : 'port ' + addr.port; 89 debug('Listening on ' + bind); 90 }
Obsérvense las líneas:
29 server.on('error', onError); 30 server.on('listening', onListening);
Many objects in Node emit events:
net.Server
emits an event each time a peer connects to it,
fs.readStream
emits an event when the file is opened.
Functions can then be attached to objects, to be executed when an event is emitted. These functions are called listeners.
Volviendo a nuestra traducción de bin/www
,
si comentamos la primera línea no se producen errores pero si
que nos sale un warning:
~/src/coffee/coffeepress]$ js2coffee bin/www > bin/www.coffee bin/www:37:6: [warning] Variable shadowing ('port') is not fully supported in CoffeeScriptSi cambiamos todas las apariciones de la variable
port
por p. ej. lport
en la definición de la función normalizePort
el warning desaparece:
[~/src/coffee/coffeepress(master)]$ js2coffee bin/www > bin/www.coffee [~/src/coffee/coffeepress(master)]$pero cuando ejecutamos el servidor obtenemos un nuevo error:
[~/src/coffee/coffeepress(master)]$ coffee bin/www.coffee TypeError: undefined is not a function at Object.<anonymous> (/Users/casiano/local/src/coffee/coffeepress/bin/www.coffee:15:8) at Object.<anonymous> (/Users/casiano/local/src/coffee/coffeepress/bin/www.coffee:3:1) at Module._compile (module.js:456:26)
Movemos la función normalizePort
antes de la definición de port
y se arregla el asunto.
[~/src/coffee/coffeepress(master)]$ coffee bin/www.coffee GET / 304 298.379 ms - - GET /stylesheets/style.css 304 6.048 ms - -Otra forma de ejecutar el servidor es instalar
nodemon
npm install -g nodemony ejecutarlo así:
~/src/coffee/coffeepress(master)]$ nodemon bin/www.coffee 6 Apr 14:12:01 - [nodemon] v1.3.7 6 Apr 14:12:01 - [nodemon] to restart at any time, enter `rs` 6 Apr 14:12:01 - [nodemon] watching: *.* 6 Apr 14:12:01 - [nodemon] starting `coffee bin/www.coffee`
Nodemon
(see
http://nodemon.io/
)
is for use during development of a node.js based application.
nodemon
will watch the files in the directory in which nodemon
was started, and if any files change, nodemon
will automatically restart your node application.
nodemon
does not require any changes to your code or method of
development. nodemon
simply wraps your node application and keeps an eye
on any files that have changed. Remember that nodemon
is a replacement
wrapper for node, think of it as replacing the word "node" on the command
line when you run your script.
Otra forma de ejecutar programas escritos en coffee
consiste en usar la posibilidad que existe de cargar
el coffee desde un programa JavaScript usando
coffee-script/register
. Modificamos bin/www
como sigue:
[~/src/coffee/coffeepress.bak(master)]$ cat bin/www #!/usr/bin/env node // Note the new way of requesting CoffeeScript since 1.7.x require('coffee-script/register'); // This bootstraps your server main file require('./www.coffee');y ahora ejecutamos:
[~/src/coffee/coffeepress(master)]$ node bin/www GET / 304 334.240 ms - - GET /stylesheets/style.css 304 7.269 ms - -
Casiano Rodríguez León