CoffeeScript — это, если так можно выразиться, язык высокого уровня, преобразуемый в JavaScript.
Основан простым парнем по имени Jeremy Ashkenas при поддержке его корешей, которые упомянуты на github'е. Вдохновленный Ruby, паренёк решил упростить всем нам жизнь и создал его! CoffeeScript!
Целью и предназначением этого языка является устранение головной боли разработчика, использующего JavaScript. Всем, кто знаком с JavaScript, знают как трудно поддерживать быстро растущий код с множеством магии вроде наследования, передачи контекста объекта в callback методы и многое, многое другое. И те, у кого хватило нервов написать многостраничный native код с разбиением на классы, использующие естественное для JavaScript прототипированное наследование, могут с радостью застрелиться, так как то что они делали — это забивали гвозди тухлой рыбой :). Эй, чуваки, в CoffeeScript это делается легко и просто:
Мы даже можем не волноваться (до момента, когда надо будет что-то подебажить) о том какой CoffeeScript подписал контракт с всенижним, а всего лишь быть уверенными, что на выходе получим native'ный быстроработающий код:
И не надо волноваться о конфликтах имен, так как все выполняется в своем окружении. Но если потребуется «расшарить» класс или переменную из такого «пакета», ничего же не стоит присвоить ссылку на них переменной в глобальном пространстве имен.
Почитать на английском о том, как пользоваться CoffeeScript можно тут. На мой взгляд все доступно описано и с примерами.
Все coffee скрипты «варятся» в своей кофеварке, чтобы не «портить» другие coffee скрипты. Лично я считаю это правильным.
Короткая лямбда — это просто супер. А еще, что очень понравилось, так это передача контекста в callback обработчики:
Согласитесь, что код на coffee выглядит боллее адекватным.
Теперь не надо беспокоиться об объявлении переменных через
Но это, думаю, может понадобиться только в крайних случаях отчаяния.
В CoffeeScript имеется доступ к разного рода языковым конструкциям, к сожалению отсутсвующим в Native JavaScript, приведу несколько примеров, взятых с сайта проекта.
Для полноценной разработки, конечно, не хватает распространных плагинов подсветки и автодополнений, но если не учитывать этих временных трудностей, CoffeeScript по сути явно упрощает написание сложных JavaScript приложений.
Огромный плюс CoffeeScript — это то, что мы имеем возможность писать легко сложный код, который в runtime не требует подключения различных библиотек эмулирующих классические классы и те или иные реализации ecma стандартов, что каждый сможет согласится, значительно увеличит скорость работы скриптов.
А организацию режима разработки и deploy'я каждый выберет по вкусу, это задача не в этой теме.
Спасибо за внимание.
Основан простым парнем по имени Jeremy Ashkenas при поддержке его корешей, которые упомянуты на github'е. Вдохновленный Ruby, паренёк решил упростить всем нам жизнь и создал его! CoffeeScript!
Цели
Целью и предназначением этого языка является устранение головной боли разработчика, использующего JavaScript. Всем, кто знаком с JavaScript, знают как трудно поддерживать быстро растущий код с множеством магии вроде наследования, передачи контекста объекта в callback методы и многое, многое другое. И те, у кого хватило нервов написать многостраничный native код с разбиением на классы, использующие естественное для JavaScript прототипированное наследование, могут с радостью застрелиться, так как то что они делали — это забивали гвозди тухлой рыбой :). Эй, чуваки, в CoffeeScript это делается легко и просто:
- class Animal
- name: "animal"
-
- move: (meters) ->
- alert(@name + " moved " + meters + "m.")
-
- class Snake extends Animal
- constructor: (name) ->
- @name: name
-
- move: ->
- alert("Slithering...")
- super(5)
-
- class Horse extends Animal
- constructor: (name) ->
- @name: name
-
- move: ->
- alert("Galloping...")
- super(45)
-
- sam: new Snake("Sammy the Python")
- tom: new Horse("Tommy the Palomino")
-
- sam.move()
- tom.move()
Мы даже можем не волноваться (до момента, когда надо будет что-то подебажить) о том какой CoffeeScript подписал контракт с всенижним, а всего лишь быть уверенными, что на выходе получим native'ный быстроработающий код:
- (function(){
- var Animal, Horse, Snake, sam, tom;
- var __extends = function(child, parent) {
- var ctor = function(){ };
- ctor.prototype = parent.prototype;
- child.__superClass__ = parent.prototype;
- child.prototype = new ctor();
- child.prototype.constructor = child;
- };
- Animal = function() {};
- Animal.prototype.move = function(meters) {
- return alert(this.name + " moved " + meters + "m.");
- };
-
- Snake = function(name) {
- this.name = name;
- return this;
- };
- __extends(Snake, Animal);
- Snake.prototype.move = function() {
- alert("Slithering...");
- return Snake.__superClass__.move.call(this, 5);
- };
-
- Horse = function(name) {
- this.name = name;
- return this;
- };
- __extends(Horse, Animal);
- Horse.prototype.move = function() {
- alert("Galloping...");
- return Horse.__superClass__.move.call(this, 45);
- };
-
- sam = new Snake("Sammy the Python");
- tom = new Horse("Tommy the Palomino");
- sam.move();
- tom.move();
- })();
И не надо волноваться о конфликтах имен, так как все выполняется в своем окружении. Но если потребуется «расшарить» класс или переменную из такого «пакета», ничего же не стоит присвоить ссылку на них переменной в глобальном пространстве имен.
О документации.
Почитать на английском о том, как пользоваться CoffeeScript можно тут. На мой взгляд все доступно описано и с примерами.
Особенности.
Все coffee скрипты «варятся» в своей кофеварке, чтобы не «портить» другие coffee скрипты. Лично я считаю это правильным.
Короткая лямбда — это просто супер. А еще, что очень понравилось, так это передача контекста в callback обработчики:
- class Data
- manyData: null
-
- constructor: ->
- deferred: new Deferred()
-
- @initData(deferred)
-
- SomeClass.fillData(deferred)
-
- initData: (deferred) ->
-
- deferred.addCallback: (data) =>
- @manyData: data
-
- deferred.addCallback: (error) ->
- alert(error.name + ":" + error.message)
-
- new Data()
На выходе:
- var Data;
- Data = function() {
- var deferred;
- deferred = new Deferred();
- this.initData(deferred);
- SomeClass.fillData(deferred);
- return this;
- };
- Data.prototype.manyData = null;
- Data.prototype.initData = function(deferred) {
- deferred.addCallback = (function(__this) {
- var __func = function(data) {
- this.manyData = data;
- return this.manyData;
- };
- return (function() {
- return __func.apply(__this, arguments);
- });
- })(this);
- deferred.addCallback = function(error) {
- return alert(error.name + ":" + error.message);
- };
- return deferred.addCallback;
- };
-
- new Data();
Согласитесь, что код на coffee выглядит боллее адекватным.
Теперь не надо беспокоиться об объявлении переменных через
var
, а о слове function
вообще забыть — они запрещены в CoffeeScript. Но если надо вставить обычный JavaScript в искодники CoffeeScript, просто оберните их в символы ` `
:
- hi: `function() {
- return [document.title, "Hello JavaScript"].join(": ");
- }`
-
- `var getSomeValue = function() { ... }`
В результате:
- var hi;
- hi = function() {
- return [document.title, "Hello JavaScript"].join(": ");
- };
- var getSomeValue = function() { ... };
Но это, думаю, может понадобиться только в крайних случаях отчаяния.
Фишки
В CoffeeScript имеется доступ к разного рода языковым конструкциям, к сожалению отсутсвующим в Native JavaScript, приведу несколько примеров, взятых с сайта проекта.
CoffeeScript
- cholesterol: 127
-
- healthy: 200 > cholesterol > 60
JavaScript
- var cholesterol, healthy;
- cholesterol = 127;
- healthy = (200 > cholesterol) && (cholesterol > 60);
CoffeeScript
- theBait: 1000
- theSwitch: 0
-
- [theBait, theSwitch]: [theSwitch, theBait]
JavaScript
- var _a, theBait, theSwitch;
- theBait = 1000;
- theSwitch = 0;
- _a = [theSwitch, theBait];
- theBait = _a[ 0];
- theSwitch = _a[1];
CoffeeScript
- numbers: [ 0 .. 9]
-
- threeToSix: numbers[3..6]
-
- copy: numbers[ 0...numbers.length]
JavaScript
- var copy, numbers, threeToSix;
- numbers = (function(){
- a = [];for (var i = 0; ( 0 <= 9 ? i <= 9 : i >= 9); ( 0 <= 9 ? i += 1 : i -= 1)) a.push(i);
- return a;
- }).call(this);
- threeToSix = numbers.slice(3, 6 + 1);
- copy = numbers.slice( 0, numbers.length);
CoffeeScript
- yearsOld: {max: 10, ida: 9, tim: 11}
-
- ages: for child, age of yearsOld
- child + " is " + age
JavaScript
- var _a, _b, age, ages, child, yearsOld;
- var __hasProp = Object.prototype.hasOwnProperty;
- yearsOld = {
- max: 10,
- ida: 9,
- tim: 11
- };
- ages = (function() {
- _a = []; _b = yearsOld;
- for (child in _b) { if (__hasProp.call(_b, child)) {
- age = _b[child];
- _a.push(child + " is " + age);
- }}
- return _a;
- })();
CoffeeScript
- years: [2000 .. 2010]
-
- for year in years
- "year is " + year
JavaScript
- var _a, _b, _c, year, years;
- years = (function(){
- a = [];for (var i = 2000; (2000 <= 2010 ? i <= 2010 : i >= 2010); (2000 <= 2010 ? i += 1 : i -= 1)) a.push(i);
- return a;
- }).call(this);
- _b = years;
- for (_a = 0, _c = _b.length; _a < _c; _a++) {
- year = _b[_a];
- "year is " + year;
- }
Резюме
Для полноценной разработки, конечно, не хватает распространных плагинов подсветки и автодополнений, но если не учитывать этих временных трудностей, CoffeeScript по сути явно упрощает написание сложных JavaScript приложений.
Огромный плюс CoffeeScript — это то, что мы имеем возможность писать легко сложный код, который в runtime не требует подключения различных библиотек эмулирующих классические классы и те или иные реализации ecma стандартов, что каждый сможет согласится, значительно увеличит скорость работы скриптов.
А организацию режима разработки и deploy'я каждый выберет по вкусу, это задача не в этой теме.
Спасибо за внимание.