folder Tahribat.com Forumları
linefolder Html - CSS - XML - JavaScript - Ajax
linefolder [Node.Js] Express'te Paket Yönetimi Ve Kullanışlı Bazı Paketler



[Node.Js] Express'te Paket Yönetimi Ve Kullanışlı Bazı Paketler

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Retro
    by_Tet
    by_Tet's avatar
    Kayıt Tarihi: 22/Mayıs/2012
    Erkek

    Esen olsun. Node.js ile ilgili ufak tefek bilgilerimi fazla uzatmadan ne uzmanlar için ne amatörler için paylaşma kararı aldım. Bu sebeple [Node.js] etiketine sahip tüm konularımı takip edebilirsiniz, ancak tanım açısından ne nedir ne değildir şeklinde bilgilerden ziyade neye benzer, nasıl olmalı bilgileri bulacaksınız. Uzmanlar zaten yazılarımdaki biçok yazıya önceden hakimdir, yeni başlayanlarsa okuduklarından sıkıntı çekebilirler.

    Not: Bilgisayarımın işletim sistemi windowstur. Diğer işletim sisteminde bağlantılar, kurulumlar değişiklik gösterebilir..

    İlk konu: Web İçin Çalışma Ortamı Oluşturmak -  http://www.tahribat.com/forum/nodejs-web-icin-calisma-ortami-olusturmak-221402 

    Başlayalım..

    Npm nedir ne değildir çok fazla bahsetmeyeceğim, tanım yapmayacağım. Ancak kısaca node.js ile beraber gelen paket yönetim aracıdır diyebiliriz.

    Kullanımında detaylara girmeden kısaca bahsedersek, 3 ana komutu sık sık kullanırız

    1-) npm install komutu: Bu komut package.json'da kayıtlı paketleri yükleyebilmek (depolardan çekip local klasörümüze indirebilmek diyebiliriz) için kullanılır.

    2-) npm update komutu: Npm install'den aslında bir farkı yok denilebilir. Yüklemek yerine güncelleme komutudur. Ufacık farkı ise package.json'u detaylı anlattığımızda anlaşılacaktır.

    3-) npm start komutu: Aslına bakarsanız gerçek bir sitede (sunucusu domaini herşeyi hazır yayına girmiş, public edilmiş bir sitede) kullanmayacağımız ancak localde, geliştirme aşamasında, debug ve tekrar başlatma durumlarında sık sık kullancağımız bir komuttur.

    Npm start aslında basit anlamda package.json'da belirtilmiş olan ana js dosyamızı cmd'de "node ana_js_dosyasi.js" yazarak çalıştırmakla aynı komuttur. Tabi bu package.json'da node kısmı dahi değiştirilebilir durumda. Binevi kısayol tuşumuz olmuş oluyor. Express-generator'de default olarak "node ./bin/www" komutudur. Yani express-generator ile oluşturduğumuz "başlangıç kitimiz"de port debug error handling gibi kısımlar için www dosyasını, paketleri include etme vs diğer ana js komutları için de app.js (ana dizindeki) dosyasını kullanacağız.

    Package.json'da paketler nasıl tanımlanılır kısaca bahsedecek olursak:

     

    {
      "name": "tahribat-nodejs",
      "version": "0.0.1",
      "private": true,
      "scripts": {
        "start": "node ./bin/www"
      },
      "dependencies": {
        "body-parser": "~1.15.1",
        "cookie-parser": "~1.4.3",
          .
          .
          .
          .
      }
    }

    Şeklinde içeriğe sahip anadizinde bulunması gereken bir dosyamız var ve bu dosyada dependencies bölümü içerisinde paketlerimiz, diğer bölümlerde çeşitli değişkenlerimiz ve ayarlarımız bulunmakta.

    https://docs.npmjs.com/files/package.json <-- Detaylı bilgi edinebilmek için bu siteyi incelemenizde fayda var ancak ben yine tanımlardan kaçınıp yalnızca işimize yarayacak (daha doğrusu benim kullandığım, işime yarayan) kısımları anlatacağım.

    Scripts->starts alanı içerisindeki kısımı npm update içerisinde bahsetmiştim. Biliyorsunuz javascript v8 moturunu kullanan tek hede node.js değil. io.js gibi (sonradan birleşti mi ayrıldı mı bişeyler oldu bu hede) commonjs gibi hedelerimiz de var. Yahut pm2 gibi server/node.js proje yönetici hedelerini de çalıştırabiliriz.

    Paketlerimizi tanımladığımız dependencies kısmında dikkat etmemiz gereken en önemli husus kesinlikle doğru paket ismini yazdıktan sonra doğru versiyonu yazabilmektir. Unutmayın daha sonra da projemizi geliştireceksek, geliştirmeye karar verdiğimiz dönemde o paket çağın ötesinde veya gerisinde kalmış olabilir. Versiyonu belirtmeden tekrardan yüklediğimiz paket bizim projemizdeki kodları artık desteklemiyor olabilir.

    Bu sebeple 1- paket ismine çok dikkat edin, 2- paket versiyonunu mutlaka kontrol edin, 3- kesinlikle yeni bir paket yükleyecekken npm install paket-ismi komutunu kullanmayın. Yoksa node_modules klasörünü yük olmasın diye almadığınız durumlarda (genel olarak böyle yapacaksınız) hangi paketlerin tekrar yüklenilmesi gerektiğini bulabilmek için bin dereden su getirmek zorunda kalabilirsiniz.

    Peki versiyon alelade mi yazılıyor? Tabiki hayır. Şu adreste abiler güzelce sistemi açıklayıp kaynak kodlarını yayınlamışlar -> https://github.com/npm/node-semver detaylı bilgi için linki incelemenizi tavsiye ederim.

    Bizim işimize yarayacak bir kaç durum var.

    Tam versiyon: "v1.3.0", "=v1.3.0"

    o versiyon ve üstü: ">=1.3.0"

    herhangi bir versiyon: "*"

    son haneye kadar eşit: "~1.3.0" (başka deyişle 1.3.x, ~1 yazsa idik 1.x, ~1.3.2 yazsa idik 1.3.2.x) <- genel olarak tavsiyem budur

    Tabi detayına bakarsanız şu versiyonların üstü olurken bu olmasın ama şunlar varken şunun altı olsun gibi ekzantirik şeyler de yazabilirsiniz (sanırım, denemedim) verdiğim linki kurcalayabilirsiniz.

    Şimdi sıra sıra projelerimizde varsayılan olarak kullanmamız olmazsa olmaz paketlerimize geçelim:

     

     

    Kırmızı ile belirttiğim yerin dışında kalanlar varsayılan (default) olarak gelen express paketleri. Diğerleri ise benim kendi kullandığım, çok faydalı bulduğum paketler. Bu paketleri varsayılan olarak her web projenizde bulundurmanızı şiddetle tavsiye ediyorum :) Şimdi teker teker paketlere geçelim. (Paketleri ufaktan tanımladıktan sonra kullanılışlarını anlatacağım)

    Not: Express'in kendi paketlerini anlatma gereği duymuyorum, araştırıp bulabilirsiniz, zaten biz onları require olarak tanımlamak dışında çok da kullanmayacağız..

    Ddos: Maalesef zamanla eski aktifliğini yitiren, warning hatası verse de hala işe yarayan paketimiz isminden de anlaşılacağı üzere ddos engellemek amacıyla üretilmiş. Tabi ki böyle bir paketle tüm ddos güvenliğini alabileceğinizi sanıyorsanız yanılıyorsunuz :) Fakat cookie ve session yönetimi ile en azından sıradan kullanıcıların bilerek veya bilmeyerek arka arkaya işlem yapmasını engelliyor. Warning verdiğinden dolayı da kullanımını size bırakıyorum aslında. Başka bir paket yayınlayacağım ddos için

    Compression: Toplu halde css, js dosyalarını sıkıştırıp optimize etmeyi otomatikleştirmek için aktif olarak kullandığım paket.

    Express-Minify: Html çıktılarını mümkün olduğunca sıkıştıran, kendiniz için yazdığınız "comment"ları temizleyen güzel bir paket.

    Phpjs: Php bilginiz var ve bunu node.js'te de server tarafında kullanmak istiyorsanız mükemmel bir paket. Php'de pek çok kullanışlı ve popüler fonksiyonları javascript kütüphanesine çevirmişler. Bunu da tabi node.js'e montelemişler. Hatta c, python, go gibi diğer dilleri de çevirmeye el atmışlar. Linki inceleyebilirsiniz: http://locutus.io/

    Async: Tanımladığımız paketleri asenkron olarak çalıştırmak için harika bir paket. Zaten tüm tanımlamalarımız aslında bu paket içerisinden olacak. Bu şekilde gelsin google page speed artıları, seo avantajları :) Server tepki süresini en optimum seviyeye indirir.

    Node-force-domain: Yahu böyle birşey için bile paket mi olurmuş diyeceğiniz güzide paket. Sitenizin www olmayan halini www olan adresine yönlendirir :) Varken kullanayım demiştim, gayet hızlı ve güzel. Üstelik düşünmemeniz gereken 302 gibi yönlendirme kodlarını vs herşeyini düşünmüşler.

    express-dot-engine: Aslına bakarsanız yalnızca doT ismine sahip template engine'in express için biraz daha geliştirilmiş versiyonu. Ben normalde yalnız doT'u kullanıyordum. Fakat dün gece makaleyi yazarken farkettim, öyleyse kullanalım dedim. Benim 2 paket + 1 paket editi olarak yaptığım işi tek pakette birleştirmişler güzel olmuş. Yoksa ben yayınlayacaktım. 

    Bu dot engine için ayrı bir yazı yazmayı bile düşünüyorum. Çünkü piyasadaki tema motorlarının en hızlısı ve bana göre en kullanışlısı. Jade hoş gelebilir fakat okadar hantal ki, benim gibi hız ve seo tutkunuysanız size kesinlikle yaramaz. Ayrıca jade gibi motorları kendiniz geliştirmek istediğinizde işin içinden çıkmak hayli zor, fakat doT.js tamamen açık okunaklı ufacık bir paket. Tabi express-dot-engine biraz daha çetrefilli bu da express gibi hazır bir web yöneticisini kullanıyor olmamızın sıkıntısı.

    Nasıl kullanırız?

    Package.json dosyamızın versiyonlarıyla beraber güzelce yazılmış olduğuna emin olduktan sonra vscode editörümüzden CTRL + " komutuyla komut istemini açıyoruz. Npm update komutu ile paketlerimizi güncelliyoruz (sıfır bir kurulum için node-modules klasörünü silip npm install de diyebilirsiniz) Eğer ddos ekliyse 1 adet uyarı alacaksanız herhangi bir sıkıntınız olmayacak. Eğer ddos ekli değilse bu uyarıyı da almazsınız. Eğer kontrol etmek isterseniz npm ls komutu ile paketleri listeleyebilirsiniz.

    Daha sonra app.js dosyamızı açıp tüm paketlerimizi tanımlamamız lazım. Express-generator app.js'de require ile gerekli komutları en tepede tanımlamış. Hemen o satırların altına

    var engine = require('express-dot-engine');
    var compress = require('compression');
    var minify = require('express-minify');
    var async = require('async');
    var forcedomain = require('forcedomain');

    Satırlarını da ekledim ben (php'yi gerekli gördüğümüz sayfalarda model kısmında (router) kullanacağımız için tanımlamaya gerek yok. boşuna yük etmeyelim)

    Hemen ardından doT temlate engine'i aptal jade yerine tanımlayalım.

    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade')

    Kısmını

    // view engine setup
    app.engine('dot', engine.__express);
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'dot');

    Şeklinde değiştirirsek dot tanımlamamız bitmiş oluyor. Fazla farklı birşey yapmadık aslında express'in tanıdığı default motorlardan biri olmadığı için doT'u app.engine ile tanıttık. Bunu engine.__express yardımıyla yaptık. Sonra app'teki view engine değişkenini dot yaptık işlemimiz bitti.

    https://www.npmjs.com/package/express-dot-engine Buradan kullanımını kurcalayabilirsiniz. Özel ayarlar ile 

    [[ ]]     for evaluation
    [[= ]]    for interpolation
    [[! ]]    for interpolation with encoding
    [[# ]]    for compile-time evaluation/includes and partials
    [[## #]]  for compile-time defines
    [[? ]]    for conditionals
    [[~ ]]    for array iteration

    Şeklinde kullanım yerine classic asp (<%=değişken%>) veya php (<?=değişken?>) veya kendi uydurduğunuz bir syntax şekliyle düzenleyebilirsiniz. Ben web yazılımına classic asp ile başladığım için öyle değiştirdim ve yukardaki kodların üzerine şu kodları yaptıştırdım.

    engine.settings.dot = {
    evaluate:    /\<\%([\s\S]+?(\}?)+)\%\>/g,
    interpolate: /\<\%=([\s\S]+?)\%\>/g,
    encode:      /\<\%!([\s\S]+?)\%\>/g,
    use:         /\<\%#([\s\S]+?)\%\>/g,
    useParams:   /(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g,
    define:      /\<\%##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\%\>/g,
    defineParams:/^\s*([\w$]+):([\s\S]+)/,
    conditional: /\<\%\?(\?)?\s*([\s\S]*?)\s*\%\>/g,
    iterate:     /\<\%~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\%\>)/g,
    varname: 'layout, partial, locals, model',
    strip: true,
    append: true,
    selfcontained: false,
    doNotSkipEncoded: false
    };

    varname: 'layout, partial, locals, model' bu kısım en önemli yeri. Fazla detaya girmeyeceğim doT kullanımı ile ilgili çünkü yeni bir makale yazmam gerekir içine girersek :) Ama değişken olarak routerden gelen değişkenler için model, iskelet içeri aktardığımız zaman (layout include) layout tagini kullanacağız. <%=model.title%> gibi...

    E artık asenkron parallel uygulama hedemizi de tanımlayıp diğer fonksiyonlarımızı çalıştıralım.

    Yeni bir fonksiyon oluşturuyoruz ve bir döngü ile gelecek olan programları teker teker asenkron çalıştırmaya yolluyoruz. Fonksiyonumuz tam olarak şöyle:

    function parallel (middlewares){
        return function(req,res,next) {
            async.each(middlewares, function(mw,cb) {
                mw(req, res, cb);
            }, next);
        };   
    }

    Daha sonra app.use ile tanımlamamız gereken fonksiyonları tek tek bu parallel fonksiyonundan geçiriyoruz. Dizi şeklinde tanıttığımızda da zaten fonksiyonumuz işlev görecektir.

    app.use(parallel([
        compress(),
        minify(),
        logger('dev'),
        bodyParser.json(),
        bodyParser.urlencoded({ extended: false }),
        cookieParser(),
        express.static(__dirname + '/public', { maxAge: 864000000000000 }),
        forcedomain({hostname: 'www.siteadresi.com', type: 'permanent'})
    ]));

    Compress, minify kullanımı gördüğünüz gibi fonksiyonu app.use içinde çalıştırmakla bitiyor. Bodyparser, cookieparser, express.static ise express-generatorun kendisiyle gelen komutlar. ForceDomain komutundaysa gördüğünüz gibi hostname tanımlıyoruz ve type'ı permanent yapıyoruz tüm işlemlerimiz bitmiş oluyor.

    Minify'de default ayarlar ve ayarları değiştirmek için : https://www.npmjs.com/package/express-minify

    Compression'da hardcore ayarlar için: https://www.npmjs.com/package/compression

    Buarada neden 2 adet sıkıştırma paketi derseniz. Compression aynı zamanda gzip compression'u da açıyor. Bu sebeple arama motorlarında 1 artı puanımız daha oluyor.

    Son olarak views kısmındaki jade dosyalarınız .dot olarak düzenleyip sitenizi debug edebilirsiniz.

    Artık en iyi şekilde optimize edilmiş, hızlı ve performanslı web sitemizi düzenleme bölümüne geçebiliriz. Bir sonraki yazımda yeni bir web sitesi yapmaya başlayacağız ve doT template engine derinlerine inip daha çok jquery ve css'i aktif olarak kullanacağız. Sonraki yazılarda da expressin lanet problemlerine çözümler getireceğiz.

    Takipte kalın :) konu ile ilgili her türlü sorularınızı elimden geldiğimce cevaplarım, konu dağılmadığı sürece ek bilgiler de ekleyebilirim. 1511 kelimelik bu makale umarım sıkıcı olmamıştır, iyi kodlamalar :)

    by_Tet tarafından 24/Ağu/16 18:32 tarihinde düzenlenmiştir

    iyibu! yeniden..
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nick6
    0x656e
    0x656e's avatar
    Kayıt Tarihi: 19/Mayıs/2012
    Homo

    O zaman size güzel bir öğrenme kaynağıda ben atayım 


    http://nodeschool.io/tr/


    npm yi yüklediyseniz eğer burada ki paketleri kurarak terminal üzerinden nodejs veya nodejs express öğrenebilirsiniz.


    Eğer daha efektif bir kurs isterseniz node.codeschool.com un ilk dersi ücretsiz yine yararlı bi site 

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Retro
    by_Tet
    by_Tet's avatar
    Kayıt Tarihi: 22/Mayıs/2012
    Erkek

    Up olsun


    iyibu! yeniden..
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek

    dokuman için sağol. express'den bağımsız olarak npm ve package.json kullanımını da anlatman iyi olmuş. 

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    @by_Tet hocam bi sonraki yazından azıcık visual Code yi anlatır mısın indirdim de beyin yakıcı şu debug olaylarını yakalama vs gibi ? Mümkün müdür :)


    Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu önünden (ahiret dünyadan) daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    Hem up olsun hemde devamı geleydi iyidi ya :) 


    Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu önünden (ahiret dünyadan) daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    detCode
    detCode's avatar
    Kayıt Tarihi: 30/Kasım/2012
    Erkek

    formidable -> file upload yapıyorsanız kullanabileceğiniz bir paket. https://github.com/felixge/node-formidable

    geoip-lite -> ip den lokasyon bilgisi alabileceğiniz bir paket. başka bir apiden http request ile sorgulamıyor maxmind free db sini kullanıyor bildiğim kadarıyla. https://github.com/bluesmoon/node-geoip

    i18n -> bildiğiniz localization paketi. https://github.com/mashpie/i18n-node

    moment -> tarihler ile uğraşıyorsanız kullanabileceğiniz bir paket. Dil desteği filan var 2 saat önce vs. yazdırabiliyorsunuz verdiğiniz tarihe göre. http://momentjs.com/

    string -> ekstra string fonksiyonları olan kullanışlı bir paket. http://stringjs.com/

     

     

     

     

    detCode tarafından 16/Eyl/16 15:20 tarihinde düzenlenmiştir

    Who is detCode?
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    geoip-lite yaklaşık konum mu veriyor yoksa direkt olarak noktasal konumu mu veriyor ? Sürekli güncellenebilir mi ? Örneğin Sensör mahiyetinde kullanılabilir mi ? 


    Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu önünden (ahiret dünyadan) daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    detCode
    detCode's avatar
    Kayıt Tarihi: 30/Kasım/2012
    Erkek
    MhmdAlmz bunu yazdı

    geoip-lite yaklaşık konum mu veriyor yoksa direkt olarak noktasal konumu mu veriyor ? Sürekli güncellenebilir mi ? Örneğin Sensör mahiyetinde kullanılabilir mi ? 

    sensör olarak kullanamazsın. ülke şehir gibi değişkenleri kullanmak istersen bu paketi kullanabilirsin


    Who is detCode?
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Böcüklerin Efendisi
    krypt
    krypt's avatar
    Kayıt Tarihi: 05/Mart/2004
    Erkek

    Abi node.js'de bu olayı sevmiyorum. İki tane paket yukluyorsun 2000 tane dosya oluyor klasörde. Bir de her şey için paket yukleyince binlerce dosya oluyor.


    while (1<2)
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek
    detCode bunu yazdı
    MhmdAlmz bunu yazdı

    geoip-lite yaklaşık konum mu veriyor yoksa direkt olarak noktasal konumu mu veriyor ? Sürekli güncellenebilir mi ? Örneğin Sensör mahiyetinde kullanılabilir mi ? 

    sensör olarak kullanamazsın. ülke şehir gibi değişkenleri kullanmak istersen bu paketi kullanabilirsin

    Bulunsun o zaman Ip kontrol lokasyon vs alınca olabilir güzel data toplanır Thank you :) 


    Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu önünden (ahiret dünyadan) daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!