За что я люблю 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, и в последствии реализовать этот язык на уровне браузеров.