Biraz büyük bir JavaScript kod tabanımız var ve yaklaşık bir ay önce CoffeeScript'i denemeye karar verdik. Geliştiricilerimizden biri http://js2coffee.org/ kullanarak modüllerimizden birini JS'den CS'ye geçirmeye başladı . Bu araç oldukça kullanışlıdır ve 1000 satırlık bir JavaScript satırını yerleştirmek yaklaşık iki ya da üç saat sürdü. Bu noktada dikkatimizi çeken bazı gözlemler:
Ortaya çıkan CoffeeScript kodu oldukça okunaklıydı.
JavaScript'e geri derledik ve gezinmek ve hata ayıklamak oldukça kolaydı. Bu modülü taşırken ekibimizden bir başka geliştirici de bir hata buldu. Bu iki geliştirici bu hatayı eski JavaScript kodumuzda ve CS derleyicisinden çıkan yeni JavaScript kodunda düzeltti. Bağımsız olarak çalıştılar ve onları aynı miktarda (15-20 dakika) aldı.
Bir liman olması nedeniyle ortaya çıkan kod, uygun veya istenen Kahveye özgü özellikleri kullanmıyordu. CoffeeScript'te sıfırdan yazarsak kod daha salak olurdu. Bu nedenle daha sonra mevcut kodu taşımayacağımıza karar verdik.
Genel olarak, kısa fonksiyon ve daha küçük nesnelerin okunabilirliği bir dereceye kadar artmıştır. Ancak, daha uzun yöntemler için durum böyle değildi. En büyük şişkinlik tasarrufu geldi ->
ve açıkça ortaya çıktı return
, ancak bunun dışında kodumuzun önemli ölçüde kısaltılması veya basitleştirilmesi yoktu. Bazı sözdizimi parçaları oldukça kafa karıştırıcı görünüyordu, özellikle değişmez nesnelere. CS, üye tanımları etrafındaki kıvrımlı parantezleri atlar ve "her şey bir ifadedir" ifadesiyle birlikte kullanılır ve return
bazı kod parçalarını okumayı zorlaştırır.
İşte 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
}
Ve işte karşılık gelen CoffeeScript kodunun neye benzeyeceği:
rabbitGenerator =
makeRabbit: (rabbitName, growCarrots) ->
if growCarrots
carrots.growMore 10
else
carrots.ensureSupply()
name: rabbitName // (*)
height: 0
actions:
jump: (height) ->
@height += height
eatCarrot: ->
Şimdi olduğu gibi, return ifadesinin (*)
satırda başladığını anlamak oldukça zor . Projemizde nesne değişmezlerine büyük ölçüde güveniyoruz: onları işlev parametreleri olarak iletiyoruz ve diğer işlevlerden döndürüyoruz. Çoğu durumda, bu nesneler oldukça karmaşık olma eğilimindedir: farklı türdeki üyelerle ve çeşitli iç içe geçme düzeyleriyle. Bizim durumumuzda genel duygu, CoffeeScript kodunun okunması düz JavaScript kodundan zordur.
Her ne kadar hata ayıklama CoffeeScript beklediğimizden daha kolay olduğu ortaya çıktı, ancak düzenleme deneyimi biraz azalmıştır. Bu dil için iyi bir editör / IDE bulamadık. Projemiz için müşteri tarafı kodu için editör / IDE standartlaştırmadık ve aslında hepimiz farklı araçlar kullanıyoruz. Aslında bir takımdaki herkes CoffeeScript'e geçtiğinde araçlarından oldukça zayıf bir destek aldıklarını kabul eder. IDE ve editör eklentileri çok erken durumda ve bazı durumlarda bize doğru sözdizimi vurgulama veya girinti desteği bile veremiyorlar. Kod parçacıkları veya yeniden düzenleme hakkında konuşmamak. WebStorm, Eclipse, NetBeans, VisualStudio, Notepad ++ ve SublimeText2 kullanıyoruz.
Araçlardan bahsetmişken, CoffeScript derleyicisinin kendisinin bir Node JS paketi olarak geldiğinden bahsetmeliyim. Birincil Java / .NET mağazasıyız, böylece herkes Windows kutularını geliştiriyor. Yakın zamana kadar Windows desteği Node'da neredeyse yoktu. CoffeeScript derleyicisini Windows üzerinde çalıştıramadık, bu yüzden şu an için <script type="text/coffeescript">
etiketlere ve tarayıcı tabanlı anında derleyicilere yapıştırmaya karar verdik .
Derleyici oldukça hızlıdır ve başlangıç zamanını fazla arttırmaz. Dezavantajı, sonuçta ortaya çıkan JavaScript’in eval
ediniyor olması ve sınırlayıcıları tarayıcının geliştirici araçlarına (özellikle IE8’de) koymak biraz zor. Hata ayıklama konusunda zamanımız varsa, yukarıda listelenen aynı taşıma aracıyla CoffeeScript kodunu önceden derleriz, ancak bu hala çok uygun değildir.
CoffeeScript'in otomatik var
ekleme veya yarı this
ok yönetimi gibi yağ ok operatörüyle ( =>
) olduğu gibi diğer vaatler de umduğumuz kadar kazanç sağlamadığı ortaya çıktı. JSLint'i derleme sürecimizin bir parçası olarak kullanıyoruz ES3 x ES5-Strict
ve dilin alt kümesinde kod yazıyoruz . Her neyse, kahvenin aynı "temiz" kodları üretmesi iyi bir şey . Her sunucu tarafı çerçevenin de geçerli HTML5 ve CSS3 işaretlemesi üretmesini diliyorum!
Bu, benim var
için anahtar kelimeler koyarak CoffeeScript çok fazla zaman kazandırdığını söyleyemeyeceğimi söyledi . Eksik var
s JSLint tarafından kolayca yakalanır ve kolayca sabitlenebilir. Dahası, bir süre düzeltildikten sonra, yine de otomatik olarak iyi JavaScript yazmaya başlarsınız . Böylece, Kahve'nin bu konuda gerçekten bu kadar yardımcı olduğunu söyleyemem .
CoffeeScript'i yaklaşık bir hafta değerlendirdik. Tüm ekip üyeleri içine kod yazıyordu ve deneyimlerimizi birbirimizle paylaştık. Yanında yeni bir kod yazdık ve uygun gördüğümüzde mevcut bazı kodları taşıdık. Dil hakkındaki düşüncelerimiz karışıktı.
Genel olarak, gelişmemizi hızlandırmadığını ancak bizi de yavaşlatmadığını söyleyebilirim. Daha az yazma ve daha az hata yüzeyine bağlı olarak bazı hız kazanımları, diğer araçlardaki yavaşlamalar, çoğunlukla takım desteği ile dengelenmiştir. Bir hafta sonra CoffeeScript kullanımını zorunlu kılmayacağımıza karar verdik, ancak bunu yasaklamayız . Özgür bir seçim göz önüne alındığında, pratikte hiç kimse onu kullanmıyor, en azından şimdilik. Zaman zaman içinde bazı yeni özelliklerin prototiplendiğini düşünüyorum ve daha sonra daha hızlı bir başlangıç yapmak için projenin geri kalanıyla bütünleşmeden önce kodu JavaScript'e dönüştürürüm, ancak henüz bu yaklaşımı denemedim.