ठीक है, यह एक समय हो गया है और यह एक लोकप्रिय सवाल है, इसलिए मैंने आगे बढ़कर जावास्क्रिप्ट कोड के साथ एक मचान गिथब रिपॉजिटरी बनाई है और एक लंबे समय के बारे में पढ़ें कि मैं कैसे एक मध्यम आकार के एक्सप्रेस.जेएस एप्लिकेशन को संरचना करना पसंद करता हूं।
फ़ोकसॉरस / एक्सप्रेस_कोड_स्ट्रक्चर इसके लिए नवीनतम कोड वाला रेपो है। अनुरोध का स्वागत करें।
यहाँ README का एक स्नैपशॉट है क्योंकि स्टैकओवरफ़्लो सिर्फ-ए-लिंक उत्तरों को पसंद नहीं करता है। मैं कुछ अपडेट करूंगा क्योंकि यह एक नई परियोजना है जिसे मैं अपडेट करना जारी रखूंगा, लेकिन आखिरकार इस जानकारी के लिए गिटब रेपो अप-टू-डेट जगह होगी।
एक्सप्रेस कोड संरचना
यह प्रोजेक्ट मध्यम आकार के एक्सप्रेस.जेएस वेब एप्लिकेशन को व्यवस्थित करने का एक उदाहरण है।
कम से कम एक्सप्रेस v4.14 दिसंबर 2016 को वर्तमान
आपका आवेदन कितना बड़ा है?
वेब एप्लिकेशन सभी समान नहीं हैं, और मेरी राय में, एक भी कोड संरचना नहीं है, जिसे सभी एक्सप्रेस.जेएस अनुप्रयोगों पर लागू किया जाना चाहिए।
यदि आपका आवेदन छोटा है, तो आपको इस तरह की गहरी निर्देशिका संरचना की आवश्यकता नहीं है क्योंकि यहाँ पर उदाहरण दिया गया है। बस इसे सरल रखें और .js
अपनी रिपॉजिटरी की जड़ में मुट्ठी भर फाइलें चिपकाएँ और आपका काम हो गया। Voilà।
यदि आपका आवेदन बहुत बड़ा है, तो कुछ बिंदु पर आपको इसे अलग-अलग एनपीएम पैकेज में तोड़ने की आवश्यकता है। सामान्य तौर पर नोड.जेएस दृष्टिकोण कई छोटे पैकेजों के पक्ष में लगता है, कम से कम पुस्तकालयों के लिए, और आपको कई एनपीएम पैकेजों का उपयोग करके अपने आवेदन का निर्माण करना चाहिए क्योंकि यह समझ में आने लगता है और ओवरहेड को उचित ठहराना शुरू करता है। इसलिए जैसे-जैसे आपका एप्लिकेशन बढ़ता है और कोड का कुछ हिस्सा आपके एप्लिकेशन के बाहर स्पष्ट रूप से पुन: प्रयोज्य हो जाता है या एक स्पष्ट सबसिस्टम है, इसे अपने स्वयं के गिट रिपॉजिटरी में स्थानांतरित करें और इसे स्टैंडअलोन एनपीएम पैकेज में बनाएं।
इसलिए इस परियोजना का फोकस मध्यम आकार के अनुप्रयोग के लिए एक व्यावहारिक संरचना का वर्णन करना है।
आपकी समग्र वास्तुकला क्या है
वेब एप्लिकेशन बनाने के लिए कई दृष्टिकोण हैं, जैसे कि
- सर्वर साइड MVC रेल पर एक ला रूबी
- सिंगल पेज एप्लीकेशन स्टाइल अ ला मोंगोबडी / एक्सप्रेस / एंगुलर / नोड (MEAN)
- कुछ रूपों के साथ मूल वेब साइट
- मॉडल / संचालन / दृश्य / घटना शैली एक ला एमवीसी मर चुका है, यह समय के लिए चलता है
- और कई अन्य दोनों वर्तमान और ऐतिहासिक हैं
इनमें से प्रत्येक एक अलग निर्देशिका संरचना में अच्छी तरह से फिट बैठता है। इस उदाहरण के प्रयोजनों के लिए, यह सिर्फ मचान है और पूरी तरह से काम करने वाला ऐप नहीं है, लेकिन मैं निम्नलिखित प्रमुख वास्तुकला बिंदुओं को मान रहा हूं:
- साइट में कुछ पारंपरिक स्थिर पृष्ठ / टेम्पलेट हैं
- साइट के "एप्लिकेशन" भाग को सिंगल पेज एप्लिकेशन शैली के रूप में विकसित किया गया है
- एप्लिकेशन ब्राउज़र के लिए एक REST / JSON शैली API को उजागर करता है
- ऐप एक साधारण व्यापार डोमेन को मॉडल करता है, इस मामले में, यह एक कार डीलरशिप एप्लीकेशन है
और पटरियों पर रूबी के बारे में क्या?
इस परियोजना के दौरान यह एक विषय होगा कि रूबी ऑन रेल्स और "कन्वेंशन ओवर कॉन्फिगरेशन" निर्णयों में से कई विचारों को उन्होंने अपनाया है, हालांकि व्यापक रूप से स्वीकार किए जाते हैं और उपयोग किए जाते हैं, वास्तव में बहुत सहायक नहीं होते हैं और कभी-कभी इस रिपॉजिटरी के विपरीत होते हैं। सिफारिश की गई है।
यहां मेरा मुख्य बिंदु यह है कि कोड को व्यवस्थित करने के लिए अंतर्निहित सिद्धांत हैं, और उन सिद्धांतों के आधार पर, रूल्स ऑन रूब कन्वेंशन रूल्स समुदाय पर रूबी के लिए (ज्यादातर) समझ में आता है। हालांकि, बस विचारहीन रूप से उन सम्मेलनों को क्षमा करने से बात याद आती है। एक बार जब आप मूल सिद्धांतों को टटोलते हैं, तो आपकी सभी परियोजनाएँ सुव्यवस्थित और स्पष्ट होंगी: शेल स्क्रिप्ट, गेम्स, मोबाइल ऐप, एंटरप्राइज़ प्रोजेक्ट, यहां तक कि आपके होम डायरेक्टरी भी।
रेल समुदाय के लिए, वे चाहते हैं कि वे हर बार ऐप से ऐप में एक ही रेल डेवलपर स्विच करें और हर बार इससे परिचित और सहज रहें। यह बहुत मायने रखता है यदि आप 37 सिग्नल या पॉस्टल लैब्स हैं, और इसके फायदे हैं। सर्वर-साइड जावास्क्रिप्ट दुनिया में, समग्र लोकाचार सिर्फ अधिक जंगली पश्चिम कुछ भी हो जाता है और हमें वास्तव में इसके साथ कोई समस्या नहीं है। हम इस तरह करते हैं। हम इसके अभ्यस्त हैं। यहां तक कि एक्सप्रेस.जे के भीतर, यह सिनट्रा के करीबी परिजन हैं, न कि रेल, और रेल से सम्मेलनों को लेना आमतौर पर कुछ भी मदद नहीं कर रहा है। मैं यह भी कहूंगा कि कॉन्फ़िगरेशन पर कन्वेंशन पर सिद्धांत ।
सिद्धांतों और प्रेरणाओं को समझना
ऐप सिमिलिंक ट्रिक
महान दृष्टिकोण में समुदाय द्वारा लंबाई पर कई दृष्टिकोणों की रूपरेखा और चर्चा की गई है। बेहतर स्थानीय आवश्यकता () के लिए Node.js के रास्ते हैं । मैं जल्द ही या तो "बहुत सारे ../../../ .." से निपटना पसंद करने का फैसला कर सकता हूं या आवश्यकता के अनुरूप तरीके का उपयोग कर सकता हूं। हालाँकि, इस समय, मैं नीचे दिए गए सिम्लिंक ट्रिक का उपयोग कर रहा हूं।
इसलिए इंट्रा-प्रोजेक्ट से बचने का एक तरीका कष्टप्रद सापेक्ष रास्तों की आवश्यकता है जैसे require("../../../config")
निम्नलिखित चाल का उपयोग करना है:
- अपने ऐप के लिए node_modules के तहत एक सिमलिंक बनाएं
- सीडी नोड_मॉड्यूल्स और& ln -nsf ../app
- केवल नोड_मॉड्यूल्स / ऐप सिमिलिंक जोड़ें , न कि संपूर्ण नोड_मॉडल फ़ोल्डर, गिट करने के लिए
- git ऐड-ऑफ नोड_मॉड्यूल्स / ऐप
- हां, आपको अभी भी अपनी
.gitignore
फ़ाइल में "node_modules" होना चाहिए
- नहीं, आपको अपने नोड रिपॉजिटरी में "node_modules" नहीं डालना चाहिए। कुछ लोग आपको ऐसा करने की सलाह देंगे। वे गलत हैं।
- अब आपको इस उपसर्ग का उपयोग करके इंट्रा-प्रोजेक्ट मॉड्यूल की आवश्यकता हो सकती है
var config = require("app/config");
var DealModel = require("app/deals/deal-model")
;
- मूल रूप से, यह इंट्रा-प्रोजेक्ट बाहरी npm मॉड्यूल के लिए आवश्यक समान काम की आवश्यकता है।
- क्षमा करें, विंडोज उपयोगकर्ता, आपको मूल निर्देशिका रिश्तेदार पथों के साथ रहना होगा।
विन्यास
आमतौर पर कोड मॉड्यूल और कक्षाएं केवल एक मूल जावास्क्रिप्ट options
ऑब्जेक्ट के पास होने की उम्मीद करते हैं । केवल मॉड्यूल app/server.js
को लोड करना चाहिए app/config.js
। वहां से यह आवश्यकतानुसार छोटी options
वस्तुओं को सबसिस्टम को कॉन्फ़िगर करने के लिए संश्लेषित कर सकता है , लेकिन अतिरिक्त जानकारी से भरे बड़े वैश्विक कॉन्फिगरेशन मॉड्यूल के लिए हर सबसिस्टम को खराब करना है।
डीबी कनेक्शनों के निर्माण को केंद्रीकृत करने की कोशिश करें और उन सबसिस्टमों में पास करें जो कि कनेक्शन मापदंडों को पारित करने के विरोध में हैं और सबसिस्टमों के आउटगोइंग कनेक्शन खुद बनाते हैं।
NODE_ENV
यह एक और मोहक लेकिन भयानक विचार है जिसे रेल से चलाया जाता है। आपके एप्लिकेशन में ठीक 1 स्थान होना चाहिए, app/config.js
जो NODE_ENV
पर्यावरण चर को देखता है । क्लास कंस्ट्रक्टर तर्क या मॉड्यूल कॉन्फ़िगरेशन पैरामीटर के रूप में बाकी सब कुछ स्पष्ट विकल्प लेना चाहिए।
यदि ईमेल मॉड्यूल में ईमेल वितरित करने का तरीका (SMTP, लॉग इन स्टैडआउट, कतार में रखा आदि) का विकल्प है, तो इसे एक विकल्प लेना चाहिए {deliver: 'stdout'}
लेकिन यह बिल्कुल जाँच नहीं करना चाहिए NODE_ENV
।
टेस्ट
अब मैं अपनी परीक्षण फाइलों को उनके संबंधित कोड के समान निर्देशिका में रखता हूं और उत्पादन कोड से परीक्षणों को अलग करने के लिए फ़ाइल नाम एक्सटेंशन नामकरण सम्मेलनों का उपयोग करता हूं।
foo.js
मॉड्यूल "फू" कोड है
foo.tape.js
फू के लिए नोड-आधारित परीक्षण हैं और एक ही डायर में रहते हैं
foo.btape.js
उन परीक्षणों के लिए उपयोग किया जा सकता है जिन्हें ब्राउज़र वातावरण में निष्पादित करने की आवश्यकता होती है
मैं find . -name '*.tape.js'
अपने सभी परीक्षणों तक आवश्यक रूप से पहुंचने के लिए फाइलसिस्टम ग्लब्स और कमांड का उपयोग करता हूं।
प्रत्येक .js
मॉड्यूल फ़ाइल के भीतर कोड को कैसे व्यवस्थित करें
इस परियोजना का दायरा ज्यादातर इस बारे में है कि फाइलें और निर्देशिकाएं कहां जाती हैं, और मैं बहुत अधिक गुंजाइश नहीं जोड़ना चाहता, लेकिन मैं सिर्फ यह उल्लेख करूंगा कि मैं अपने कोड को 3 अलग-अलग वर्गों में व्यवस्थित करता हूं।
- कॉमनजेएस के ओपनिंग ब्लॉक में राज्य निर्भरता के लिए कॉल की आवश्यकता होती है
- शुद्ध-जावास्क्रिप्ट का मुख्य कोड ब्लॉक। यहां कॉमनज प्रदूषण नहीं। निर्यात, मॉड्यूल या आवश्यकता का संदर्भ न लें।
- निर्यात स्थापित करने के लिए कॉमनजस का समापन ब्लॉक