Onur Dayıbaşı

CV
none

CJS Modules Nedir ?

Spesification

2009 Node.JS ile birlikte Sunucu içinde içinde Javascript kullanabilme imkanı olduğu ve burada büyük bir potensiyel olduğu düşünüyorlardı. Sonuçta fullstack tek bir dille WebApp sadece JS ile geliştirebilme imkanı ortaya çıkıyordu.

Bu Enterprise ihtiyaçlar yani JS ile daha büyük projeler geliştirebilmek için JS modüllerinin tarayıcıdan farklı bir şekilde kod ile daha standart programatik bir modül loading ihtiyacını doğurdu.

DipNot: Burda tarayıcıların sadece JS çalıştırmasının, PHP, JSP, ASP, Ruby vb dillerin en sonunda Web tarafında uygulamalar için JS, HTML üretiyordu ama Backend giderek standart hale geldi. Controller — Service — Data katmanı ve burdaki mantıklar, REST → GraphQL doğru giderek kod geliştirmekten configurasyon yönetimine döndü. UI ise daha fazla mantıksal işlemin ve bileşenlerin olduğu karmaşık yapılara döndü. Bu durum hem fullstack kavramını hemde JS Web Stack yapılarını oluşturmaya başladı. Hem geliştirici maliyetlerini, hemde bakım maliyetlerini düşürmek patronların daha çok işine gelirdi sonuçta.

Bu aşamada Web Uygulaması geliştirme’de JS inanılmaz bir ivme kazandı. Aynısı Python için yapay zeka ve türevleri için geçerli. Sonuçta Python yapay zeka projesi yapan bir grup tüm teknoloji stack Python üzerine yapıp, Web uygulamasınıda Python geliştirebilir

Kevin Dangoor “What Server Side JavaScript needs” blog yazısında gelecekte bir ekosistem oluşturmak için gereken gereksinimleri bir öneri yazısında topladı.

  • Cross-interpreter standard library, JS çalıştırıcıları ( Rhino, Spidermonkey, V8 and JSCore) ortak kullandığı standart kütüphanelerin oluşturulması.
  • Standard arayüzler
  • Modüllerin birbirlerini içermesi için standartlar
  • Kod paketleme , versiyonlama standartları
  • Package repository (NPM gibi)

NPM Modules 2 blog yazım. JS ekosistemin oluşması için en önemli merkezi oluşturur. Bu konuda daha detaylı bilgi almak isterseniz Modules 2 yazısını okuyarak Modül Kavramına devam edebilirsiniz.

Biz bu kısımda Modüllerin birbirlerini içermesi için standartların ne olduğuna bakarsak; CommonJS aşağıdaki gibi loading mekanizmasının kurulması ve sunucu tabanlı tasarım mantığını hedeflediğini görebiliriz.

  • import : require() metodu
  • export: module.exports objesi

Basit bir örnekle açıklamak gerekirse. require(aws-sdk) ile modül bağlantısı kurup dışarıyada module.exports = { purgeQueue} dışarıya hizmet sunan fonksiyonlar oluşturuyoruz. Tüm yapı bunun üzerine kurulu.

AWS-SQS fonksiyon çağırma

Burda require işlemi nasıl çalışıyor. Require aslında bir fonksiyon ve sync load işlemi gerçekleştiriyor. İlk başta da bahsettiğim gibi Node local dosya sistemindeki JS erişmesi gerektiği için Async ihtiyaçlar bu aşamada birincil öncelik değil.

  • Module._LOAD : Öncelikle cache bakıyor. Yoksa module oluşturma işlemine geçiyor dosyayı yüklüyor ve MODULE._COMPILE fonksiyonunu çağırıyor. IIFE gibi bir scope wrapper(kaplayıcı) fonksiyon oluşturuyor ve module.exports return ediyor. Aslında mekanizmalar aynı sadece spesifikasyonu belirleyip bu kısmı insanlardan soyutluyorlar ve geliştiricilerin bunları düşünmesine gerek kalmıyor.

CommonJS Require

Wrapper fonksiyon aşağıdaki gibi

Require Wrapper Fonksiyon

Referanslar