Node.js projesi için klasör yapısı


346

Node.js projelerinin genellikle aşağıdaki gibi klasörler içerdiğini fark ettim:

/ libs, / satıcı, / support, / spec, / testler

Bunlar tam olarak ne anlama geliyor? Aralarındaki fark nedir ve başvurulan kodu nereye eklemeliyim?

Yanıtlar:


439

Bahsettiğiniz klasörler hakkında:

  • /libs genellikle özel için kullanılır classes/functions/modules
  • /vendorveya /support3. taraf kitaplıkları içeriyor (git kaynak denetimi olarak git kullanılırken git alt modülü olarak eklenir)
  • /spec BDD testleri için özellikler içerir.
  • /testsbir uygulama için birim testleri içerir (bir test çerçevesi kullanarak, buraya bakın )

NOT: NPM temiz bir paket yönetimi başlattığından her ikisi de /vendorve /supportkullanımdan kaldırılmıştır. NPM ve bir package.json dosyası kullanarak tüm 3. taraf bağımlılıkların ele alınması önerilir

Oldukça büyük bir uygulama oluştururken, aşağıdaki ek klasörleri öneririm (özellikle ekspres veya mongoose gibi bir çeşit MVC- / ORM-Framework kullanıyorsanız ):

  • /modelstüm ORM modellerinizi içerir ( Schemasmongoose olarak adlandırılır )
  • /views görünüm şablonlarınızı içerir (hızlı bir şekilde desteklenen herhangi bir şablonlama dilini kullanarak)
  • /public tüm statik içeriği içerir (resimler, stil sayfaları, istemci tarafı JavaScript)
    • /assets/images resim dosyaları içeriyor
    • /assets/pdf statik pdf dosyaları içerir
    • /css stil sayfaları (veya bir css motoru tarafından derlenmiş çıktı) içeriyor
    • /js istemci tarafı JavaScript içeriyor
  • /controllersuygulamanızın modülüne / alanına göre ayrılmış tüm ekspres rotalarınızı içerir (not: express'in önyükleme işlevini kullanırken bu klasöre çağrı yapılır /routes)

Projelerimi bu şekilde organize etmeye alıştım ve bence gayet iyi çalışıyor.

CoffeeScript tabanlı Express uygulamaları için güncelleme ( connect varlıklarını kullanarak ):

  • /app derlenmiş JavaScript'inizi içerir
  • /assets/ derleme gerektiren tüm müşteri tarafı varlıkları içerir
    • /assets/js istemci tarafı CoffeeScript dosyalarınızı içerir
    • /assets/css tüm LESS / Stylus stil sayfalarınızı içerir
  • /public/(js|css|img) herhangi bir derleyici tarafından işlenmeyen statik dosyalarınızı içerir
  • /src sunucu tarafına özgü tüm CoffeeScript dosyalarınızı içerir
  • /test tüm birim test komut dosyalarını içerir (seçtiğiniz bir test çerçevesi kullanılarak uygulanır)
  • /views tüm açık görüşlerinizi içerir (yeşim taşı, ejs veya diğer cazip motorlar olsun)

5
müşteri tarafı js, css, resimlerinizi nereye koyardınız? herkese açık klasörde benzer bir klasör yapısı önerir misiniz, genel / varlıkların genel / varlıklar / css genel / varlıkların / resimler genel / varlıkların / docs public / libs public / genel destek / genel test / genel görünüm / denetleyiciler ?
ezmilhouse

2
expressjs bir ./routes dizini oluşturur, örneğinizdeki ./controllers ile aynı mıdır?
chovy

2
Neden bu teklifle bir Yeoman jeneratörü oluşturmuyorsunuz? Standart olabilir.
Jayr Motta

+1 ASP.NET MVC'den gelen "route" klasörü "kontrolörleri" çağırmak benim için çok daha mantıklı.
adam0101

Soru, dizin yapıları normalde çerçeve (yani PHP için Symfony) tarafından oluşturulmuyor mu? Örneğin Express ile hiçbir dizin yapısı doğru oluşturulmadı mı? geliştiriciler manuel olarak MVC tasarımı ve yolları oluşturmak ve korumak mı? Herhangi bir geri bildirim için teşekkür ederim, Express
AnchovyLegend

49

GitHub'da buna benzer bir soru nedeniyle bir tartışma var: https://gist.github.com/1398757

Diğer projeleri rehberlik için kullanabilir, GitHub'da aşağıdakileri arayabilirsiniz:

  • ThreeNodes.js - bence, her proje için uygun olmayan belirli bir yapıya sahip gibi görünüyor;
  • daha hafif - daha basit bir yapı, ancak biraz organizasyondan yoksundur;

Ve son olarak, bir kitapta ( http://shop.oreilly.com/product/0636920025344.do ) bu yapıyı önerir:

├── index.html
├── js/
   ├── main.js
   ├── models/
   ├── views/
   ├── collections/
   ├── templates/
   └── libs/
       ├── backbone/
       ├── underscore/
       └── ...
├── css/
└── ...

Dosyaları dinamik olarak gerektirecek bir modül oluşturdum ve projenizi tipik Model, Görünüm, Denetleyici yerine özelliğe göre yapılandırmanıza izin verdim. Umarım birine yardımcı olur: github.com/ssmereka/crave
Scott

13

Proje mimarimden daha fazla örnek burada görebilirsiniz:

├── Dockerfile
├── README.md
├── config
   └── production.json
├── package.json
├── schema
   ├── create-db.sh
   ├── db.sql
├── scripts
   └── deploy-production.sh 
├── src
   ├── app -> Containes API routes
   ├── db -> DB Models (ORM)
   └── server.js -> the Server initlializer.
└── test

Temel olarak, mantıksal uygulama SRC dir içindeki DB ve APP klasörlerine ayrılmıştır.


uygulamanız aynı zamanda bir ön uç uygulaması içeriyorsa bunu altına koyar mısınız srcveya ön uç uygulaması kendi klasörünü alır (kendi package.jsonve benzer klasör yapısına sahip)?
wal

2
@ walend Daha organize olduğu için ön uç projelerini başka bir depoya ayırmayı tercih ediyorum
Daniel Chernenkov

2

Bu dolaylı cevap, klasör yapısının kendisinde çok ilgili.

Birkaç yıl önce aynı sorum vardı, bir klasör yapısı aldım, ancak daha sonra ilerlemek için çok sayıda dizin yapmak zorunda kaldım, çünkü klasör internette okuduğumdan farklı bir amaç için, yani belirli bir klasörün ne yaptığını bazı klasörlerde farklı insanlar için farklı anlamlar.

Şimdi, klasör yapısının kendisinde, diğer tüm cevaplardaki açıklamalara ek olarak, birden fazla proje yaptıktan sonra, Node.js'nin kendisinin yapısını takip etmenizi şiddetle tavsiye ediyorum: https://github.com/ düğüm / düğüm . Linters ve diğerleri, hangi dosya ve klasör yapısına sahip olduklarını ve nerede olduğunu söylüyorlar. Bazı klasörlerde, o klasörde ne olduğunu açıklayan bir README vardır.

Yukarıdaki yapıdan başlamak iyidir, çünkü bir gün yeni bir gereksinim gelir ve daha sonra yıllar boyunca sürdürülen Node.js'nin kendisini izlediği için iyileştirme kapsamına sahip olacaksınız.

Bu yardımcı olur umarım.


1

En iyi yaklaşımın ne olduğu konusunda fikir birliği olmadığını ve genel olarak ilgili çerçevelerin belirli yapıları zorlamadığını veya ödüllendirmediğini belirtmek önemlidir.

Bunu sinir bozucu ve devasa bir yük olarak görüyorum ama aynı derecede önemli. Bu, stil rehberi sorununun önemsiz bir versiyonudur (ancak IMO daha önemlidir) . Bunu belirtmek istiyorum çünkü cevap aynı: iyi tanımlanmış ve tutarlı olduğu sürece hangi yapıyı kullandığınız önemli değil .

Bu yüzden beğendiğiniz kapsamlı bir rehber aramanızı ve projenin buna dayandığını açıkça belirtmeyi öneriyorum.

Kolay değil, özellikle de bu konuda yeniyseniz! Araştırma yaparak saatler geçirmeyi bekleyin. MVC benzeri bir yapı öneren kılavuzların çoğunu bulacaksınız. Birkaç yıl önce bu sağlam bir seçim olabilirken, bugünlerde durum böyle olmayabilir. Örneğin burada başka bir yaklaşım var .


1

Web uygulamaları ve bina API'ları hakkında konuştuğumuzu varsayarsak:

Bir yaklaşım, dosyaları bir mikro hizmet mimarisinin nasıl göründüğü gibi özelliklerine göre kategorilere ayırmaktır. Bence en büyük kazanç, hangi dosyaların uygulamanın bir özelliği ile ilgili olduğunu görmek çok kolay.

Bunu göstermenin en iyi yolu bir örnektir:


Bir kütüphane uygulaması geliştiriyoruz. Uygulamanın ilk sürümünde bir kullanıcı şunları yapabilir:

  • Kitap arayın ve kitapların meta verilerini görün
  • Yazarları arayın ve kitaplarını görün

İkinci bir sürümde, kullanıcılar ayrıca:

  • Bir hesap oluşturun ve giriş yapın
  • Kredi / ödünç kitap

Üçüncü bir sürümde kullanıcılar şunları da yapabilir:

  • Favorilerini okumak / işaretlemek istedikleri kitapların bir listesini kaydedin

İlk önce aşağıdaki yapıya sahibiz:

books
  ├─ controllers
     ├─ booksController.js
     └─ authorsController.js
  
  └─ entities
      ├─ book.js
      └─ author.js

Daha sonra kullanıcı ve kredi özelliklerini ekliyoruz:

user
  ├─ controllers
     └─ userController.js
  ├─ entities
     └─ user.js
  └─ middleware
       └─ authentication.js
loan
  ├─ controllers
     └─ loanController.js
  └─ entities
      └─ loan.js

Ve sık kullanılanlar işlevselliği:

favorites
  ├─ controllers
     └─ favoritesController.js
  └─ entities
      └─ favorite.js

Herhangi bir kitap favori olarak işaretlenmişse, kitap aramasının da bilgi döndürmesi gerektiğini ekleyen herhangi bir yeni geliştirici için, kodda nerede görünmesi gerektiğini görmek gerçekten kolaydır.

Ardından, ürün sahibi süpürür ve sık kullanılanlar özelliğinin tamamen kaldırılması gerektiğini açıkladığında, kaldırması kolaydır.

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.