Menu

Node.js module.exports ve exports Farkı, Örneklerle

module.exports, bir CommonJS dosyasının kendisini require() ile yükleyen dosyaya verdiği değerdir. exports ise sen onu yeniden atayana kadar aynı nesneyi gösteren bir kısayoldur.

Bu sayfada çalıştırılabilir editörler var. Düzenle, çalıştır ve sonucu anında gör.

module.exports, bir Node.js dosyasının onu require() ile yükleyen her dosyaya verdiği değerdir. Boş bir nesne olarak başlar: birden fazla şeyi export etmek için ona property ekle, tek bir şeyi export etmek için ona yeni bir değer (bir fonksiyon, bir class) ata. exports aynı nesneyi gösteren kısaltma bir değişkendir; bu yüzden exports.add = ... çalışır, ama exports = ... bağı koparır ve hiçbir şey export etmez.

Program 5 20 3.14159, ardından [ 'add', 'multiply', 'PI' ] yazdırdı. math.js içindeki üç satırın üçü de, module.exports üzerinden de gitse exports üzerinden de gitse, aynı nesneye property ekledi ve require('./math') o nesneyi döndürdü.

Fonksiyon, class ya da nesne export etmek

Bir modülün tek bir ana parçası varsa onu doğrudan module.exports'a ata. Çağıran taraf o zaman etrafında bir nesne değil, fonksiyonun kendisini alır:

Program Hello, Ada ve Grace (user) yazdırdı. TypeError: greet is not a function görürsen çağıran taraf yanlış şekli kullanmıştır: nesne property'si için const { greet } = require(...), atanmış bir değer için const greet = require(...) yaz.

module.exports ve exports: yeniden atama tuzağı

Dosyan çalışmadan önce Node.js exports = module.exports atamasını yapar. İki isim de tek bir nesneyi gösterir ve require, module.exports'u döndürür. exports'a yeni bir değer atamak yalnızca yerel değişkeni değiştirir:

broken.js, {} export etti, çünkü exports artık hiçbir şeyin döndürmediği yeni bir nesneyi gösteriyor. working.js ise { version: 2 } export etti.

YazdığınExport edilir mi?
module.exports.x = 1Evet
exports.x = 1Evet, aynı nesne
module.exports = { x: 1 }Evet, nesnenin yerini alır
exports = { x: 1 }Hayır, değer kaybolur

En basit kural: her zaman module.exports yaz. Her durumda çalışır ve kod ne yaptığını açıkça söyler.

require aynı cache'lenmiş nesneyi döndürür

Node.js bir modülün kodunu yalnızca bir kez, ilk require edildiğinde çalıştırır ve module.exports'u cache'ler. Aynı dosyanın sonraki her require'ı aynı nesneyi döndürür, yani bir modülün içindeki state onu yükleyen her dosya tarafından paylaşılır:

counter.js is running bir kez göründü, b.next() 3 döndürdü ve a === b ifadesi true'dur, çünkü cache anahtarı çözümlenmiş dosya yoludur ve ./counter ile ./counter.js aynı dosyaya çözümlenir. Bir modülde oluşturulan veritabanı bağlantısının ya da config nesnesinin tüm uygulamada paylaşılmasının nedeni budur.

module.exports ve ES modules

ES modules bunun yerine export ve import kullanır. İki biçim birbirine şöyle karşılık gelir:

// CommonJS                              // ES modules
module.exports = greet;                  export default greet;
module.exports.add = add;                export { add };
const greet = require('./greet');        import greet from './greet.js';
const { add } = require('./math');       import { add } from './math.js';

Bir ES module, bir CommonJS dosyasını import edebilir: o dosyanın module.exports'u default import olarak gelir. Node.js 22.12'den beri require(), top-level await içermeyen bir ES module'ü de yükleyebilir. Hangisini ne zaman seçeceğin için CommonJS vs ES modules sayfasına bak.

Sık yapılan hatalar

Bir dosyada exports.x ile module.exports = ...'u karıştırmak. Atama nesnenin yerini alır, bu yüzden ondan önce yazılan her exports.x kaybolur. Her dosyada tek bir stil seç.

Sonradan değişen bir değeri export etmek. module.exports = { count } sayıyı yükleme anında kopyalar; modül count'u güncellediğinde çağıranlar hâlâ eski değeri görür. Yukarıdaki counter.js gibi, değeri döndüren bir fonksiyon export et.

./'ı unutmak. require('math') dosyanın yanındaki math.js'i değil, node_modules içinde bir paketi arar. Yerel dosyalar her zaman ./ ya da ../ ile başlar.

Sıkça Sorulan Sorular

Aynı dosyada module.exports ve export kullanabilir miyim?

Hayır. Bir dosya ya CommonJS'tir (require, module.exports) ya da ES module'dür (import, export). Node.js buna uzantıya (.cjs ya da .mjs) veya package.json içindeki "type" alanına bakarak karar verir.

require neden boş bir nesne döndürüyor?

Genellikle modül module.exports = ... yerine exports = ... yazmıştır ya da iki modül birbirini require ediyordur. Döngüsel bir require'da modüllerden biri, diğerinin module.exports'unu o dosya çalışmayı bitirmeden alır.

require'da .js uzantısı gerekli mi?

Hayır. require('./math') önce ./math'i, sonra ./math.js, ./math.json ve ./math.node'u, ardından içinde index.js olan bir ./math klasörünü dener. ES module import'unda ise uzantı zorunludur.

require'ın cache'lediği bir modülü nasıl yeniden yüklerim?

Kaydını delete require.cache[require.resolve('./math')] ile sil ve onu tekrar require et. Bu çoğunlukla testlerde ve geliştirme araçlarında işe yarar; uygulama kodu buna güvenmemeli.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

Başla