स्थानीय चर तक पहुंच के साथ नोड्स में बाहरी जेएस फ़ाइल लोड और निष्पादित करें?


130

क्या include('./path/to/file')नोड.जेएस में एक सरल प्रकार का कमांड करना आसान / संभव है ?

मैं केवल इतना करना चाहता हूं कि स्थानीय चर तक पहुंच हो और एक स्क्रिप्ट चले। लोग आमतौर पर नोड.जेएस परियोजनाओं को कैसे व्यवस्थित करते हैं जो एक साधारण हैलो दुनिया से बड़ी हैं? (पूरी तरह कार्यात्मक गतिशील वेबसाइट)

उदाहरण के लिए, मुझे निर्देशिकाएं पसंद हैं:

/models

/views

... आदि


बाहरी URL (स्थानीय फ़ाइल के बजाय) से स्क्रिप्ट को शामिल करना भी संभव है। यहां देखें: pastebin.com/WkvHjGsG
एंडरसन ग्रीन

यदि आप downloadedModulesस्क्रिप्ट के समान निर्देशिका में एक फ़ोल्डर बनाते हैं, तो ऊपर दी गई स्क्रिप्ट केवल सही ढंग से काम करती है ।
एंडरसन ग्रीन

जवाबों:


134

बस एक करो require('./yourfile.js');

उन सभी चरों की घोषणा करें जिन्हें आप वैश्विक चर के रूप में बाहर तक पहुँचना चाहते हैं। इसलिए इसके बजाय

var a = "hello" यह

GLOBAL.a="hello" या केवल

a = "hello"

यह स्पष्ट रूप से बुरा है। आप वैश्विक दायरे को प्रदूषित नहीं करना चाहते हैं। इसके बजाय सुझाव विधि exportअपने कार्यों / चर के लिए है।

यदि आप चाहते हैं कि MVC पैटर्न Geddy पर एक नज़र डालें।


3
एक साइड नोट के रूप में .. मुझे एक्सप्रेस पसंद है। आपको इसे भी देखना चाहिए, बशर्ते कि आप एमवीसी के बारे में विशेष रूप से नहीं हैं।
श्रीपाद कृष्ण

42
जब आप कहते हैं कि "यह स्पष्ट रूप से बुरा है", तो "यह" क्या दर्शाता है?
एंडरसन ग्रीन

1
@AndersonGreen - उसका मतलब है कि वैश्विक दायरे में चर डालना।
टिम

77
@AndersonGreen: कृपया मुझे बताएं कि स्कूपिंग के बारे में एक बहुत ही चतुर मजाक था ;-)
Dusty J

6
इसने मुझे यह जानने में मदद की कि requireआपके npm मॉड्यूल में अगर आप अपने रास्ते को किसी तरह से उपसर्ग नहीं करते हैं तो./
Dylan Valade

93

आपको कॉमनजेएस को समझने की आवश्यकता है, जो मॉड्यूल को परिभाषित करने के लिए एक पैटर्न है। आपको ग्लोबल स्कोप का दुरुपयोग नहीं करना चाहिए जो हमेशा करने के लिए एक बुरी बात है, इसके बजाय आप इस तरह से 'निर्यात' टोकन का उपयोग कर सकते हैं:

// circle.js

var PI = 3.14; // PI will not be accessible from outside this module

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

और क्लाइंट कोड जो हमारे मॉड्यूल का उपयोग करेगा:

// client.js

var circle = require('./circle');
console.log( 'The area of a circle of radius 4 is '
           + circle.area(4));

इस कोड को नोड .js प्रलेखन एपीआई से निकाला गया था:

http://nodejs.org/docs/v0.3.2/api/modules.html

इसके अलावा, यदि आप रेल या सिनात्रा जैसी किसी चीज़ का उपयोग करना चाहते हैं, तो मैं एक्सप्रेस की सलाह देता हूं (मैं URL पोस्ट नहीं कर सका, लकीर के फकीर को शर्मिंदा कर सकता हूं!)


64

यदि आप नोड के लिए कोड लिख रहे हैं, तो नोड मॉड्यूल का उपयोग करके जैसा कि इवान द्वारा वर्णित है एक संदेह के बिना जाने का रास्ता है।

हालाँकि, यदि आपको जावास्क्रिप्ट को लोड करने की आवश्यकता है जो पहले से ही लिखा गया है और नोड के बारे में पता नहीं है, तो vmमॉड्यूल जाने का रास्ता है (और निश्चित रूप से बेहतर है eval)।

उदाहरण के लिए, यहां मेरा execfileमॉड्यूल है, जो स्क्रिप्ट का या तो वैश्विक संदर्भ pathमें मूल्यांकन करता contextहै:

var vm = require("vm");
var fs = require("fs");
module.exports = function(path, context) {
  var data = fs.readFileSync(path);
  vm.runInNewContext(data, context, path);
}

यह भी नोट करें: लोड किए गए मॉड्यूल require(…)में वैश्विक संदर्भ तक पहुंच नहीं है।


1
इस टिप के लिए धन्यवाद। वास्तविक उपयोग का मामला तब है जब आपको मॉड्यूल एडहॉक लोड करने की आवश्यकता होती है। पंजीकरण पैटर्न की तरह कहें जहां आपके पास 1000 मॉड्यूल होंगे जो एक केंद्रीय सेवा में रजिस्टर होते हैं। यह मॉड्यूल के लिए स्कैन करने और उन्हें एक-एक करके लोड करने के लिए बहुत साफ और बेहतर डिज़ाइन है, जो आपकी सेवा में 1000 की आवश्यकता होती है ...
Assaf Moldavsky

नोड डायनेमिक आवश्यकताओं का समर्थन करता है, इसलिए डायनामिक रूप से नोड-जागरूक मॉड्यूल लोड करते समय इस पैटर्न का उपयोग करने का कोई कारण नहीं है। वास्तव में, यह सक्रिय रूप से वहां उपयोग करने के लिए हानिकारक है, क्योंकि यह नोड का बायपास करता है require.cache, इसलिए एक ही फाइल को कई बार लोड किया जा सकता है।
डेविड वोलेवर

ठीक है, इसलिए उस मामले को हल करने के लिए जिसे मैंने प्रस्तुत किया था, जहां आपके पास 1000 मॉड्यूल हैं, जहां प्रत्येक रजिस्ट्री सेवा में पंजीकरण कर रहा है, आप रजिस्ट्री सेवा में 1000 के बयानों की आवश्यकता के बिना आपके द्वारा प्रस्तावित प्रस्ताव का उपयोग कैसे करते हैं?
असाफ मोल्दवस्की

1
बस requireसामान्य की तरह: function loadService(name) { return require('./services/' + name); }तो सूची सेवाओं तथापि आवेदन के लिए समझ में आता है।
डेविड वोलेवर

सही है, लेकिन इसका मतलब है कि आपको रजिस्ट्री सेवा में सभी 1000 मॉड्यूल को जानना होगा। जो 1000 की आवश्यकता वाले बयानों से बेहतर नहीं है। संपूर्ण विचार यह है कि रजिस्ट्री सेवा को सभी मॉड्यूल के बारे में नहीं पता है और वास्तव में यह उनके बारे में परवाह करता है। मॉड्यूल रजिस्ट्री सेवा में तदर्थ रजिस्टर करते हैं। क्या इसका कोई मतलब है?
19af में आसफ मोल्दवस्की

7

यदि आप किसी बाहरी जावास्क्रिप्ट फ़ाइल के फ़ंक्शंस या ऑब्जेक्ट्स को लोड करने की योजना बना रहे हैं, तो निम्न कोड का उपयोग करके इस संदर्भ को लोड करें - runInThisContext विधि पर ध्यान दें:

var vm = require("vm");
var fs = require("fs");

var data = fs.readFileSync('./externalfile.js');
const script = new vm.Script(data);
script.runInThisContext();

// here you can use externalfile's functions or objects as if they were instantiated here. They have been added to this context. 

2
बहुत खोज और फ्रोबिंग के बाद, इस तकनीक ने मेरे लिए काम किया। मेरी फ़ाइलों को सीधे ब्राउज़र का उपयोग करने और एक चर घोषित करने के लिए लिखा जाता है जैसे: const aVar = {बात: 'a'}
lucsan

3

@ श्रीपाद और @ इवान के उत्तर पर विस्तार करते हुए , मैं सुझाव दूंगा कि आप Node.js के मानक मॉड्यूल . export कार्यक्षमता का उपयोग करें ।

स्थिरांक ( जैसे constants.js ) के लिए आपकी फ़ाइल में , आप इस तरह से स्थिरांक लिखेंगे:

const CONST1 = 1;
module.exports.CONST1 = CONST1;

const CONST2 = 2;
module.exports.CONST2 = CONST2;

फिर उस फ़ाइल में जिसमें आप उन स्थिरांक का उपयोग करना चाहते हैं , निम्नलिखित कोड लिखें:

const {CONST1 , CONST2} = require('./constants.js');

यदि आपने पहले const { ... }सिंटैक्स कभी नहीं देखा है : तो यह विनाशकारी असाइनमेंट है


0

पुनरुत्थान के लिए क्षमा करें। आप नोड में बाह्य js फ़ाइलों को निष्पादित करने के लिए child_process मॉड्यूल का उपयोग कर सकते हैं

var child_process = require('child_process');

//EXECUTE yourExternalJsFile.js
child_process.exec('node yourExternalJsFile.js', (error, stdout, stderr) => {
    console.log(`${stdout}`);
    console.log(`${stderr}`);
    if (error !== null) {
        console.log(`exec error: ${error}`);
    }
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.