- Node.js'in ne olduğunu ve tarayıcıdaki JavaScript'ten farkını açıklamak
npmile proje oluşturmak, paket kurmak vepackage.jsoniçindeki betikleri çalıştırmak- ES modüllerini ve yerleşik
fs/promises,path,processmodüllerini dosyalar ve komut satırı argümanlarıyla çalışmak için kullanmak
2009'a kadar JavaScript yalnızca tarayıcıların içinde yaşıyordu. O yıl Ryan Dahl, Chrome'un V8 motorunu alıp Node.js'i tanıttı: JavaScript'i sunucularda ve sıradan bilgisayarlarda çalıştıran bir ortam. Bugün Node.js'te backend'ler (API'ler), komut satırı araçları ve hatta masaüstü uygulamaları çalışıyor: Vite, ESLint ve Prettier Node.js üzerinde çalışır, VS Code editörü ise Node.js tabanlı Electron ile yapılmıştır.
Node.js nedir
Node.js = V8 motoru + libuv (olay döngüsü ve asenkron girdi/çıktı) + yerleşik modüller (fs, path, http, crypto ve diğerleri). Dil aynı, ortam farklı: document ya da window yoktur, ama dosyalar, ağ ve süreçler vardır. JavaScript kodun yine tanıdık olay döngüsüyle tek bir iş parçacığında çalışır, ağır girdi/çıktıyı ise sistem arka planda yapar.
| Tarayıcı | Node.js | |
|---|---|---|
| DOM | var (document) | yok |
| Dosyalar | yalnızca kullanıcı seçerse | tam erişim (fs) |
| Global nesne | window / globalThis | global / globalThis |
| Modüller | ES modülleri | ES modülleri ve CommonJS |
| Kod nerede çalışır | kullanıcının cihazında | bir sunucuda ya da kendi bilgisayarında |
- 1Kur
nodejs.org sitesinden LTS (uzun süreli destek) sürümünü indir ve kur.
- 2Kontrol et
Bir terminalde
node -vvenpm -vyaz; sürümler görünmeli. - 3Bir dosya oluştur
hello.jsadlı bir dosyayaconsole.log('Hello from Node!');yaz. - 4Çalıştır
node hello.js. Dosyasıznodeetkileşimli bir konsol (REPL) açar; çıkmak için.exit.
Modüller: ES ve CommonJS
Node.js'te iki modül sistemi vardır. CommonJS (require ve module.exports) tarihsel olanıdır ve eski projelerde her yerdedir. ES modülleri (import/export) ise tarayıcıdakiyle aynı olan standarttır. Yeni projelerde ES modüllerini seç: package.json'a "type": "module" ekle ya da dosyalara .mjs uzantısı ver. Yerleşik modülleri node: önekiyle içe aktar: import fs from 'node:fs'.
// math.js
export const PI = 3.14159;
export function circleArea(r) {
return PI * r * r;
}
// app.js
import { circleArea } from './math.js';
import os from 'node:os';
console.log(circleArea(2).toFixed(2));
console.log(`Platform: ${os.platform()}`);12.57 Platform: win32
node app.js ile çalıştırıldı; Windows'ta win32, macOS'ta darwin, Linux'ta linux görünür.| CommonJS | ES modülleri | |
|---|---|---|
| Dışa aktarma | module.exports = { circleArea } | export function circleArea() {} |
| İçe aktarma | const { circleArea } = require('./math') | import { circleArea } from './math.js' |
| Dosyanın klasörü | __dirname | import.meta.dirname |
En üst düzeyde await | yok | var |
npm ve package.json
npm (Node Package Manager), Node.js ile birlikte gelir ve milyonlarca paketin bulunduğu bir kayıt deposuna erişim sağlar. npm init -y bir package.json oluşturur, npm install dayjs bir bağımlılık, npm install -D vitest ise yalnızca geliştirme için bir bağımlılık ekler. Paketlerin kodu node_modules klasörüne gider, package-lock.json ise tam sürümleri kaydeder. npm run dev, scripts bölümündeki bir komutu çalıştırır; npx ise bir paketin komutunu global kurulum yapmadan çalıştırır.
{
"name": "notes-cli",
"version": "1.0.0",
"type": "module",
"scripts": {
"start": "node notes.js",
"test": "vitest"
},
"dependencies": {
"dayjs": "^1.11.10"
},
"devDependencies": {
"vitest": "^2.1.0"
}
}major.minor.patch biçimindedir: ^1.11.10, 2.0.0'ın altındaki her yeni sürüme, ~1.11.10 yalnızca 1.11.x yamalarına, 1.11.10 ise yalnızca o sürüme izin verir.Dosyalar, yollar ve süreç
node:fs/promises, dosyalar için asenkron fonksiyonlar sunar: readFile, writeFile, mkdir, readdir. node:path, yolları hem Windows'ta (\) hem Linux ve macOS'ta (/) doğru kurar. process.argv komut satırı argümanlarını, process.env ise ortam değişkenlerini tutar. Aşağıdaki küçük program notları bir JSON dosyasında saklar.
// notes.js
import { readFile, writeFile, mkdir } from 'node:fs/promises';
import path from 'node:path';
const dir = path.join(import.meta.dirname, 'data');
const file = path.join(dir, 'notes.json');
await mkdir(dir, { recursive: true });
let notes = [];
try {
notes = JSON.parse(await readFile(file, 'utf8'));
} catch (error) {
if (error.code !== 'ENOENT') throw error;
}
const text = process.argv.slice(2).join(' ') || 'Empty note';
notes.push({ id: notes.length + 1, text });
await writeFile(file, JSON.stringify(notes, null, 2));
console.log(`Saved note #${notes.length}: ${text}`);
console.log('File:', path.basename(file), '| notes:', notes.length);Saved note #1: Buy bread File: notes.json | notes: 1 Saved note #2: Call Leyla File: notes.json | notes: 2
node notes.js Buy bread, sonra node notes.js Call Leyla çalıştırıldı. ENOENT “böyle bir dosya yok” demektir; ilk çalıştırmada bu normaldir.Node.js'te bir web sunucusu kurmak için kütüphaneye bile gerek yok; yerleşik node:http modülü yeterlidir. Gerçek projelerde genellikle Express ya da Fastify gibi çatılar kullanılır, ama hepsi bu temelin üzerine kuruludur.
// server.js
import http from 'node:http';
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Hello from Node', path: req.url }));
});
server.listen(3000, () => console.log('Server on http://localhost:3000'));Server on http://localhost:3000
http://localhost:3000/api/hello adresini aç; yanıt: {"message":"Hello from Node","path":"/api/hello"}. Sunucuyu durdurmak için terminalde Ctrl+C tuşlarına bas.Burada process.argv, argv değişkeniyle taklit ediliyor. parseArgs(args) fonksiyonunu yaz: --anahtar değer çiftleri { anahtar: 'değer' } olsun, arkasından değer gelmeyen bir bayrak (--verbose) ise true alsın.
const argv = ['node', 'app.js', '--city', 'Baku', '--days', '3', '--verbose'];
function parseArgs(args) {
const options = {};
// walk through args; --key value → options[key] = value, lone --flag → true
return options;
}
console.log(parseArgs(argv.slice(2)));
console.log(parseArgs(['--help']));▸ Beklenen çıktı
{ city: 'Baku', days: '3', verbose: true }
{ help: true }satisfiesCaret(version, range) fonksiyonunu yaz: ^1.4.0 gibi bir aralık için sürümün major numarası aynı olmalı ve aralıktaki sürümden düşük olmamalı (0.x için özel kuralları dikkate alma).
function satisfiesCaret(version, range) {
// compare major, then minor, then patch
}
for (const version of ['1.5.2', '1.4.0', '2.0.0', '1.3.9']) {
console.log(version, satisfiesCaret(version, '^1.4.0'));
}▸ Beklenen çıktı
1.5.2 true 1.4.0 true 2.0.0 false 1.3.9 false
Önemli noktalar
- Node.js = V8 + olay döngüsü (libuv) + yerleşik modüller: DOM'suz, ama dosyalar, ağ ve süreçlerle JavaScript.
- Yeni projelerde ES modüllerini kullan (
"type": "module",node:öneki);requireeski kodlarda kalır. package.jsonprojeyi tanımlar: betikler,dependencies,devDependencies;package-lock.jsonsürümleri sabitler,node_modulescommit edilmez.- Semver,
major.minor.patchbiçimindedir:^minor ve patch güncellemelerine,~yalnızca patch'lere izin verir. fs/promises,pathveprocess; dosyalar, taşınabilir yollar, argümanlar ve ortam değişkenleriyle ilgilenir.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.