Büyük Node.js projeleri nasıl organize edilir


82

Büyük Node.js projelerini düzenlemenin bazı iyi yolları nelerdir?

Örneğin, hem express.js hem de socket.io kullanan bir uygulama? Bu, hem uygulama mantıksal yapısını hem de dosya sistemini içerir.

Şu anda, kendimi bir ton kodu tek bir ana js dosyasına sokarken ve kodu dev bir küresel nesneye yerleştirirken buluyorum ve bu yaramazlık hissi veriyor.


2
Kitap okumak için zamanın var mı?
Straseus

Bu kitabı satın almam gerekebilir, teşekkürler!
Thomas Hunter II

Google "JavaScript Modülleri" veya "Modüler JavaScript" :-)
Sri

1
Straseus'un önerdiği kitabı okudum ve pek çok iyi tavsiye ve analiz veriyor, ancak korkarım ki express ile bir Node.js uygulamasını yapılandırmaya pek iyi bir şey aktarılmıyor. PuerkitoBio'nun aşağıdaki yanıtı, iyi bir başlangıç ​​dosya yapısına ilişkin bazı önerilerle bağlantılıdır; Gerektiği gibi bu yapının üzerine inşa etmeyi planlıyorum.
Aaron

Yanıtlar:


97

Yeni Başlayanlar Örneği

Aslen @ david-ellis'ten kontrol edileni beğeniyorum ve iyi olduğu için anlamak için derinlemesine çalışmalısınız. Ancak, basit bir örnek görmek isteyen yeni başlayanlar için daha basitleştirilmiş olmasını isterdim. İşte birinin bana göstermesini görmek isterdim.

Ekspres kullandığınız ve app.js dosyanızda listelenen birçok rotanızın bulunduğu tipik bir senaryo verelim. İçeriği şuna benzer:

app.js

// ... startup code omitted above

app.get('/', function(req, res) {
  res.render('index', { title : 'home' });
});
app.get('/contactus', function(req, res) {
  res.render('contactus', { title : 'contact us' });
});
app.get('/anotherpage', function(req, res) {
  res.render('anotherpage', { title : 'another page' });
});
// and so on...

50 rotanız olduğunu hayal edebilirsiniz, bu dosya oldukça kontrolden çıkabilir. Bu dağınıklığın bir kısmını app.js dosyasından çıkarmak güzel olurdu.

Yapmanız gereken şey, uygulamanızda bir "denetleyiciler" klasörü oluşturmaktır, böylece yapınız şimdi şöyle görünecektir:

app.js
/controllers

"/ Controllers" içinde "index.js" adlı bir dosya oluşturun ve ardından aşağıdaki kodu girin.

/controllers/index.js

module.exports.set = function(app) {
   // copy your routes listed in your app.js directly into here
}

"App.js" dosyanızdan rota listelerinizi kesip yapıştırın ve bunları "/controllers/index.js" dosyasına yerleştirin.

App.js dosyanızda rotalarınızı kaldırın ve bunların yerine aşağıdakileri yapın.

app.js

// remove your routes and replace with this code
var controllers = require('./controllers');
controllers.set(app);

Şimdi, "/controllers/index.js" dosyanızın da bölünmesini istiyorsanız, bir örnek daha ekleyelim, böylece Node.js kodunun nasıl organize edilebileceği konusunda gerçekte nasıl bir Rus Bebeği gibi davrandığını görebilirsiniz.

"/ Controllers" içine bir tane daha "accounts.js" dosyası ekleyin ve aşağıdakileri içine yerleştirin.

/controllers/account.js

module.exports.set = function(app) {
    // put more app route listings here
}

Şimdi "/controllers/index.js dosyanıza" account.js "referansı ekleyin

/controllers/index.js

var account = require('./account.js');

module.exports.set = function(app) {
   // your routes here

   // let "account.js" set other routes
   account.set(app);
}

Tahmin edebileceğiniz gibi, her şeyi gittikçe daha küçük parçalara ayırmaya devam edebilir ve klasörlere daha fazla klasör koyabilir ve isterseniz "gerekli" ile referans alabilirsiniz. Aynı konsepti "/ lib" veya kitaplık dosyaları için de kullanabilirsiniz. "node_modules" bunu zaten yapıyor.

Bu, node.js ile programlamanın çok keyifli olmasının nedenlerinden sadece biridir.

Yönetilebilir Express 4 Yönlendirme örneği

İşte bununla ilgili 4 yolu ifade etmek için yanıtladığım başka bir gönderi.

Express.js iç içe yönlendirici ile dinlenin


IMHO güncellemeden önce daha iyiydi, bir rota diğerine yönlendiren bir takma ad mekanizması uygulayarak her denetleyiciye bir isim vermek zorunda kalmazsınız, bu aynı zamanda kanonik URL'lere de yardımcı olur
Timo Huovinen

Kanonik URL kısmına aldırmayın, sonradan düşünülmüştü. Standart URL ile , bir kullanıcının adres çubuğuna (veya tam tersi ) girmesi <link>gibi /example/pathbir şeye bir kanonik eklemeyi kastettim /example/path/.
Timo Huovinen

Biliyorsunuz, bir programcı olarak bu tür bir organize hiyerarşi istemek doğaldır, ancak bir dosyayı açarken veya bir teslimatı okurken pratik açıdan pek uygun değildir. Çalışmak için çabucak zahmetli hale gelen çok sayıda "index.js" elde edeceksiniz.
Abhinav Gujjar

Bir yıl sonra benim için değerli bir yazı. Bir hafta sonu projesi için kullanmak üzere node.js'ye yeni başlıyorum.
masfenix

@JasonSebring Çok fazla bilgi var ve ben çok yeniyim! Şu anda çok kayboldum. Matematikte yüksek lisans öğrencisi olarak çok fazla matlab / R / mathematica yapıyorum ANCAK bir web / masaüstü çerçevesine en son dokunduğumda .net 2.0 günlerindeydi.
masfenix

10

Birkaç gün önce bu konuyla ilgili bir blog yazısı yazdım ve makale Fransızca olmasına rağmen, kullandığım yapının çalışan bir örneğini göstermek için bir GitHub deposu (İngilizce) kurdum.

Açıkçası, bu sorunun kesin bir cevabı yok, ancak başkalarının ne yaptığını görmek ilginç ve konuyla ilgili diğer fikirlere kulak veriyorum (burada da tartışıldı , burada ne önerdiğimin bir özetini görebilirsiniz) .


Bu bağlantı için teşekkürler, iyi bir okuma oldu (Google Translate'in yardımıyla) ve eminim şu anda üzerinde çalıştığım projenin organizasyonunu tasarlarken önerilerinizden bazılarını takip edeceğim.
Aaron

Bağlantıyı düzeltebilir misin?
Yevhenii Herasymchuk

2

Diğer blog gönderisine benzer şekilde, özellikle Expressuygulamaları düzenleme hakkında bir tane yazdım . Yaklaşık bir buçuk yıldır kullandığım yöntem bu. Temel olarak, uygulamalarınızı veri varlıklarınız veya diğer temel öğeler etrafında düzenleyin. Bu öğelerin her biri için mantığı kendi dizinlerine yerleştirin. Python'dan çok şey ödünç almaya çalıştım.

http://rycole.com/2013/01/28/organizing-nodejs-express.html


1

Makaleleri artık çevrimiçi değil, ancak Eric Satterwhite'ın düğüm dizisi aşağıda listelenen bir yapı önerdi.

# Project 
. 
|-- packages/
|   |-- project-core
|   |   |-- lib/
|   |   |-- commands/
|   |   |-- startup/
|   |   |-- conf/
|   |   |-- test/
|   |   |-- package.json
|   |   |-- README.md
|   |   |-- events.js
|   |   |-- .npmignore
|   |   `-- index.js
|-- package.json
`-- index.js

İle packages/klasörün modülerlik için kaynak dönüşüyor.


0

Bu alanda acemiyseniz, geliştiriciler tarafından sevilen mevcut projelere bir göz atmanızı öneririm. Onlardan bazıları:

  • Sails.js - 18k yıldız. Sağladığım bağlantıdan APP yapısını nasıl düzenlediklerine göz atabilirsiniz. Harika bir web sitesinde, yapıdaki her klasör için bir açıklama bulunur.

  • Express.js oluşturucu - 800 yıldız. Express.js ile çalışmaya başlamak için harika ve basit bir şablon var. Burada rotaları uygulamadan nasıl ayırdıklarını görebilirsiniz.

Bu arada, davanızı daha önce pek çok geliştirici halletti ve sadece çatallayıp yükseltebilirsiniz.

  • Kioska . events/Klasörde olayları farklı dosyalara nasıl ayırdıklarına bakın .

  • Ballons.io 2.3k yıldız. Ne yazık ki, tüm soket sunucusuna tek bir dosyada sahipler, ancak uygulamanın tüm yapısını node.js ve socket.io ile öğrenebilirsiniz.


0

Sakıncası yoksa, her zaman typcript öğrenebilir ve https://nestjs.com/ adresine gidebilirsin.

JS'ye bağlı kalmak istiyorsanız, soğan mimarisini kullanmanızı şiddetle tavsiye ederim. En iyi uygulama, iş mantığını, denetleyicileri ve hatta kitaplıkları ayrı tutmaktır (bunlar bazı sınıfların / yardımcıların içine sarılmalıdır) - her ihtimale karşı, başka bir kitaplığa (farklı CSV ayrıştırıcısı vb.) Geçiş yapmanız gerekecekse.

Onion mimarisi ile, isteklerin nereden geldiği umrunda değil, bazı mesaj simsarları bile eklemek için çok fazla değişiklik olmayacak.

Ayrıca bunu da deneyin https://en.wikipedia.org/wiki/Domain-driven_design

ESLint, uygun proje organizasyonuna yardımcı olabilir.

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.