2011-04-17 13 views
33

मैं सर्वर साइड कोड Node.js के साथ एक परियोजना और पर काम कर रहा हूँ इतना बड़ा है कि मैं इसे बंद विभाजित करने के लिए एकाधिक फ़ाइलों में चाहते हैं होता जा रहा है के साथ कई जे एस फ़ाइलें सर्वर साइड का प्रबंधन करने के। ऐसा लगता है कि यह उम्र के लिए क्लाइंट-साइड किया गया है, प्रत्येक फ़ाइल के लिए script टैग डालने के द्वारा विकास किया जाता है और केवल वितरण के लिए सब कुछ एक साथ रखने के लिए "मेक" जैसा होता है। मुझे एहसास है कि सभी सर्वर-साइड कोड को जोड़ने में कोई बात नहीं है इसलिए मैं यह नहीं पूछ रहा हूं कि यह कैसे करें। उपयोग करने के लिए सबसे नज़दीकी चीज़ require() है, हालांकि यह script की तरह व्यवहार नहीं करती है, जिसमें ब्राउजर में आवश्यक फाइलें एक सामान्य नेमस्पेस साझा नहीं करती हैं।कैसे Node.js

Shooter जैसी कुछ पुरानी नोड.जेएस परियोजनाओं को देखते हुए, ऐसा लगता है कि यह एक बार मामला नहीं था, या मैं अपने कोड में वास्तव में कुछ याद कर रहा हूं। मेरी आवश्यक फाइलें संकलन समय पर न ही रनिंग समय पर वैश्विक कॉलिंग नेमस्पेस तक नहीं पहुंच सकती हैं। क्या इस के आसपास कोई आसान तरीका है या क्या हमें कॉल करने के दायरे से पूरी तरह से स्वायत्त जेएस फाइलों को पूरी तरह से स्वायत्त बनाने के लिए मजबूर किया गया है?

उत्तर

47

आप एक आम नाम स्थान नहीं चाहते हैं क्योंकि वैश्विक बुराई कर रहे हैं। नोड में हम exports को लिख कर मॉड्यूल

// someThings.js 

(function() { 
    var someThings = ...; 

    ... 

    module.exports.getSomeThings = function() { 
     return someThings(); 
    } 

}()); 

// main.js 

var things = require("someThings"); 
... 
doSomething(things.getSomeThings()); 

आप एक मॉड्यूल को परिभाषित करने और फिर अपने मॉड्यूल के लिए एक सार्वजनिक एपीआई का पर्दाफाश परिभाषित करते हैं।

इस संभाल करने के लिए सबसे अच्छा तरीका है निर्भरता इंजेक्शन है। आपका मॉड्यूल init फ़ंक्शन का खुलासा करता है और आप अपने मॉड्यूल में निर्भरता के ऑब्जेक्ट हैश को पास करते हैं।

तुम सच में वैश्विक क्षेत्र तक पहुँचने तो आप global के माध्यम से उस तक पहुँच सकते हैं पर जोर देते हैं। प्रत्येक फ़ाइल global ऑब्जेक्ट को लिख और पढ़ सकती है। फिर आप ग्लोबल्स का उपयोग नहीं करना चाहते हैं।

+0

जानकारी के लिए धन्यवाद, सही के रूप में चिह्नित। मैं आमतौर पर globals == बुराई अवधारणा से सहमत हूं लेकिन ऐसा लगता है कि उनके पास उनकी जगह है। क्या होगा, उदाहरण के लिए, मेरे पास एक मूल संपत्ति है जिसे मैं किसी दिए गए "वर्ग" के लिए सेट करना चाहता हूं जो किसी अन्य मूल्य पर निर्भर करता है? उदाहरण के लिए: 'SomeClass.prototype.baseProp = SomeOtherClass.prototype.prop * 2;' इस मामले में, मैं या तो निर्माता के माध्यम से वस्तु इन्स्टेन्शियशन पर इस सेट करें, या, जैसा कि आप का सुझाव दिया 'global' वस्तु का उपयोग करने के लिए मजबूर कर रहा हूँ । मुझे लगता है कि बाद में सबसे उचित हो सकता है। –

+2

@XHR फिर 'SomeClass' की' SomeOtherClass' पर निर्भरता है और आपको कुछ क्लास.जेएस के अंदर '(कुछऑथ क्लास ") की आवश्यकता है। मेरे पास मेरे कोड में एक वैश्विक चर है। 'global._ = आवश्यकता है (" underscore ") 'क्योंकि मैं इसे _every_ एकल फ़ाइल का उपयोग करता हूं। 'वैश्विक' के लिए यह एकमात्र उपयोग है। – Raynos

29

फिर @Raynos answer, अगर मॉड्यूल फ़ाइल फ़ाइल है कि यह शामिल है के बगल में है, यह

var things = require("./someThings"); 

होना चाहिए मॉड्यूल, पर प्रकाशित किया है तो है, और के माध्यम से स्थापित NPM, या स्पष्ट रूप से ./node_modules/ फ़ोल्डर में डाल दिया , तो

var things = require("someThings"); 

सही है।

+4

यदि आपको वास्तविक नोड मॉड्यूल की आवश्यकता है (एनपीएम के माध्यम से स्थापित, PROJECT_ROOT/node_modules के तहत स्थापित), तो कोड की दूसरी पंक्ति की आवश्यकता है। यदि आपको अपनी फ़ाइल (यानी ROOT_DIR/models/thing.js) की आवश्यकता है, तो आपको कोड की पहली पंक्ति (हालांकि आप .js एक्सटेंशन को दूर कर सकते हैं) को करने की आवश्यकता है। –

+0

मैं सकारात्मक नहीं कर रहा हूँ, लेकिन आप [वस्तु की आवश्यकता के एक्सटेंशन संपत्ति] का उपयोग कर इस व्यवहार में परिवर्तन करने में सक्षम हो सकता (http://nodejs.org/api/globals.html#globals_require_extensions)। – snapfractalpop

+0

सुधार के लिए धन्यवाद, मैंने इसे अपडेट किया। – michielbdejong