Coffeescript: Javascript con esteroides
CoffeeScript ha experimentado un crecimiento tremendo, y se ha convertido en una de las tecnologías más buscadas en los últimos dos años. El campo abierto por Node, Angular, Backbone y otras tecnologías con base Javascript ha abierto la veda y hecho que muchos ojos que muchos ojos se posaran en una tecnología, que si bien no ha sido adoptada de forma masiva, sí que ha sido utilizada de forma exitosa en miles de proyectos, gracias a la facilidad de integración con Ruby on Rails, NodeJS, Grunt, Jenkins y tantos otros.
Origen
Podríamos decir que Javascript, en origen, no es un lenguaje orientado a objetos, y muchos estarían de acuerdo del mismo modo que muchos pondrían el grito en el cielo. En realidad, Javascript no tiene una orientación a objetos "clasica" como pueden tener Java, C++ y tantos otros, sino que lo hace a su manera, y durante años ha habido cierta controversia con este tema. Todo se debe a que Javascript tiene grandes funcionalidades y posibilidades desconocidas para gran parte del público, sin más.
CoffeeScript viene a remediar este escepticismo añadiendo una sintaxis más sencilla y familiar a los desarrolladores, a la vez que simplifica el trabajo y aumenta las posibilidades - y la velocidad - del trabajo con Javascript. Digamos que CoffeeScript es a Javascript lo que Sass a CSS, para dejarlo más claro.
Sintaxis
Un ejemplo simple antes de nada: habitualmente, cuando queremos ejecutar algo tras la carga de la página con jQuery lo encapsulamos en
$(document).ready(function(){
// code here
});
$(function(){
// code here
});
mientras que en CoffeeScript tan sólo usaríamos
$ ->
# code here
En Coffee lo más importante es esto: la simplicidad, desarrollo de un modo más natural. Y como siempre he pensado que para entender una sintaxis, la única y mejor manera es ver código directamente, aquí tenéis una muestra de las características más llamativas de Coffee.
[name, surname, age, new_year, notes] = ['Lisa', 'Simpson', 8, true, [9,9,9,8]] # Asignación múltiple
age++ if new_year # Conditional
fullName = (n,s) -> # Function
"#{n} #{s}" ## String interpolating
impressDecept = (n)->
alert '¡Decepción!' if n<9 # Conditional Statement
$('a.next').on 'click', (e)-> # Callback function
$(this).scrollTo $(this).attr(href)
impressions = (impressDecept note for note in notes)
# Comprehensions
## Son estructuras de bucle For de tipo For-in
## cada valor del Array sobre el que itera el
## bucle se pasa a una función
class User # Class
@id ## Var / attribute
constructor : (@email)-> ## Constructor - @email = this.email
setPassword : (pw)-> ## Function
@salt = CryptoJS.SHA1 pw
class Admin extends User ## Inheritance (Herencia)
superPower : ()->
# some awesome code
Se me quedan en el tintero muchas de las funcionalidades interesantes de CoffeeScript, como super(), => 'fat arrow' (la flecha gorda, no se complicaron mucho con el nombre) o algunos operadores extremadamente útiles como unless. Puedes echarle un vistazo a todo esto a la completa y bien organizada documentación (resumida y extendida) oficial.
Instalación y uso
npm install -g coffee-script
coffee --compile --output lib/ src/
coffee -o lib/ -cw src/ # -cw = --compile --watch
Para Ruby on Rails, basta con incluir 'gem coffee-script' en el Gemfile de nuestro proyecto y hacer un bundle install, aunque es altamente recomendable echarle un vistazo a Barista.
Conclusiones
La irrupción de CoffeeScript y su uso en proyectos grandes no ha estado exenta de polémicas. Muchos desarrolladores se pusieron en contra de su uso argumentando que la simplicidad del código no lo convierte en más claro, aunque como en todo hay casos y casos. Para aquellas ocasiones en que es preferible usar código javascript, se puede incluir dentro de un fichero .coffee entre ` ` de forma que no será interpretado por el compilador.
Como en muchos de estos casos, usar o no usar esta tecnología es una opción personal del desarrollador, siempre y cuando esta no afecte a todo el equipo del proyecto.