Node.js’te __dirname Kullanımı ve Dosya Yolu Yönetimi
Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde Node.js projelerinde dosya yollarını ortamdan bağımsız ve hatasız yönetmeyi öğreneceksiniz.
__dirname değişkeninin mantığı, process.cwd() farkı ve ES Modules karşılığı sade şekilde ele alınır.
Teknik Özet
- Konu: Node.js
__dirnameve dosya yolu yönetimi - Amaç: Dosya bulunamadı hatalarını kalıcı olarak önlemek
- Çözülen Problem: Farklı dizinlerden çalıştırıldığında bozulan yollar
- Kapsam: CommonJS, ES Modules,
pathmodülü
__dirname Nedir ve Neden Önemlidir?
__dirname, bulunduğu JavaScript dosyasının fiziksel klasör yolunu döndürür.
Komutun nereden çalıştırıldığına bağlı değildir.
Örnek dosya yolu:
/home/rabisu/proje/app.js
go
__dirname çıktısı:
/home/rabisu/proje
yaml
Bu özellik, yapılandırma dosyaları ve statik varlıklar için güvenilir referans sağlar.
Kritik Fark: __dirname vs process.cwd()
Bu iki kavram sıkça karıştırılır.
-
__dirname
Dosyanın bulunduğu klasörü gösterir.
Değişmez ve sabittir. -
process.cwd()
Node.js sürecinin başlatıldığı dizini gösterir.
Terminal konumuna göre değişir.
Örnek senaryo:
node ./src/app.js
1. process.cwd() → proje ana dizini
2. __dirname → src klasörü
- Dosya içi kaynaklara erişirken daima __dirname kullanılmalıdır.
path Modülü ile Güvenli Yol Oluşturma
- Dosya yollarını string birleştirme ile oluşturmayın.
// Yanlış
const yol = __dirname + '/veriler/ayar.json';
Doğru yaklaşım:
const path = require('path');
const yol = path.join(__dirname, 'veriler', 'ayar.json');
- Bu yöntem Windows ve Linux uyumluluğunu garanti eder.
path.join() ve path.resolve() Farkı
- path.join()
- Parçaları güvenli şekilde birleştirir.
- path.resolve()
- Her zaman mutlak (absolute) yol üretir.
- Dosya bazlı işlemlerde __dirname + path.join() tercih edilmelidir.
- ES Modules (ESM) Ortamında __dirname
- ES Modules kullanıldığında __dirname varsayılan olarak yoktur.
ReferenceError: __dirname is not defined
Standart çözüm:
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const configYolu = join(__dirname, 'config', 'rabisu.json');
- Bu yöntem standartlara uygundur ve güvenle kullanılabilir.
Pratik Kullanım Senaryoları
Yapılandırma Dosyası Yükleme
const fs = require('fs');
const path = require('path');
const configYolu = path.join(__dirname, 'config', 'sunucu-ayarlari.json');
const ayarlar = JSON.parse(fs.readFileSync(configYolu, 'utf8'));
- Uygulama nereden başlatılırsa başlatılsın doğru dosya yüklenir.
Log Dizini Yönetimi
const fs = require('fs');
const path = require('path');
const logDizini = path.join(__dirname, 'loglar');
fs.mkdirSync(logDizini, { recursive: true });
fs.appendFileSync(
path.join(logDizini, 'app.log'),
'Sunucu başlatıldı.\n'
);
- PM2, systemd ve CI ortamlarında tutarlı davranır.
Sıkça Sorulan Sorular
1. __dirname Windows ve Linux’ta aynı mı çalışır? Mantık aynıdır, ayraç farkını path.join() çözer.
2. Neden process.cwd() yeterli değil? Çalışma dizini değişebilir, dosya yolları bozulur.
3. Frontend tarafında __dirname kullanılır mı? Hayır. Sadece Node.js sunucu ortamında vardır.
4. Bundler’lar (Vite, Webpack) bunu nasıl ele alır? Derleme sırasında dönüştürürler, runtime dosya sistemi yoktur.
Sonuç
__dirname, Node.js projelerinde dosya yolları için en güvenilir referanstır. ES Modules karşılığını bilmek, modern projelerde hata riskini azaltır. path modülü ile birlikte kullanıldığında uygulamalar taşınabilir olur.
Bu yaklaşımı Rabisu Bulut altyapısındaki Node.js projelerinde güvenle uygulayabilirsiniz.