Node ile eğlenceli işler yapmadan önce atlatmamız gereken sıkıcı son bir konu daha var (Ama sıkılmaman için elimden geleni yapacağım). Makalemiz "npm" ya da uzun yazılışıyla Node Package Manager hakkında.

Bir önceki makalemizdeki örneğimizi hatırlarsan, yazdığımız kodun ilk başında,

var http = require("http");

şeklinde tek satırlık bir nesne tanımlaması yapmıştık ve "http" adında bir modülü kullanmak istediğimizi belirtmiştik. Node, bu ve benzeri on binlerce (Aslında ben bu makaleyi yazdığım sırada official olarak 40.158 adet) modüle sahiptir. Her modül, başka programcılar tarafından yazılan ve yapmak isteyeceğimiz işi ekstra kod yazmaya gerek kalmadan yapmamızı sağlayan, tekrar kullanılabilir paketlenmiş kod bloklarıdır. Bu modüllerin neredeyse tamamı ücretsiz olup, isteyen her programcı tarafından yazılabilir ve başkalarının kullanımına sunulabilir (Modüllerin nasıl yazıldığını ileride öğreneceğiz inşallah).



Modüllerin çok az bir kısmı, Node ile birlikte hazır gelir ve bir önceki makaledeki örnekte olduğu gibi doğrudan kullanılabilir. Bunlara örnek olarak "http" veya "fs" (File System) modülü verilebilir. Node ile birlikte hazır gelmeyen modülleri ise Node Package Manager (npm) ile projemize ekleyebiliriz.

Bir modülü kullanmanın ilk adımı, onu bulmaktır. Bu makaledeki örneğimizde Node ile Google'ın iflas ederek dükkanı kapatıp gidip gitmediğini test eden bir uygulama yazacağız. Bunun için de Google'a ping atıp hala orada olup olmadığına bakacağız. Herkesin ihtiyacı olabilecek güzel bir uygulama. Belki ileride bunu modül yapıp başkalarının kullanımına da sunabiliriz :)

Projemiz için oturup sıfırdan bir şeyler yazmadan önce, bizden önce bu işi yapan ve başkalarının kullanımı için de yazdığı kodu modül halinde paketleyen hayır sever bir programcının olup olmadığını kontrol etmek istiyoruz. Bunun için doğru adres, official modül merkezi https://npmjs.org/ 'dur. Siteye girdiğinde aşağıdaki gibi bir sayfa ile karşılaşmış olman gerekiyor.



Burada üst kısımdaki "Search Packages" yazan metin kutusuna, ihtiyacımızı anlatan bir şeyler yazıyoruz (Bana sanki "ping" yazmak iyi bir fikirmiş gibi geldi) ve aramayı başlatıyoruz. Bu durumda karşına aşağıdaki gibi bir sayfanın gelmesi gerekiyor.



Gördüğün gibi, hayırseverlerin sayısı hayli fazla. Ve yine dikkat edersen, hayırseverliği ile övünen Türk milletine dair pek bir iz yok. Ecnebiler sanırım buna ironi diyorlar.

Bunların detaylarına bakarak, en çok hangisinin bize uygun olduğunu buluyoruz. Ben ilk baştaki "ping" isimli modülü seçtim ve detay sayfası da aşağıdaki gibi gözüküyordu (Önemli olan iki kısmı kırmızı ile ben işaretledim).


Not : Ufak bir tavsiye. Kararsız kalırsan, seyircilere sorma hakkını kullan ve indirilme sayısı en çok olan modülü seç. Vardır elbet bir sebebi.

Böylece ihtiyacımız olan modülü bulduk. Sıra geldi bunu projemize eklemeye. Öncelikle projemiz için masaüstünde bir klasör açalım. Ben proje (klasör) ismi olarak "GoogleBusted" verdim. İlk olarak terminal (Linux veya Mac OS) veya command prompt (Windows) ile projemizin bulunduğu klasöre gitmemiz lazım. Burada tam olarak az önce oluşturduğumuz klasörde olmamız çok önemli. Çünkü birazdan çalıştıracağımız komut, ilgili dosyaları bulunduğumuz klasöre indirecek.

Çalıştıracağımız komut, az önce gördüğümüz detay penceresinin üst kısmında kırmızı çerçeve ile işaretlediğim yerde yazıyordu ($ işareti hariç, yani "npm install ping"). Bunu ilgili klasörde çalıştırınca bende aşağıdaki gibi bir görüntü oluştu.


Ayrıca az önce oluşturduğumuz boş klasöre girince de aşağıdaki gibi bir manzara ile karşılaştım.


Güzel, seçtiğimiz modül ile ilgili dosyalar inmiş. Şimdi hemen proje klasörümüzün içine ("node_modules" klasörünün yanına) aşağıdaki kodlar ile "program.js" adında yeni bir dosya oluşturalım.

"use strict";

var http = require("http");
var ping = require("ping");

http.createServer(processRequest).listen(1234, "127.0.0.1");

function processRequest(request, response) {

    ping.sys.probe("www.google.com", function (isAlive) {

        var message = isAlive ? "Google Ayakta" : "Google Gitti";

        response.writeHead(200, { "Content-Type": "text/html" });

        response.write(message);

        response.end();

    });
}


Ardından terminal (Linux veya Mac OS) veya command prompt (Windows) ile yine aynı klasörde aşağıdaki komutu çalıştıralım (Bunu neden yaptığımızı bir önceki makaleden biliyorsun, tekrar anlatmıyorum).

node program.js

Bir önceki makaledeki gibi kursörün bir satır aşağı geçmesi ve başka hiçbir şey olmaması gerekiyor. Şimdi yazdığımız uygulamayı test etmek için bir internet tarayıcı penceresi açalım ve adres çubuğuna http://127.0.0.1:1234/ yazarak Enter'a basalım. Bu noktada aşağıdaki ekran görüntüsü ile karşılaşmış olman gerekiyor.


Demek ki adamlar hala çalışıyor, güzel. Şimdi de yazdığımız koda bakalım. Aslında ne yazmamız gerektiğini, modülün detay sayfasında en alt kısımda açıklamışlar (Yukarıda, kırmızı ile işaretlediğim kısım). Modülü kullanmak için öncelikle aşağıdaki şekilde bir nesne tanımlamamız gerekiyor.

var ping = require("ping");

Buradaki "ping" modülü dahili veya global kurulmuş bir modül olmadığı için, ilgili dosyaları proje klasörümüzde arayacaktır. Sonrasında adamların detay sayfasında vermiş olduğu örnekteki gibi "ping.sys.probe" fonksiyonu üzerinden işlemimizi gerçekleştiriyoruz.

ping.sys.probe("www.google.com"function (isAlive) {

Burada anlaşılıyor ki, ilk parametre ping atılacak adres veya IP'yi alıyor ve sonucu, boolean tipinde ikinci parametre olarak geçilen fonksiyona geçiyor. Biz de buradaki "isAlive" değişkeninin değerine göre ekrana uygun mesajları yazdırıyoruz, hepsi bu kadar.

Burada dikkat edilecek önemli bir konu var. Burada işlem sonucunda çağırılan fonksiyon (ve aslında Node'da göreceğiniz çoğu fonksiyon) asenkron olarak çağırılır. Yani program akışında bu satıra gelinir ve işlem başlatılır. Ancak işlemin tamamlanması beklenmeden bir alt satıra geçilip devam edilir. Ne zaman ki işlem tamamlanır, o zaman da buradaki fonksiyon çağrılır.

Dikkat : Yukarıda anlattığım paragraf çok önemli ve Node'un temel çalışma prensibini gösteriyor. Ancak konuyu dağıtmamak adına bunu bir sonraki makaleye bırakıyorum. Şimdilik kulak dolgunluğu olması yeterli.

Yukarıdaki örneğimizde, ihtiyacımız olan modülü "npm" vasıtasıyla indirdik ve kullandık. Eğer "program.js" kodumuzu başkaları ile paylaşırsak, onların da kullanmadan önce "npm install ping" komutu ile aynı modülü indirmeleri gerekir. İşte bu bir sıkıntı olabilir. Hele ki kullandığımız onlarca modül varsa, insanlara ihtiyaç duyacakları modülleri tek tek söylemek, onların da atlamadan bunları indirmelerini sağlamak, tahmin edebileceğin gibi çok da kabul edilebilir bir yöntem olmayacaktır.  Hatta kendi kodumuzu başka bir bilgisayara taşıdığımızda, biz bile bunu yapmaya üşenebiliriz. Peki ne yapacağız?

Bunu otomatize etmenin bir yolu var; "package.json". Örnek üzerinde görelim. İlk olarak proje klasörümüzdeki "node_modules" klasörünü silelim ve sadece "program.js" dosyasını bırakalım. Böylece modülü tekrar indirmemiz gerekecek. Ardından aşağıdaki kodu, "package.json" ismiyle proje klasörümüze kaydedelim. Böylece proje klasörümüzde yan yana iki adet dosya olacak.

{
    "name": "GoogleBusted",
    "version": "1.0.0",
    "dependencies": {
        "ping": "0.1.6"
    }
}

"package.json" dosyası, yazdığımız programla alakalı pek çok işte kullanılır ancak burada sadece ön gereksinim olan modüllerin kurdurulması konusunu göreceğiz. Şimdi terminal (Linux veya Mac OS) veya command prompt (Windows) ile projemizin bulunduğu klasöre kadar gidelim ve "npm install" komutunu çalıştıralım. Bunu ilgili klasörde çalıştırınca bende aşağıdaki gibi bir görüntü oluştu.


Klasöre bakınca da artık aşağıdaki gibi gözüküyor olmalı.


Senin de fark edeceğin gibi, "npm install" komutunda herhangi bir modül ismi vermememize karşın, npm bizim "package.json" dosyamızdan gerekli modülleri ve versiyonlarını okuyarak mevcut olmayanları otomatik olarak indirdi. Dosyamızda onlarca modül yer alıyor olsaydı, onları da sırasıyla indirip kullanımımıza sunacaktı. Hoş, değil mi?

Pekala, modülü bulduk, indirdik ve kullandık. Hatta otomatize de ettik. O halde bu makalenin bitmiş olması gerekiyordu. Neden hala yazıyorum? Hmm, garip.

Tamam, hatırladım. Modüller hakkında anlatacağım son bir konu daha vardı. Modüllerin global kullanımı (Anlatmaya çok gönlüm yok, anlaşılıyordur herhalde).

Bazı modüller vardır ki, bunları yazdığımız uygulamaların çoğunda kullanırız. Örneğin "express" veya "mongodb" gibi (Şimdilik bunların ne olduğunu bilmene gerek yok. İleride her biri için ayrı makaleler yazacağım inşallah). Bu tarz modülleri, yazdığımız her bir uygulama için ayrı ayrı indirebileceğimiz gibi, uygulamadan bağımsız şekilde aynı makine üzerinde yazılan tüm uygulamalarda ortak kullanacak şekilde de indirebiliriz. Peki bunun bize ne gibi faydaları olur?

  • Tüm uygulamalar için ayrı ayrı indirmediğimiz için diskte yer kazanırız (< 1MB)
  • Tüm uygulamalar için ayrı ayrı indirmediğimiz için (varsa) internet kotamızı yemez (< 1MB)
  • İndirilen yer sistem genelindeki PATH değişkeninde tanımlı olduğu (ya da olacağı) için, terminal veya command prompt üzerinden direk erişilebilir.


İşin doğrusu, yukarıdaki maddelerin hiçbiri beni tatmin etmiyor. Oysa local olarak proje klasörüne indirilen modüllerden kurtulmamız için tek yapılması gereken, klasörü silmek olduğu için bana çok daha cazip geliyor. Ama yine de nasıl yapıldığını bilelim.

Not : Buraya ek bir not düşmek istiyorum. Az miktardaki paketi global olarak sürekli kullanmamız gerekiyor. Bunlara örnek olarak jasmine-node, grunt ve bower verilebilir. Bunun gibi paketleri her seferinde fiziksel yol bilgisi ile birlikte çalıştırmak çok da mantıklı olmayacaktır. Bu yüzden, bu tarz paketlerin "-g" parametresi ile kurulması gerektiğine katılıyorum. Burada söylemeye çalıştığım, bir paketi global olarak kurmadan önce birkaç kez düşünmemizin ve gerçekten de gerekli olduğuna karar vermemizin gerekliliği.

Aslında yapılacak iş çok basit. Örneğin bu makalede kullandığımız "ping" modülünü global olarak indirmek için yazmamız gereken komut aşağıdaki gibi olacaktır.

npm install -g ping

Böylece ilgili modül, proje klasörümüz yerine tüm node uygulamalarının ortak erişebileceği bir yere inecektir (Linux ve Mac OS için "\usr\local\lib\node_modules", Windows için "C:\Users\username\AppData\Roaming\npm\node_modules").

Not : Dosyaların yerini bilmemiz, onlara ihtiyaç duymadığımızda kolayca silebileceğimiz anlamına gelmiyor. Çünkü bunları kullanan başka uygulamalar veya daha da önemlisi bunlara bağımlı başka modüller de olabilir.

Geldik bir makalenin daha sonuna. Öğrendiklerimizi özetleyelim.
  • Modüller, başka programcılar tarafından yazılan, tekrar kullanılabilir paketlenmiş kod bloklarıdır.
  • Official modül merkezi adresi https://npmjs.org/ 'dur.
  • Modüller "npm install xxxx" komutu vasıtasıyla indirilir.
  • Modüllerin kurulumunu otomatize etmek için "package.json" dosyası kullanılabilir.
  • Modülleri proje klasörü (local) yerine global olarak kurmak için "npm install -g xxxx" komutu kullanılabilir.


Yorum Gönder

 
Top