У нас є кілька великих кодів JavaScript, і близько місяця тому ми вирішили спробувати CoffeeScript. Один з наших розробників почав з міграції одного з наших модулів з JS до CS за допомогою http://js2coffee.org/ . Цей інструмент був досить зручним, і знадобилося близько двох-трьох годин, щоб перенести 1000 рядків JavaScript. Деякі спостереження, які ми помітили в цей момент:
Отриманий код CoffeeScript був досить читабельним.
Ми склали його назад до JavaScript, і це було досить просто переміщатися та налагоджувати. Поки ми переносили цей модуль, інший розробник з нашої команди знайшов помилку в ньому. Ці два розробники виправили цю помилку в нашому старому коді JavaScript та в новому коді JavaScript, який вийшов із компілятора CS. Вони працювали самостійно, і це зайняло у них приблизно стільки ж часу (15-20 хвилин).
Через те, що це був порт, отриманий код не використовував специфічні для кави функції, які були б відповідними або бажаними. Якби ми писали в CoffeeScript з нуля, код був би ідіоматичнішим. Через це пізніше ми вирішили, що не будемо переносити існуючий код.
Загалом читабельність коротших функцій та менших об'єктів збільшилася до деякого розширення. Однак для довших методів це взагалі не було. Найбільша економія, що випливає, була ->
явною return
, але крім того, що наш код не став значно коротшим чи простішим. Деякі фрагменти синтаксису здавалися досить заплутаними, особливо об'єктні літерали. CS пропускає фігурні дужки навколо визначень членів і поєднується з "все-є-вираження" і неявно, return
що зробило деякі біти коду досить важкими для читання.
Ось JavaScript:
var rabbitGenerator = {
makeRabbit: function(rabbitName, growCarrots) {
if (growCarrots) {
carrots.growMore(10);
} else {
carrots.ensureSupply();
}
return {
name: rabbitName,
height: 0,
actions: {
jump: function (height) {
this.height += height;
},
eatCarrot: function () {
// etc
}
}
};
},
// more members
}
А ось як би виглядав відповідний код CoffeeScript:
rabbitGenerator =
makeRabbit: (rabbitName, growCarrots) ->
if growCarrots
carrots.growMore 10
else
carrots.ensureSupply()
name: rabbitName // (*)
height: 0
actions:
jump: (height) ->
@height += height
eatCarrot: ->
Оскільки зараз досить складно зрозуміти, що заява про повернення починається в (*)
черзі. У нашому проекті ми сильно покладаємось на об’єктні літерали: передаємо їх як параметри функцій та повертаємо їх з інших функцій. У багатьох випадках ці об'єкти, як правило, досить складні: з членами різного типу та кількома рівнями гніздування. У нашому випадку загальне відчуття полягало в тому, що код CoffeeScript насправді важче читати, ніж звичайний код JavaScript.
Незважаючи на те, що налагодження CoffeeScript виявилося простішим, ніж ми очікували, досвід редагування дещо погіршився. Не вдалося знайти хорошого редактора / IDE для цієї мови. Ми не стандартизували редактор / IDE для кодового коду для нашого проекту, і фактично всі ми використовуємо різні інструменти. Насправді всі в команді погоджуються, що при переході на CoffeeScript вони отримують досить погану підтримку від свого інструменту. Плагіни IDE та редактора дуже ранні, і в деяких випадках вони навіть не можуть надати нам належного підкреслення синтаксису або відступу. Не кажучи про фрагменти коду чи рефакторинг. Ми використовуємо WebStorm, Eclipse, NetBeans, VisualStudio, Notepad ++ та SublimeText2.
Говорячи про інструменти, я повинен зазначити, що компілятор CoffeScript сам по собі виступає як пакет Node JS. Ми є первинним магазином Java / .NET, тому всі розвиваються у вікнах Windows. Донедавна підтримка Windows майже не існувала в Node. Ми не змогли зробити компілятор CoffeeScript під керуванням в Windows, тому на даний момент ми вирішили дотримуватися <script type="text/coffeescript">
тегів та компілятора на основі браузера, який базується на льоту.
Компілятор досить швидкий і не збільшує часу запуску. Недоліком є те, що отриманий JavaScript стає eval
редагуваним, і його важко поставити точки переривання в інструментах для розробників браузерів (особливо в IE8). Якщо нам важко працювати з налагодженням, ми попередньо компілюємо код CoffeeScript з тим же інструментом міграції, який я перераховував вище, але це все ще не дуже зручно.
Інші обіцянки CoffeeScript, такі як автоматична var
вставка або напівпрозоре управління за this
допомогою оператора жирової стрілки ( =>
), виявилися не так сильно, як ми сподівалися. Ми вже використовуємо JSLint як частину нашого процесу збирання і пишемо код на ES3 x ES5-Strict
підмножині мови. У всякому разі, те, що кава виробляє один і той же "чистий" код, - це добре . Я також бажаю, щоб усі рамки на сервері виробляли дійсну розмітку HTML5 та CSS3!
Це означає, що я не скажу, що CoffeeScript економить багато часу, додаючи var
для мене ключові слова. JSLint, var
що відсутній , легко вловлює і легко виправляється. Більше того, як тільки ви будете виправлені ним деякий час, ви все одно автоматично починаєте писати хороший JavaScript . Таким чином , я б не сказав , Кава дійсно , що корисний в цьому відношенні.
Ми оцінювали CoffeeScript близько тижня. Усі члени команди писали в ній код, і ми ділилися досвідом один з одним. Ми написали з ним якийсь новий код і перенесли якийсь існуючий код, коли вважали за потрібне. Наші почуття щодо мови були неоднозначними.
Взагалі я б сказав, що це не прискорило наш розвиток, але й не сповільнило нас. Деякі прискорення швидкості через менше набору тексту та меншої кількості помилок компенсувались уповільненнями в інших областях, переважно підтримка інструментів. Через тиждень ми вирішили, що не будемо наказувати використання CoffeeScript, але і заборонити його не будемо . З урахуванням вільного вибору, на практиці його ніхто не використовує, принаймні поки що. Час від часу я замислююсь про те, щоб прототипувати якусь нову функцію в ньому, а потім перетворити код у JavaScript, перш ніж інтегруватися з рештою проекту, щоб швидше почати, але я ще не пробував такого підходу.