Node.js module.exports'un amacı nedir ve nasıl kullanılır?


1432

Node.js module.exports'un amacı nedir ve nasıl kullanılır?

Bu konuda herhangi bir bilgi bulamıyorum, ancak kaynak kodunda sık sık gördüğüm gibi Node.js oldukça önemli bir parçası gibi görünüyor.

Göre node.js belgelerinde :

modül

Akıma bir referans module. Özellikle module.exports ihracat nesnesi ile aynıdır. Daha src/node.jsfazla bilgi için bakınız .

Ama bu gerçekten yardımcı olmuyor.

Tam olarak module.exportsne işe yarar ve basit bir örnek ne olurdu?

Yanıtlar:


1590

module.exports bir nesnenin sonucu olarak döndürülen nesne require çağrının .

exportsDeğişken başlangıçta aynı nesneye ayarlanır böylece modül kodunda, (yani bu bir kısaltmadır "takma" var) yapacağınız Genelde böyle yazma şey:

let myFunc1 = function() { ... };
let myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;

dahili olarak kapsamlandırılmış işlevleri dışa aktarmak (veya "göstermek") myFunc1vemyFunc2 .

Ve arama kodunda şunları kullanırsınız:

const m = require('./mymodule');
m.myFunc1();

son satırın sonucunun nasıl require (genellikle) özelliklerine erişilebilen düz bir nesne olduğunu gösterir.

Not: Üzerine yazarsanız exports, artık referans vermez module.exports. Dolayısıyla, yeni bir nesne (veya işlev başvurusu) exportsatamak istiyorsanız, bu yeni nesneyimodule.exports


exportsNesneye eklenen adın, eklediğiniz değer için modülün dahili kapsamdaki adıyla aynı olması gerekmediğini belirtmek gerekir, bu nedenle:

let myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required

bunu takiben:

const m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName

119
İyi cevap - Bana öyle geliyor ki '
maruziyetler

2
@ApopheniaOverload - bir dosyadan birden fazla açıkta kalan yöntem için "export.func1, export.func2, etc" yapabilirsiniz.
hellatan

73
Modül gereksinimi var olmalıdır m = requir ('./ mymodule'); , nokta ve eğik çizgi ile. Bu şekilde Node.js yerel bir modül kullandığımızı bilir.
Gui Premonsa

7
Kullandığınızdan emin olun: requir ('./ module_name') sözdizimi, bazı ada sahip başka bir node.js modülü olabilir ve kendi modülünüzü seçmek yerine node.js ile yüklü olanı alır.
Sazid

3
@UpTheCreek, bir modül tarafından 'dışa aktarıldı' olarak ortaya çıkarılan, birçok programlama sistemi ve onlarca yıl öncesine dayanan halka açık sembollere gönderme yapma geleneği vardır. Bu, Düğüm geliştiricileri tarafından icat edilen yeni bir terim değildi.
Mark Reed

218

Bu zaten cevaplandı ama biraz açıklama eklemek istedim ...

Her ikisini birden exportsve module.exportsuygulamanıza aşağıdaki gibi kod almak için kullanabilirsiniz :

var mycode = require('./path/to/mycode');

Göreceğiniz temel kullanım örneği (örn. ExpressJS örnek kodunda), exports.js dosyasındaki nesne üzerindeki özellikleri daha sonra kullanarak içe aktarmanızdır.require()

Basit bir sayım örneğinde şunları yapabilirsiniz:

(Counter.js):

var count = 1;

exports.increment = function() {
    count++;
};

exports.getCount = function() {
    return count;
};

... sonra uygulamanızda (web.js veya gerçekten başka bir .js dosyası):

var counting = require('./counter.js');

console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2

Basit bir ifadeyle, gerekli dosyaları tek bir nesneyi döndüren işlevler olarak düşünebilir ve onları ayarlayarak döndürülen nesneye özellikler (dizeler, sayılar, diziler, işlevler, herhangi bir şey) ekleyebilirsiniz. exports .

Bazen bir require()çağrıdan döndürülen nesnenin , yalnızca özelliklere sahip bir nesne yerine, çağırabileceğiniz bir işlev olmasını istersiniz. Bu durumda, ayrıcamodule.exports , :

(Sayhello.js):

module.exports = exports = function() {
    console.log("Hello World!");
};

(App.js):

var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"

İhracat ve modül.exports arasındaki fark bu cevapta daha iyi açıklanmaktadır .


nasıl aramak için bazı kök klasör benim gibi olmayan diğer klasörden bazı modül gerektirir?
Igal

@ user301639, dosya sistemi hiyerarşisinde geçiş yapmak için göreli yolları kullanabilirsiniz. requireyürüttüğünüz klasöre göre başlar node app.js. Daha net bir yanıt almak için açık kod + klasör yapısı örnekleriyle yeni bir soru göndermenizi öneririm.
Jed Watson

1
Modülünüzü değiştirmek zorunda kaldım. dosya: var sayHello = require('./ex6_module.js'); console.log(sayHello());ve modül:module.exports = exports = function() { return "Hello World!"; }
Jason Lydon

1
Artış örneğini gerçekten iyi buldum ve bunu ihracatla yaptığım şeyle aşırı yüklendiğimde zihnimi yenilemek için kullandım.
munkee

module.exports = exports = function(){...}ikincisi exportssadece bir değişken değil mi? Başka bir deyişle,module.exports = abc = function()
Jeb50

60

NodeJS modül mekanizmasının RequireJS gibi diğer birçok uygulamada desteklenen SpJut modüllerine dayandığını , ayrıca SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js ve hatta Adobe Photoshop ( PSLib aracılığıyla ) ). Bilinen uygulamaların tam listesini burada bulabilirsiniz .

Modülünüzün kullanım düğüm belirli özellikleri veya modül sürece, ben çok kullanarak o teşvik exportsyerine module.exports standart CommonJS parçası olmadığı ve sonra çoğunlukla diğer uygulamaları tarafından desteklenmemektedir.

Başka bir NodeJS'ye özgü özellik, exportsbu iş parçacığında Jed Watson tarafından sağlanan son örnekte olduğu gibi, yalnızca özellikler ve yöntemler eklemek yerine yeni bir nesneye başvuru atamanızdır . CommonJS modülleri mekanizmasının dairesel referans desteğini bozduğundan, bu uygulamayı kişisel olarak caydırırım. Daha sonra tüm uygulamalar tarafından desteklenmez ve daha evrensel bir modül sağlamak için Jed örneği bu şekilde (veya benzer bir şekilde) yazılmalıdır:

(Sayhello.js):

exports.run = function() {
    console.log("Hello World!");
}

(App.js):

var sayHello = require('./sayhello');
sayHello.run(); // "Hello World!"

Veya ES6 özelliklerini kullanma

(Sayhello.js):

Object.assign(exports, {
    // Put all your public API here
    sayhello() {
        console.log("Hello World!");
    }
});

(App.js):

const { sayHello } = require('./sayhello');
sayHello(); // "Hello World!"

Not: Appcelerator ayrıca CommonJS modüllerini de uygulamaktadır, ancak dairesel referans desteği olmadan (bkz: Appcelerator ve CommonJS modülleri (önbellek ve dairesel referanslar) )


35

exportsVe / veya yeni bir nesneye referans atarsanız dikkat etmeniz gereken bazı şeyler modules.exports:

1. Orijinal nesneye önceden eklenmiş exportsveya module.exportselbette kaybolan tüm özellikler / yöntemler dışa aktarılan nesne artık başka bir yenisine referansta bulunacağından kaybolur

Bu açıktır, ancak mevcut bir modülün başına dışa aktarılan bir yöntem eklerseniz, yerel dışa aktarılan nesnenin sonunda başka bir nesneye başvurmadığından emin olun

exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object

module.exports.method3 = function () {}; // exposed with method1 & method2

var otherAPI = {
    // some properties and/or methods
}

exports = otherAPI; // replace the original API (works also with module.exports)

2. Yeni bir değerden birine başvurulması exportsveya module.exportsyeni bir değere başvurması durumunda, artık aynı nesneye başvurmazlar

exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object

// method added to the original exports object which not exposed any more
module.exports.method3 = function () {}; 

3. Zor sonuç. Her iki referansı değiştirirseniz exportsve module.exportsmaruz kaldığı API söylemek zor, (benzediğini module.exportskazanır)

// override the original exported object
module.exports = function AConstructor() {};

// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {}; 

29

module.exports özelliği veya export nesnesi, bir modülün uygulama ile nelerin paylaşılması gerektiğini seçmesine olanak tanır

resim açıklamasını buraya girin

Burada module_export'ta bir videom var


18

Program kodunuzu birden fazla dosyaya bölerken, module.exportsdeğişkenleri ve işlevleri bir modülün tüketicisine yayınlamak için kullanılır. require()Kaynak dosyada çağrı karşılık gelen değiştirilirmodule.exports modülünden yüklendi.

Modül yazarken hatırlayın

  • Modül yükleri önbelleğe alınır, yalnızca ilk çağrı JavaScript'i değerlendirir.
  • Bir modülün içinde yerel değişkenleri ve fonksiyonları kullanmak mümkündür, her şeyin dışa aktarılması gerekmez.
  • module.exportsNesne aynı zamanda şu şekilde mevcuttur exportskestirme. Ancak tek bir işlevi döndürürken her zaman kullanın module.exports.

modül ihracat diyagramı

Göre: "Modüller Bölüm 2 - Yazma modülleri" .


9

başvuru linki şu şekildedir:

exports = module.exports = function(){
    //....
}

exportsveya özelliklerimodule.exportsfonksiyonlar veya değişkenler gibi dışarıda gösterilecektir

daha fazla dikkat etmeniz gereken bir şey var: yapma override ihracat .

neden ?

çünkü sadece module.exports referansını dışa aktardığından, özellikleri dışa aktarımlara ekleyebilirsiniz, ancak dışa aktarmaları geçersiz kılarsanız referans bağlantısı bozulur.

iyi örnek :

exports.name = 'william';

exports.getName = function(){
   console.log(this.name);
}

Kötü örnek :

exports = 'william';

exports = function(){
     //...
}

Sadece bir işlevi veya değişkeni göstermek istiyorsanız, şöyle:

// test.js
var name = 'william';

module.exports = function(){
    console.log(name);
}   

// index.js
var test = require('./test');
test();

bu modül yalnızca bir işlevi ortaya çıkarmıştır ve name özelliği dışarıda özeldir.


6

Http, sys gibi node.js dosyasını indirip yüklediğinizde node.js'de bazı varsayılan veya mevcut modüller vardır vb. .

Zaten node.js'de olduklarından, bu modülleri kullanmak istediğimizde, temel olarak içe aktarma modüllerini seviyoruz , ama neden? çünkü zaten düğümde mevcutlar. js. İçe aktarmak onları node.js'den alıp programınıza koymak gibidir. Ve sonra onları kullanıyor.

Oysa İhracat tam tersi, istediğiniz modülü oluştururken, hadi modül addition.js ve node.js içine modül koyarak, bunu dışa aktararak bunu söylüyorlar.

Burada birşey yazmadan önce, hatırlamak module.exports.additionTwo aynıdır exports.additionTwo

Ha, bu yüzden seviyoruz

exports.additionTwo = function(x)
{return x+2;};

Yola dikkat edin

Diyelim ki bir add.js modülü oluşturdunuz,

exports.additionTwo = function(x){
return x + 2;
};

Bunu NODE.JS komut isteminizde çalıştırdığınızda:

node
var run = require('addition.js');

Bunu söyleyerek hata yaparsınız

Hata: module add.js bulunamıyor

Bunun nedeni, node.js işleminin, path'den bahsetmediğimizden, add.js dosyasını kullanamamasıdır. Böylece, NODE_PATH kullanarak yolu ayarlayabiliriz.

set NODE_PATH = path/to/your/additon.js

Şimdi, bu herhangi bir hata olmadan başarıyla çalışmalıdır !!

Bir şey daha, nodejs komut isteminize geri NODE_PATH ayarlayarak ek.js dosyasını da çalıştırabilirsiniz:

node
var run = require('./addition.js');

Burada yolu geçerli dizinde olduğunu söyleyerek sağladığımız için ./bu da başarılı bir şekilde çalışmalıdır.


1
ihracat mı ihracat mı?
rudrasiva86

Yardım için teşekkürler :)
JumpMan

3

Bir modül ilgili kodu tek bir kod birimi içine alır. Bir modül oluştururken, bu, ilgili tüm işlevleri bir dosyaya taşımak olarak yorumlanabilir.

İki işlev içeren bir Hello.js dosyası olduğunu varsayın

sayHelloInEnglish = function() {
  return "Hello";
};
sayHelloInSpanish = function() {
  return "Hola";
};

Bir işlevi yalnızca kodun yardımcı programı birden fazla çağrı olduğunda yazıyoruz.

Diyelim ki işlevin faydasını World.js gibi farklı bir dosyaya yükseltmek istiyoruz, bu durumda bir dosya dışa aktarma module.exports tarafından elde edilebilen resme gelir.

Her iki işlevi de aşağıda verilen kodla dışa aktarabilirsiniz

var anyVariable={
 sayHelloInEnglish = function() {
      return "Hello";
    };
  sayHelloInSpanish = function() {
      return "Hola";
    }; 
}
module.export=anyVariable;

Şimdi bu işlevleri kullanmak için sadece dosya adını World.js içine girmeniz gerekiyor

var world= require("./hello.js");

Teşekkürler Sana yardımcı olduysa lütfen cevabımı kabul et :)
Shantanu Madane

1
Parti arkadaşına biraz geç :)
Ben Taliadoros

@ BenTaliadoros ben de geç olduğunu düşünüyorum ve ben de onun anyVariable nesnesi birçok hata olduğunu düşünüyorum. sayHelloInSpanish yönteminin üstündeki satır noktalı virgül (;) ile bitmemeli ve sayHelloInSpanish = işlevi yanlış olmalıdır. Bu nesne ile ilgili her şey yanlış. cevabını düzenleyeceğim
ilahi

1
düzenleme devre dışı. Bu cevapta alphadogg başka neler düzenledi ??
ilahi

Sadece biçimlendirme. Karşılaşmadığım çılgın es6 şey olmadığı ve emin değilim, o zaman geçerli bir JS değil
Ben Taliadoros

2

Amaç:

Modüler programlama, bir programın işlevselliğini bağımsız, değiştirilebilir modüllere ayırmayı vurgulayan bir yazılım tasarım tekniğidir, böylece her biri istenen işlevin yalnızca bir yönünü yürütmek için gereken her şeyi içerir.

Vikipedi

Modüler / yeniden kullanılabilir kod olmadan büyük bir program yazmanın zorlaştığını düşünüyorum. Düğümlerde, programımızı module.exportsneyle ortaya koyduğumuzu ve oluşturduğumuzu tanımlamak için modüler programlar oluşturabiliriz require.

Bu örneği deneyin:

fileLog.js

function log(string) { require('fs').appendFileSync('log.txt',string); }

module.exports = log;

stdoutLog.js

function log(string) { console.log(string); }

module.exports = log;

program.js

const log = require('./stdoutLog.js')

log('hello world!');

gerçekleştirmek

$ node program.js

Selam Dünya!

Şimdi ./fileLog.js için ./stdoutLog.js dosyasını değiştirmeyi deneyin .


1

Bir modül sisteminin amacı nedir?

Aşağıdaki şeyleri başarır:

  1. Dosyalarımızın şişkinlikten büyük boyutlara çıkmasını sağlar. İçinde örneğin 5000 satırlık kod içeren dosyalara sahip olmak, geliştirme sırasında uğraşmak genellikle zordur.
  2. Endişelerin ayrılmasını sağlar. Kodumuzun birden fazla dosyaya bölünmesi, her dosya için uygun dosya adlarına sahip olmamızı sağlar. Bu şekilde her modülün ne yaptığını ve nerede bulacağını kolayca belirleyebiliriz (hala sizin sorumluluğunuzda olan mantıksal bir dizin yapısı yaptığımızı varsayarak).

Modüllere sahip olmak, kodumuzun daha sürdürülebilir olmasını sağlayan belirli kod bölümlerini bulmayı kolaylaştırır.

O nasıl çalışır?

NodejS aşağıdaki şekilde çalışan CommomJS modül sistemini kullanır:

  1. Bir dosya bir şeyi dışa aktarmak istiyorsa module.exportsözdizimi kullanarak bildirmek zorundadır
  2. Bir dosya bir şey içe aktarmak istiyorsa require('file')sözdizimi kullanarak bildirmek zorundadır

Misal:

test1.js

const test2 = require('./test2');    // returns the module.exports object of a file

test2.Func1(); // logs func1
test2.Func2(); // logs func2

test2.js

module.exports.Func1 = () => {console.log('func1')};

exports.Func2 = () => {console.log('func2')};

Bilmeniz gereken diğer yararlı şeyler:

  1. Modüller önbelleğe alınıyor . Aynı modülü 2 farklı dosyaya yüklerken, modülün sadece bir kez yüklenmesi gerekir. require()Aynı modülde ikinci kez çağrıldığında önbellekten çekilir.
  2. Modüller senkron olarak yüklenir . Bu davranış gereklidir, eğer zaman uyumsuzsa require()hemen alınan nesneye erişemedik .

-3
let test = function() {
    return "Hello world"
};
exports.test = test;

4
Bu, kabul edilen yanıttaki ( return "Hello world"hiçbir fark yaratmayan) ilk snippet'teki gibi bir örnektir , ancak herhangi bir açıklama yapmadan. Lütfen cevaplamadan önce cevabınızın konuya bir şeyler ekleyeceğinden emin olun.
barbsan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.