onokumus

Matematik Öğretmeni

NODE.js - 1 - Bismillah

Başlarken

Öncelikle bunun bir yazı dizisi olmasını planlıyorum. Fakat okuyucular bir ders olarak telakki etmesinler. Ders verecek yeterlilikte olduğumu düşünmüyorum. Olsa olsa benim gibi acemiler için bir başlangıç rehberi olur.

Kurulum

İlk önce node.js ‘yi bilgisayarımıza kurmalıyız. Bunun için node.js sayfasından işletim sistemize uygun olan paketi kuruyoruz.

archlinux node.js kurulum
1
sudo pacman -S nodejs

Test

Kurulumu test etmek için konsol da aşağıdaki komutu verelim.

node test
1
node -v

Benim bilgisayarımda 0.10.29 versiyonu kuruluymuş. Şimdi de npm nin kurulu olup olmadığını test edelim.

npm test
1
npm -v

npm nin 1.4.16 versiyonu kuruluymuş.

node.js ile konsol üzerinde denemeler yapalım. Konsolda;

node aritmetik
1
node

komutunu verdiğimizde şöyle bir;

node konsole
1
>

çıktısı olmalı. Çeşitli matematik işlemleri yapalım.

node aritmetik
1
2
3
> 5+4 // 9
> Math.PI // 3.141592653589793
> Math.cos(Math.PI) // -1

kafi.

JavaScript Yazalım

Artık node.js ile javascript yazalım. Bunun için bir proje1 klasörü oluşturalım. Bu klasörün tam yolunu iyi bilmemiz gerekiyor. Ben kolaylık olsun diye /home/ono dizininde proje1 klasörü oluşturuyorum. İçinde de index.js dosyasını oluşturalım.

proje1/index.js
1
console.log("node.js çalıştı");

Oluşturduğumuz index.js nin çalışmasını test edelim.

konsol
1
node index

Eğer node.js çalıştı çıktısını alıyorsak sorun yok demektir. Burada

node index

yerine

node index.js

komutunu da verebilirsiniz. Farketmez.

Modül Yükleme

node.js moduler bir yapıdadır. Yani başka birilerinin hazırladığı modülleri de, kendimizin hazırladığı modülleri de kullanabiliriz. Bunun için node.js ‘nin require modülünü kullanacağız. Bu sınıfı kullanmak için ekstra bir şey yapmamıza gerek yoktur. Sadece çağıracağız.

Örneğimize geçelim. proje1 klasörü içinde cember.js dosyasını oluşturalım.

proje1/cember.js
1
2
3
4
var PI = Math.PI;
function alan (r) {
  return PI * r * r;
}

Şimdi index.js dosyasını güncelleyelim. Son hali şöyle olmalı.

proje1/index.js
1
2
3
4
// console.log("node.js çalıştı");
var cember = require("./cember"); // cember modülünü çağır

console.log("Yarıçapı 5 olan çemberin alanı : " + cember.alan(5));

Şimdi test yapalım.

konsol
1
node index

Sonuç: hata! Çağırılan nesnenin içinde alan diye bir metod yok diyor. Aslında vardı? Neden? Aslında sebep basit. cember.js dosyası içindeki alan fonksiyonu sadece çember sınıfına ait. Dışarıdan erişilemez. Bir anlamda private. Dışarıdan kullanıma açmak için exports etmeliyiz. cember.js dosyasını güncelliyoruz. Son hali aşağıda.

proje1/cember.js
1
2
3
4
5
6
var PI = Math.PI;
function alan (r) {
  return PI * r * r;
}

module.exports.alan = alan;

Tekrar test yapalım.

konsol
1
node index

Sonuç:

konsol
1
Yarıçapı 5 olan çemberin alanı : 78.53981633974483

Tamam. Peki index.js dosyamızdaki 2. satırda çağırma esnasında ./cember şeklinde değilde neden sadece cember şeklinde çağırmadık? node.js modülleri çağırırken ön tanımlı olarak iki klasöre bakar.

  • node.js kurulurken otomatik yüklenen /usr/lib/node_modules klasörüne
  • proje1 klasöründe node_modules klasörüne

node.js için index.js ile cember.js nin aynı klasörde olması önemsizdir. Bizden tam yolu söylememizi ister. Bu yüzden cember modülünü çağırırken başına ./ koymamız gerekir.

Bir deneme daha yapalım. proje1 klasörü içinde lib klasörü oluşturalım ve içinde dikdortgen.js dosyası oluşturalım.

proje1/lib/dikdortgen.js
1
2
3
4
function alan (en, boy) {
  return en * boy;
}
module.exports.alan = alan;

index.js dosyamızı güncelleyelim. Son hali :

proje1/index.js
1
2
3
4
5
6
7
8
// console.log("node.js çalıştı");
var cember = require("./cember"); // cember modülünü çağır

console.log("Yarıçapı 5 olan çemberin alanı : " + cember.alan(5));

var dikdortgen = require("./lib/dikdortgen");

console.log("Eni 5 boyu 4 olan dikdörtgenin alanı : " + dikdortgen.alan(5,4));

Çıktımız şöyle ise sorun yok demektir.

konsol
1
2
Yarıçapı 5 olan çemberin alanı : 78.53981633974483
Eni 5 boyu 4 olan dikdörtgenin alanı : 20

Demek ki yukarıdaki iddiamız doğru. node.js ön tanımlı olarak node_modules klasörüne bakar dedik. Test edelim. Bunun için proje1 klasörü içinde node_modules klasörü ve içinde de kare.js dosyası oluşturalım.

proje1/node_modules/kare.js
1
2
3
4
function alan (kenar) {
  return kenar * kenar;
}
module.exports.alan = alan;

index.js dosyamızı güncelleyelim. Son hali :

proje1/index.js
1
2
3
4
5
6
7
8
9
10
11
12
// console.log("node.js çalıştı");
var cember = require("./cember"); // cember modülünü çağır

console.log("Yarıçapı 5 olan çemberin alanı : " + cember.alan(5));

var dikdortgen = require("./lib/dikdortgen");

console.log("Eni 5 boyu 4 olan dikdörtgenin alanı : " + dikdortgen.alan(5,4));

var kare = require("kare");

console.log("Bir kenarı 6 olan karenin alanı : " + kare.alan(6));

Çıktımız şöyle olmalı.

konsol
1
2
3
Yarıçapı 5 olan çemberin alanı : 78.53981633974483
Eni 5 boyu 4 olan dikdörtgenin alanı : 20
Bir kenarı 6 olan karenin alanı : 36

kare.js dosyası aslında fazla kalabalık. İçindeki alan metoduna gerek yok. Direkt kendisini export edebiliriz. Fakat biz başka bir modülle deneme yapalım. Bunun için proje1 klasörü içinde node_modules klasörü ve içinde de elips.js dosyası oluşturalım.

proje1/node_modules/elips.js
1
2
3
4
var PI = Math.PI;
module.exports = function (a, b) {
  return PI * a * b;
}

index.js dosyamızı güncelleyelim. Son hali :

proje1/index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// console.log("node.js çalıştı");
var cember = require("./cember"); // cember modülünü çağır

console.log("Yarıçapı 5 olan çemberin alanı : " + cember.alan(5));

var dikdortgen = require("./lib/dikdortgen");

console.log("Eni 5 boyu 4 olan dikdörtgenin alanı : " + dikdortgen.alan(5,4));

var kare = require("kare");

console.log("Bir kenarı 6 olan karenin alanı : " + kare.alan(6));

var elips = require("elips");

console.log("Eksenleri 5 ve 4 olan elipsin alanı : " + elips(5, 4));

Çıktımız şöyle olmalı.

konsol
1
2
3
4
Yarıçapı 5 olan çemberin alanı : 78.53981633974483
Eni 5 boyu 4 olan dikdörtgenin alanı : 20
Bir kenarı 6 olan karenin alanı : 36
Eksenleri 5 ve 4 olan elipsin alanı : 62.83185307179586

Görüldüğü üzere elips sınıfını doğrudan export ettik ve kullanırken de elips(5,4) şeklinde kullandık. Tabii bu sadece tek dönüş (return) olduğu için.

Temel Modül Yapısı

node.js ‘de modüller bir klasör içinde yer alır ve modülün açıklama dosyası package.json dosyası içinde yer alır. Hem bu şekilde daha düzenli olur ve de js dosyası modül adından bağımsız olur. Şimdi gerçek bir modül yapalım.

Bunun için proje1/node_modules klasörü içinde parabol klasörü ve içinde de index.js ile package.json dosyası oluşturalım.

proje1/node_modules/parabol/index.js
1
2
3
4
5
6
module.exports = function(a,b,c) {
  var r = - b/(2 * a);
  var k = a * r * r + b * r + c;

  return "(" + r + "," + k + ")";
}
proje1/node_modules/parabol/package.json
1
2
3
4
5
6
{
  "name": "parabol",
  "version": "0.0.1",
  "description": "Parabolün tepe noktasının koordinatlarını verir",
  "main": "index.js"
}

index.js dosyamızı güncelleyelim. Son hali :

proje1/index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// console.log("node.js çalıştı");
var cember = require("./cember"); // cember modülünü çağır

console.log("Yarıçapı 5 olan çemberin alanı : " + cember.alan(5));

var dikdortgen = require("./lib/dikdortgen");

console.log("Eni 5 boyu 4 olan dikdörtgenin alanı : " + dikdortgen.alan(5,4));

var kare = require("kare");

console.log("Bir kenarı 6 olan karenin alanı : " + kare.alan(6));

var elips = require("elips");

console.log("Eksenleri 5 ve 4 olan elipsin alanı : " + elips(5, 4));

var parabol = require("parabol");

console.log("f(x)=2x^2+8x+3 şeklindeki parabolün tepe noktası : " + parabol(2, 8, 3));

Çıktımız şöyle olmalı.

konsol
1
2
3
4
5
Yarıçapı 5 olan çemberin alanı : 78.53981633974483
Eni 5 boyu 4 olan dikdörtgenin alanı : 20
Bir kenarı 6 olan karenin alanı : 36
Eksenleri 5 ve 4 olan elipsin alanı : 62.83185307179586
f(x)=2x^2+8x+3 şeklindeki parabolün tepe noktası : (-2,-5)

Kodlar

Dersimizdeki örnek kodları https://github.com/onokumus/node-ders adresinden inceleyebilirsiniz.

Comments