2012-05-11 20 views
17

शायद यह सवाल थोड़ा मूर्खतापूर्ण है, लेकिन क्या एकाधिक जेज फ़ाइलों को एक आवश्यक कथन के साथ लोड करना संभव है?क्या मैं एक आवश्यकता कथन के साथ कई फाइलें लोड कर सकता हूं?

var mylib = require('./lib/mylibfiles'); 

और उपयोग: इस तरह

One.js

exports.foo= function(){return "hello from one";} 

Two.js:

mylib.foo(); //return "hello from one" 

mylib.bar(): //return "hello from two" 

और फ़ोल्डर mylibfiles दो फ़ाइलों होगा

exports.bar= function(){return "hello from two";} 

मैं फ़ोल्डर में एक पैकेज.जेसन डाल रहा था जो सभी फाइलों को लोड करने के लिए कहता है, लेकिन मुझे नहीं पता कि कैसे। मैं जो सोच रहा था, वह एक इंडेक्स.जेएस है जो सबकुछ फिर से निर्यात करता है लेकिन मैं काम को डुप्लिकेट कर दूंगा।

धन्यवाद !!

P.D: मैं एक खिड़कियों पर NodeJS v0.611 साथ काम कर रहा हूँ 7 मशीन

उत्तर

28

सभी का उपयोग कर require कुछ भी नकल नहीं करता है सबसे पहले। यह मॉड्यूल लोड करता है और यह कैश है, इसलिए require को कॉल करने से इसे फिर से स्मृति मिल जाएगी (इस प्रकार आप अपने स्रोत कोड के साथ बातचीत किए बिना फ्लाई पर मॉड्यूल को संशोधित कर सकते हैं - यह कभी-कभी वांछनीय है, उदाहरण के लिए जब आप अंदर डीबी कनेक्शन स्टोर करना चाहते हैं मॉड्यूल)।

भी package.json कुछ भी लोड नहीं करता है और आपके ऐप से बिल्कुल संपर्क नहीं करता है। इसका उपयोग केवल npm के लिए किया जाता है।

अब आपको एक साथ कई मॉड्यूल की आवश्यकता नहीं हो सकती है। उदाहरण के लिए क्या होगा यदि One.js और Two.js दोनों ने एक ही नाम के साथ फ़ंक्शन परिभाषित किया है ?? और समस्याएं हैं।

लेकिन आप क्या कर सकते हैं, अतिरिक्त फ़ाइल में लिखने के लिए है, तो निम्न सामग्री

module.exports = { 
    one : require('./one.js'), 
    two : require('./two.js'), 
    /* some other modules you want */ 
} 

साथ modules.js कहना और फिर आप बस

var modules = require('./modules.js'); 
modules.one.foo(); 
modules.two.bar(); 
+1

के लिए धन्यवाद का उपयोग मदद, बात यह थी कि मैं आंतरिक रूप से कुछ तरीकों का प्रयास करने की कोशिश कर रहा हूं और मैं नहीं चाहता कि उन कार्यों को मॉड्यूल द्वारा एक्सेस किया जा सके जो आपके उदाहरण में, modules.js में उपयोग कर रहे हैं। मुझे लगता है कि आपके उदाहरण में मैं 'var one = requ (./ one.js) की आवश्यकता भी कर सकता हूं;' और 'one.js' के समान कार्य प्राप्त करें, क्या ऐसा है? – nico144

+1

सुधार: Node.js वास्तव में 'package' प्रक्रिया' के हिस्से के रूप में 'package.json' फ़ाइल का 'मुख्य' फ़ील्ड पढ़ता है। यह एकमात्र चीज है जो नोड इसे पढ़ती है, बाकी की जानकारी 'npm' के लिए है। – RyanZim

2

उपयोग कर सकते हैं हाँ, आप एक फ़ोल्डर आवश्यकता हो सकती है node docs के अनुसार, एक मॉड्यूल के रूप में। मान लीजिए कि आप ./mypack/ नामक फ़ोल्डर को() की आवश्यकता है।

./mypack/ अंदर, फ़ोल्डर की name और एक main जावास्क्रिप्ट ही नाम के साथ फ़ाइल के साथ एक package.json फ़ाइल बनाने, एक ./lib/ निर्देशिका के अंदर।

{ 
    "name" : "mypack", 
    "main" : "./lib/mypack.js" 
} 

अब आप require('./mypack') उपयोग कर सकते हैं और नोड ./mypack/lib/mypack.js लोड होगा।

हालांकि यदि आप इस package.json फ़ाइल को शामिल नहीं करते हैं, तो यह अभी भी काम कर सकता है।फ़ाइल के बिना, नोड ./mypack/index.js लोड करने का प्रयास करेगा, या यदि वहां नहीं है, तो ./mypack/index.node

मेरी समझ यह है कि यदि आप अपने प्रोग्राम को कई जावास्क्रिप्ट फ़ाइलों में विभाजित कर चुके हैं तो यह फायदेमंद हो सकता है लेकिन उन्हें तैनाती के लिए संयोजित नहीं करना चाहते हैं।

+0

बस स्पष्ट होने के बावजूद, आपको एक फ़ोल्डर के रूप में एक फ़ोल्डर की आवश्यकता नहीं हो सकती है और उस निर्देशिका में सभी जावास्क्रिप्ट फ़ाइलों को लोड कर सकते हैं। सही? – Michael

+0

@ माइकल सही। यह रूट 'package.json' में केवल' main' के मान को लोड करेगा, या यदि कोई नहीं है, तो रूट 'index.js' – chharvey

+0

@Michael - गतिशील रूप से कोड फ़ाइलों की पूरी निर्देशिका लोड करना वही समस्या है हर भाषा: उन्हें किस क्रम में लोड किया जाना चाहिए? वर्णमाला? फिर आप अजीब contortions में मिलता है जहां आप आदेश को प्रभावित करने के लिए फ़ाइल नाम पर कृत्रिम उपसर्ग डाल रहे हैं। – xyz

0

मेरे पास कोड का एक स्निपेट है जिसके लिए एक से अधिक मॉड्यूल की आवश्यकता है, लेकिन यह आपकी पोस्ट के सुझाव के साथ उन्हें एक साथ नहीं जोड़ता है। हालांकि, मुझे मिली एक चाल से दूर किया जा सकता है।

function requireMany() { 
    return Array.prototype.slice.call(arguments).map(function (value) { 
     try { 
      return require(value) 
     } 
     catch (event) { 
      return console.log(event) 
     } 
    }) 
} 

और आप इसे इस तरह

requireMany("fs", "socket.io", "path") 

के रूप में उपयोग कौन सा

[ fs {}, socketio {}, path {} ] 

तो एक मॉड्यूल नहीं पाया जाता है, तो एक त्रुटि कंसोल के लिए भेजा जाएगा वापस आ जाएगी। यह कार्यक्रम तोड़ नहीं होगा। त्रुटि को सरणी में अपरिभाषित के रूप में दिखाया जाएगा। सरणी कम नहीं होगी क्योंकि मॉड्यूल में से एक लोड करने में विफल रहा है। यह अनिवार्य रूप से एक वस्तु की तरह काम करता है, लेकिन वैश्विक नामस्थान के लिए कुंजी और उनके मान प्रदान करती है

var [fs, socketio, path] = requireMany("fs", "socket.io", "path") 

:

तो फिर तुम एक चर नाम करने के लिए उन सरणी तत्वों में से प्रत्येक के उन बाध्य कर सकते हैं, इसलिए पसंद है। तो, आपके मामले में, तुम कर सकते हो:

var [foo, bar] = requireMany("./foo.js", "./bar.js") 
foo() //return "hello from one" 
bar() //return "hello from two" 

और आप इसे त्रुटि पर कार्यक्रम को तोड़ने के लिए चाहते हैं, तो बस इस संशोधित संस्करण है, जो छोटे

function requireMany() { 
    return Array.prototype.slice.call(arguments).map(require) 
} 
संबंधित मुद्दे

 संबंधित मुद्दे