За что я люблю CoffeeScript

CoffeeScript В последнее время я начал больше писать о JavaScript, о NodeJS, поэтому хочу немного написать о CoffeeScript — именно на нем я решаю большинство стоящих передо мной задач. Например node-tumblr, мой первый NodeJS модуль, был написан именно на этом языке.

Пару слов о том что же это такое

CoffeeScript — это высокоуровневый язык программирования, который компилируется в JavaScript. Язык исправляет многие недостатки JavaScript. Добавляет стройности коду, убирает лишние скобки и точки-с-запятой, вправляет мозги как правильно писать нативный JS код.
Однако не стоит забывать золотое правило языка: “это лишь JavaScript”, поэтому не стройте иллюзий ;)

Последняя версия 1.4.0 и это стабильный, устоявшийся релиз. То есть можно смело использовать.

За что же я его люблю?

Сразу предупреждаю, некоторые примеры запрещены беременным женщинам и людям с нарушенной психикой.

Однострочные условия, как в Ruby

options = {} unless options?

options.type = type if type?

После компиляции из CoffeeScript в JavaScript получаем такое

if (typeof options === "undefined" || options === null) {
  var options = {};
}

if (typeof type !== "undefined" && type !== null) {
  options.type = type;
}

Работа с объектами

options = {url}

options =
  url: 'link'
  text: 'description'
  show: false

После компиляции из CoffeeScript в JavaScript получаем такое

var options = {
  url: url
};

var options = {
  url: 'link',
  text: 'description',
  show: false
};

Работа с функциями (замыкания, однострочные функции, параметры по-умолчанию, возвращаемые значение)

do ->
  parse = (body) -> JSON.parse body

  request = (url, fn = ->) ->
    xhr {url}, (error, request, body) -> fn.call @, parse body

После компиляции из CoffeeScript в JavaScript получаем такое

(function() {
  var parse, request;

  parse = function(body) {
    return JSON.parse(body);
  };

  request = function(url, fn) {
    if (fn == null) {
      fn = function() {};
    }

    xhr({url: url}, function(error, request, body) {
      fn.call(this, parse(body));
    });
  };
})();

Работа с this (сохранение текущего контекста)

do (tumblr) ->
  @debug = (text) -> console.log text

  @periodical = (message) ->
    setTimeout (=> @debug message), 1000

После компиляции из CoffeeScript в JavaScript получаем такое

(function(tumblr) {
  this.debug = function(text) {
    return console.log(text);
  };

  this.periodical = function(message) {
    var _this = this;

    setTimeout(function() {
      _this.debug(message);
    }, 1000);
  };
})(tumblr);

И напоследок, совсем страшное

do (tumblr) ->
  @posts = (options, fn) ->
    [fn, options] = [options, null] if typeof options is 'function'

    request options, fn

  alias = (self, type) ->
    self[type] = (options, fn) -> @posts options, fn

  alias tumblr, type for type in ['text', 'quote', 'link', 'answer', 'video', 'audio', 'photo']

После компиляции из CoffeeScript в JavaScript получаем такое

(function(tumblr) {
  var alias, type, _i, _len, _ref;

  this.posts = function(options, fn) {
    var _ref;

    if (typeof options === 'function') {
      _ref = [options, null], fn = _ref[0], options = _ref[1];
    }

    request(options, fn);
  };

  alias = function(self, type) {
    self[type] = function(options, fn) {
      this.posts(options, fn);
    };
  };

  _ref = ['text', 'quote', 'link', 'answer', 'video', 'audio', 'photo'];
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    type = _ref[_i];
    alias(tumblr, type);
  }
})(tumblr);

Как видите язык почерпнул много хорошего из Ruby, Python, Haskell и других похожих языков.

Я лишь привел в качестве примеров то, что сам уже использую и могу показать, однако это небольшая часть синтаксических конструкций с которыми можно работать в CoffeeScript. Много дополнительной информации вы сможете найти в документации, там хорошие и понятные примеры.

Так же вы можете познакомится с исходным кодом node-tumblr, написанном на CoffeeScript и посмотреть результат компиляции его в JavaScript код.

В ближайшее время я расскажу о небольшой хитрости, она поможет начинающим разработчикам на CoffeeScript.

Лирика

Я на полном серьезе думаю о том, чтобы комитету отвечающему за ECMAScript стоит рассмотреть CoffeeScript как эволюцию JavaScript, и в последствии реализовать этот язык на уровне браузеров.

Что ещё почитать?

← Что интересного в PHP 5.4 beta 2 и Как навести порядок в зоопарке микр →