Herkese merhaba, önceki derste modüllerin ne olduğunu ve nasıl oluşturulacağını öğrendik . Bu ders modül ile daha derine inecek, hangi özellikleri taşıdığını anlayacak ve ardından export hakkında ayrıntılı olarak konuşacaktır. Hadi başlayalım.

Modülün Özellikleri

Nodejs projesindeki her javascript dosyası ayrı bir modüldür ve bir global modül nesnesi içerir. Giriş yapıp içinde ne olduğunu görmeye çalışalım. index.js'ye gidin ve şu kodu ekleyin:

console.log(module);

Bu, modül hakkındaki bilgileri günlüğe kaydedecektir. Özelliklerini kısaca anlayalım:

  • filename  - dosyanın tam adı
  • id - genellikle dosyanın ayrıntılı bir yolunu içerir. Bir işlem / dosya sistemi sembol bağlantılarını destekliyorsa, bu tüm sembol bağlantılarının çizileceği anlamına gelir.
  • exports  - dışarıya giden tüm bilgiler. Son dersimizde bunun hakkında konuştuk.
  • parent - bir üst modüle bağlantı, yani bunu gerektiren modül.
  • loaded - bir modülün yüklenip yüklenmediğini gösterir. Modül bir konsola taşındığında henüz işlenmemiştir.
  • children - bu modül tarafından zorunlu olarak bağlanan modüller.
  • path - bir tür iç kimlik.

Modül, bu özellikleri kullanarak kendini takip eder. Tüm bu mülklerin kendi önemi vardır, ancak şu anda iki parametreyle ilgileniyoruz:  parent ve  export. Bunlardan bahsedelim.

Parent Property Nedir? Nasıl Kullanılır?

Nodejs'deki bir dosya, node filename.js çağrısı yapılarak doğrudan çalıştırılabilir veya belirli bir işlevi diğerine aktaran bir modül olarak çalışabilir.

Dosyamızın hangi modda çalıştığını kontrol etmek için module.parent kullanabiliriz. module.parent === true  , bir ebeveynin bu dosyayı require ('./ filename.js) kullanarak çağırdığı  ve eğer  yanlışsa, o zaman doğrudan node filename.js tarafından çalıştırıldığı anlamına gelir. 

Bu kontrolü kullanarak, programa kodun nasıl yürütüldüğüne bağlı olarak iki farklı şey yapmasını söyleyebiliriz. Aşağıdaki örnekte,  bir modül olarak çalışıyorsa ve bir üst dosyada çağrılıyorsa, run () işlevini dışa aktaracağız  . Aksi takdirde, sadece fonksiyonu çalıştıracağız.

var user = require('./user');  
  
function run() {  
    var tim = new user.User("Tim");  
    var tom = new user.User("Tom");  
  
    tim.hello(tom);  
}  
  
if (module.parent) {
    // used with require(./user);
    exports.run = run;  
} else {
    // ran with node user.js
    run();  
}

Bir üst modül yoksa, bu özelliği kullanarak bu dosyayı bağımsız olarak çalıştırabiliriz. Şimdi exports bahsedelim.

Exports Nedir? Nasıl Kullanılır?

Bir Nodejs uygulaması oluştururken, uygulamanızın yapı taşları haline gelecek birçok modül oluşturmanız gerekecektir. Bunları nasıl export edeceğinizi anlamanız ve gerektiği yerde kullanmanız gerekir.

module.exports  , başka bir program veya modülde  "gerekli" olduğunda geçerli modülün döndürdüğü bir nesnedir . Başka bir modülün içe aktarması ve kullanması için değerler veya işlevler gibi bir şeyin mevcut olmasını istediğimizde, bu değeri veya işlevi bu modülle ekleriz.

Misal:

Bir modülden birkaç özelliği dışa aktarın:

// ./moduleOne.js
const firstName = "Shad";
const lastName = "Mirza";

function getFullName (){
    return firstName + lastName;
}

module.exports.firstName = firstName;
module.exports.lastName = lastName;
module.exports.getFullName = getFullName;

Başka bir modülde isteyin ve kullanın:

// ./moduleTwo.js
const name = require('./moduleOne');

console.log(name.firstName);
console.log(name.lastName);
console.log(name.getFullName);

Bir modülün değişkenlerini ve yöntemlerini benzer şekilde diğerinde kullanabiliriz.

 Module.exports yerine export kullanabilir ve aynı işlevselliği elde edebiliriz. Bunu daha uzun yöntemin bir kısaltması olarak düşünebilirsiniz. Örnek, bu tamamen iyi çalışacaktır:

// ./moduleOne.js
const firstName = "Shad";
const lastName = "Mirza";

function getFullName (){
    return firstName + lastName;
}

exports.firstName = firstName;
exports.lastName = lastName;
exports.getFullName = getFullName;

Oysa mülkleri doğrudan dışa aktarmaya atarsanız, işe yaramaz:

exports = firstName;

Bunun nedeni, exportun bir nesne olması ve ona özellikler atamamızdır. Bu özellikler daha sonra başka bir modüle aktarılır. Doğrudan dışa aktarımın kendisine atayarak, istenen işlevselliği bozacak bu özelliği yeniden başlattık.

Export bir olarak kabul edilebilecek module.exports başka adı daha az kod yazmak. Bunun gibi bir şey hayal edin:

exports = module.exports = {}

Not: Lütfen module.exports'u returning ettiğimizi unutmayın.

Bir sonraki aşamamız projeye bir veri tabanı eklemek olacaktır.

Veritabanına Bağlan

Bir db  dizini oluşturalım  ve JSON dosyamızı içine taşıyalım. Db (en.json) ile bağlanmak ve JSON dosyasından cümleleri almak için yardımcı bir modül olacak bir i ndex.js  dosyası ekleyin .

// ./db/index.js

var phrases;
exports.connect = function() {
    phrases = require('./en');
};

exports.getPhrase = function(name) {
    if (!phrases[name]) {
        throw new Error("There is no such a phrase: " + name);
    }
    return phrases[name];
};

Veritabanına bağlanmak için connect () yöntemine ve  verileri almak için getPhrase yöntemine sahip bir db modülü oluşturduk  . Bu yöntem ilgili bir cümle döndürecektir, ancak değilse - bir hata gösterecektir.

Şimdi bu modülü user / index.js'de kullanalım. 

var db = require('./db');

function User(name){
    this.name = name;
}

User.prototype.hello = function(who){
    console.log(db.getPhrase("Hello") + ", " + who.name);
};

console.log("user is required!");

module.exports = User;

en.json gerektiren  ifadeyi db.js  ile  değiştirdik  ve ardından db.getPhrase  yöntemini kullanarak günlükleme ifadesini kullandık  .

İlk önce veritabanına bağlanmadıkça bu işe yaramaz. index.js'ye gidin :

var db = require('../db');
db.connect();

var User = require('./user');

function run() {
    var tom = new User("Tom");
    var tim = new User("Tim");

    tom.hello(tim);

    console.log(db.getPhrase("Run successful"));
}

if (module.parent) {
    exports.run = run;
} else {
    run();
}

Bir modül ilk çalıştırıldığında başlatılır. Bu,  veritabanına bağlanmak için connect () çağırdığımız  zamandır ( bizim durumumuzda JSON dosyası). Bundan sonra veritabanındaki her şeyi istediğimiz gibi kullanabiliriz.

 Veritabanımıza bağlanmak için  index.js kullanıyoruz . Bu bir sunucunun görevi gibi görünüyor. Tüm mantığı bir server.js dosyasına  taşıyalım ve ardından aşağıdaki gibi root index.js'ye aktaralım :

var server = require('./server');

server.run();

Module kullanarak veri tabanına başarıyla bağlandık. Şimdi modüllerin nasıl arandığından ve Modül Önbelleğe Alma  (Module Caching) ile ne ilgisi olduğundan bahsedelim .

Modül Önbelleğe Alma ( Module Caching)

Tüm modüller, gerektiğinde bazı boş özelliklerle somutlaştırılır. Bizim bağlanma işlevimiz, null yerine en.json ile cümleleri başlatıyor .

 Tekrar db'ye ihtiyacımız olursa ne olacağını düşünüyorsunuz  ?

Nesneyi yeniden başlatacağını düşünebilirsiniz, ancak olan bu değildir. Aynı modülü farklı bir konumda zorunlu kılmak, farklı örnekler oluşturmaz, ancak ilk kez başlatılanı kullanır. Modül Önbelleğe Alma dediğimiz şey budur  .

Modül, ilk gereksinim ifadesi sırasında önbelleğe alınır, yani bu nesnenin yalnızca bir örneği oluşturulur - diğer modüllerdeki sonraki gereksinim ifadeleri yalnızca aynı nesneye erişmemizi sağlar.

Bu, db nesnesindeki değişikliklerin , sunucuya ve ardından kullanıcı modülüne db'yi içe aktarmaya çalışırken devam edeceği anlamına gelir . Aynı kullandığınız db nesnesi hem de server.js ve sonra kullanıcı / index.js

Ne öğrendik

Bu derste öğrendik

  • Module nesnesinin özellikleri hakkında
  • Ana mülk nedir ve nasıl kullanılır
  • İhracat Nedir
  • İşlevler nasıl dışa aktarılır ve başka bir modülde kullanılır
  • Veritabanına nasıl bağlanılır (JSON dosyası)
  • Modül Önbelleğe Alma nedir
  • Şimdilik bu kadar, geliştirme ile ilerlerken modüller hakkında daha fazla konuşacağız. Bir sonraki dersimiz Node Package Manager (NPM) hakkında olacak .

    Bu  GitHub deposundaki bu dersin kaynak koduna göz atın.

    Kaynak : https://blog.soshace.com/2-node-js-lessons-modules-part-2/