इसके दृष्टिकोण के कई तरीके हैं, प्रत्येक अपने स्वयं के पेशेवरों और विपक्षों के साथ:
require.main.filename
से http://nodejs.org/api/modules.html :
जब एक फाइल को सीधे नोड से चलाया जाता है, तो require.main
उसे सेट किया जाता है module
। इसका मतलब है कि आप यह निर्धारित कर सकते हैं कि एक फ़ाइल को सीधे परीक्षण द्वारा चलाया गया है या नहींrequire.main === module
क्योंकि module
एक filename
संपत्ति प्रदान करता है (सामान्य रूप से समतुल्य __filename
), वर्तमान एप्लिकेशन के प्रवेश बिंदु को चेक करके प्राप्त किया जा सकता है require.main.filename
।
इसलिए यदि आप अपने ऐप के लिए आधार निर्देशिका चाहते हैं, तो आप कर सकते हैं:
var path = require('path');
var appDir = path.dirname(require.main.filename);
फायदे नुकसान
यह ज्यादातर समय काम करेगा, लेकिन यदि आप अपना ऐप pm2 जैसे लॉन्चर के साथ चला रहे हैं या मोचा टेस्ट चला रहे हैं , तो यह तरीका विफल हो जाएगा।
global.X
नोड का एक वैश्विक नामस्थान ऑब्जेक्ट है global
- जिसे कुछ भी आप इस ऑब्जेक्ट से जोड़ते हैं वह आपके ऐप में हर जगह उपलब्ध होगा। तो, आपके index.js
(या app.js
आपकी मुख्य ऐप फ़ाइल का नाम), आप बस एक वैश्विक चर को परिभाषित कर सकते हैं:
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
फायदे नुकसान
लगातार काम करता है लेकिन आपको एक वैश्विक चर पर निर्भर रहना पड़ता है, जिसका अर्थ है कि आप आसानी से घटकों / आदि का पुन: उपयोग नहीं कर सकते हैं।
process.cwd ()
यह वर्तमान कार्यशील निर्देशिका को लौटाता है। विश्वसनीय नहीं है, क्योंकि यह पूरी तरह से इस बात पर निर्भर करता है कि प्रक्रिया किस निर्देशिका से शुरू की गई थी :
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
एप्लिकेशन-रूट पथ
इस समस्या को हल करने के लिए, मैंने ऐप-रूट-पथ नामक एक नोड मॉड्यूल बनाया है । उपयोग सरल है:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
एप्लिकेशन-रूट पथ मॉड्यूल कई विभिन्न तकनीकों का उपयोग करता है अनुप्रयोग के रूट पथ निर्धारित करने के लिए, खाते में विश्व स्तर पर स्थापित मॉड्यूल (उदाहरण के लिए, यदि आपके ऐप में चल रहा है ले रही है /var/www/
लेकिन मॉड्यूल में स्थापित किया गया है ~/.nvm/v0.x.x/lib/node/
)। यह समय के 100% काम नहीं करेगा, लेकिन यह सबसे आम परिदृश्यों में काम करने वाला है।
फायदे नुकसान
अधिकांश परिस्थितियों में विन्यास के बिना काम करता है। कुछ अच्छी अतिरिक्त सुविधा विधियाँ भी प्रदान करता है (परियोजना पृष्ठ देखें)। सबसे बड़ा चोर है कि अगर यह काम नहीं करेगा:
- आप एक लांचर का उपयोग कर रहे हैं, जैसे pm2
- और , मॉड्यूल आपके ऐप की
node_modules
निर्देशिका के अंदर स्थापित नहीं है (उदाहरण के लिए, यदि आपने इसे विश्व स्तर पर स्थापित किया है)
आप इसके चारों ओर एक APP_ROOT_PATH
पर्यावरण चर स्थापित करके , या .setPath()
मॉड्यूल पर कॉल करके प्राप्त कर सकते हैं , लेकिन उस स्थिति में, आप शायद global
विधि का उपयोग कर रहे हैं ।
NODE_PATH पर्यावरण चर
यदि आप वर्तमान एप्लिकेशन के रूट पथ को निर्धारित करने के लिए रास्ता ढूंढ रहे हैं , तो उपरोक्त समाधानों में से एक आपके लिए सबसे अच्छा काम करने की संभावना है। यदि, दूसरी ओर, आप एप्लिकेशन मॉड्यूल को लोड करने की समस्या को मज़बूती से हल करने की कोशिश कर रहे हैं, तो मैं अत्यधिक NODE_PATH
पर्यावरण चर में देखने की सलाह देता हूं ।
नोड की मॉड्यूल प्रणाली विभिन्न स्थानों में मॉड्यूल की तलाश करती है। इन स्थानों में से एक जहाँ भी process.env.NODE_PATH
बिंदु हैं । यदि आप इस पर्यावरण चर को सेट करते हैं, तो आप require
बिना किसी अन्य परिवर्तन के मानक मॉड्यूल लोडर के साथ मॉड्यूल कर सकते हैं।
उदाहरण के लिए, यदि आप सेट NODE_PATH
करते हैं /var/www/lib
, तो निम्नलिखित ठीक काम करेगा:
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
इसका उपयोग करने का एक शानदार तरीका है npm
:
"scripts": {
"start": "NODE_PATH=. node app.js"
}
अब आप अपना ऐप शुरू कर सकते हैं npm start
और आप सुनहरे हो सकते हैं। मैं इसे अपने एनफोर्समेंट-नोड-पथ मॉड्यूल के साथ जोड़ती हूं , जो बिना NODE_PATH
सेट के गलती से ऐप लोड करने से रोकता है । पर्यावरण चर को लागू करने पर और अधिक नियंत्रण के लिए, चेकेनव देखें ।
एक गेटा: नोड ऐप के बाहर सेट किया NODE_PATH
जाना चाहिए । आप ऐसा कुछ नहीं कर सकते क्योंकि मॉड्यूल लोडर निर्देशिकाओं की सूची को कैश करता है जो आपके ऐप के चलने से पहले खोज करेगा।process.env.NODE_PATH = path.resolve(__dirname)
[जोड़ा 4/6/16] एक और वास्तव में आशाजनक मॉड्यूल जो इस समस्या को हल करने का प्रयास करता है, लहराती है ।