मैं अपनी स्क्रिप्ट नोड नोड में कैसे लोड कर सकता हूं?


137

मेरे पास एक स्क्रिप्ट foo.jsहै जिसमें कुछ फ़ंक्शन हैं जो मैं REPL में खेलना चाहता हूं।

क्या नोड के लिए मेरी स्क्रिप्ट को निष्पादित करने और फिर सभी घोषित ग्लोबल्स के साथ एक REPL में कूदने का एक तरीका है, जैसे मैं कर सकता हूं python -i foo.pyया ghci foo.hs?

जवाबों:


179

आपके द्वारा वर्णित सटीक कार्यक्षमता प्रदान करने के लिए अभी भी कुछ भी अंतर्निहित नहीं है। हालाँकि, REPL के भीतर कमांडrequire का उपयोग करने के लिए इसका उपयोग करने का एक विकल्प , जैसे:.load

.load foo.js

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

जो आपके लिए बेहतर है वह आपके उपयोग के मामले पर निर्भर करेगा।


संपादित करें: इसकी सीमित प्रयोज्यता है क्योंकि यह सख्त मोड में काम नहीं करता है, लेकिन तीन साल बाद मुझे पता चला है कि अगर आपकी स्क्रिप्ट नहीं है 'use strict', तो आप REPL इतिहास को प्रदूषित किए बिना अपनी स्क्रिप्ट को लोड करने के evalलिए उपयोग कर सकते हैं :

var fs = require('fs');
eval(fs.readFileSync('foo.js').toString())

क्या होगा अगर मैं एक async कॉलबैक के अंदर उत्तर में ड्रॉप करना चाहता हूं?
चेत

2
@ चेत आप एक नया StackOverflow प्रश्न लिखें अगर आपका प्रश्न किसी मौजूदा एक से मेल नहीं खाता है :-)
vossad01

@ आप किसी अन्य फ़ाइल को लोड कर सकते हैं (async () => {अधिक कोड}) () के साथ; और यह उसी ग्लोबल्स को साझा करेगा।
nurettin

यदि आप macOS पर हैं (तो शायद दूसरों को भी)। आप REPL में ".लोड" (स्पेस नोट कर सकते हैं) टाइप करें और अपने कमांड में सही रास्ता जोड़ने के लिए फाइंडर से टर्मिनल में फाइल को ड्रैग / ड्रॉप करें। यह आसान है अगर आप जिन फाइलों के साथ काम कर रहे हैं वे कई स्तर नीचे हैं।
jamesnotjim

35

मैं हमेशा इस कमांड का उपयोग करता हूं

node -i -e "$(< yourScript.js)"

बिना किसी पैकेज के पाइथन की तरह ही काम करता है।


1
किसी को पता है कि यह कैसे काम करने के लिए Windows cmd? मुझे यह काम करने के लिए मिला है, लेकिन खिड़कियां नहीं।
शार्पिरो

@ शार्प्रियो: यदि आप गिट स्थापित करते हैं तो आपके पास अपने विंडोज पीसी में एक मिनी-यूनिक्स स्थापित करने का विकल्प है। मेरा मतलब है कि विंडोज के लिए Git का सामान्य वितरण।
जुआन लानुस

इस बारे में एक बात जो परेशान कर रही है वह है Node.js, उत्तर प्रांप्ट को प्रिंट करेगा और फिर अपनी स्क्रिप्ट चलाएगा, इसलिए प्रॉम्प्ट के बाद कोई भी आउटपुट अटक जाता है। stackoverflow.com/a/45893494/3538165 के पास यह समस्या नहीं है, लेकिन इसके लिए समाधान कार्यों को स्पष्ट रूप से चर में नामस्थान में समाप्त करने के लिए निर्दिष्ट किया जाना चाहिए, इसलिए बहुत अच्छा नहीं है।
रेडॉन रोसबोरो

10

मैंने Vorpal.js बनाया , जो आपके नोड ऐड को इंटरेक्टिव CLI में बदलकर इस समस्या को हैंडल करता है। यह एक REPL एक्सटेंशन का समर्थन करता है, जो आपको आपके रनिंग ऐप के संदर्भ में एक REPL में छोड़ देता है।

var vorpal = require('vorpal')();
var repl = require('vorpal-repl');

vorpal
  .delimiter('myapp>')
  .use(repl)
  .show()
  .parse(process.argv); 

फिर आप ऐप को चला सकते हैं और यह एक REPL में गिर जाएगा।

$ node myapp.js repl
myapp> repl: 

8

एक अन्य तरीका उन कार्यों को वैश्विक रूप से परिभाषित करना है।

global.helloWorld = function() { console.log("Hello World"); }

फिर फ़ाइल को REPL में इस तरह से लोड करें:

node -r ./file.js

फिर फ़ंक्शन helloWorldको सीधे REPL में एक्सेस किया जा सकता है।


8

मैंने जब से स्क्रिप्ट को बार-बार लोड करने के लिए थक गया तब से मैंने रिप्पड बनाया ।

बस इसे माध्यम से स्थापित करें: npm install -g replpad

फिर इसे चलाकर उपयोग करें: replpad

यदि आप चाहते हैं कि यह वर्तमान और सभी उपनिर्देशिकाओं में सभी फ़ाइलों को देखें और जब वे परिवर्तन करते हैं, तो उन्हें उत्तर में पाइप करें: replpad .

साइट पर वीडियो देखें कि यह कैसे काम करता है और कुछ अन्य अच्छी विशेषताओं के बारे में जानने के लिए एक बेहतर विचार प्राप्त करें:

  • dox()हर कोर फ़ंक्शन में जोड़े जाने वाले फ़ंक्शन के माध्यम से उत्तर में कोर मॉड्यूल डॉक्स का उपयोग करेंfs.readdir.dox()
  • एनएक्सपी के माध्यम से dox()इंस्टॉल किए गए प्रत्येक मॉड्यूल में जोड़े जाने वाले फ़ंक्शन के माध्यम से उत्तर में एक्सेस उपयोगकर्ता मॉड्यूल रीडम्सmarked.dox()
  • फ़ंक्शन के हाइलाइट किए गए स्रोत कोड तक पहुंच , जानकारी जहां फ़ंक्शन को परिभाषित किया गया था (फ़ाइल, लिननंबर) और फ़ंक्शन टिप्पणियां और / या jsdocs जहां srcहर फ़ंक्शन में जोड़े गए संपत्ति के माध्यम से संभव हो , अर्थातexpress.logger.src
  • स्क्रिप्ट-टॉकी समर्थन (.talkकमांडदेखें)
  • कमांड और कीबोर्ड शॉर्टकट जोड़ता है
  • vim कुंजी बाइंडिंग
  • मुख्य मानचित्र समर्थन
  • मिलान कोष्ठक मैच के माध्यम से टोकन प्लगइन
  • एप्‍लिकेशन कोड दर्ज किया गया है, जो कीबोर्ड शॉर्टकट या .appendकमांड के माध्‍यम से फाइल करने के लिए है

देखें: https://github.com/thlorenz/replpad


मुझे CXX=clang++ npm install replpadत्रुटि के आसपास काम करना पड़ाg++: error: unrecognized command line option '-stdlib=libc++'
ShadSterling

लेकिन तब जब मैं इसे चलाता हूं तो यह विफल रहता है# # Fatal error in ../deps/v8/src/api.cc, line 1248 # Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo(). # Illegal instruction: 4
ShadSterling

5

फ़ाइल को इंटरेक्टिव नोड उत्तर में लोड क्यों नहीं किया जाता है?

node -h
-e, --eval script          evaluate script
-i, --interactive          always enter the REPL even if stdin

node -e 'var client = require("./build/main/index.js"); console.log("Use `client` in repl")' -i

फिर आप package.json स्क्रिप्ट में जोड़ सकते हैं

"repl": "node -e 'var client = require(\"./build/main/index.js\"); console.log(\"Use `client` in repl\")' -i",

नोड v8.1.2 का उपयोग करके परीक्षण किया गया


2
सिर्फ क्यों नहीं node -i -r "./build/main/index.js"?
जेड। खुल्ला

4

वर्तमान में आप ऐसा सीधे नहीं कर सकते, लेकिन आप mylib = require('./foo.js')REPL में कर सकते हैं । याद रखें तरीकों का निर्यात किया जाता है, ग्लोबल्स के रूप में घोषित नहीं किया जाता है।


मुझे .load my_work.jsकुछ अतिरिक्त exports.working_var = ...घोषणाओं की आवश्यकता के बावजूद यह बेहतर लगता है , क्योंकि आरईपीएल पूरी तरह से वैध जावास्क्रिप्ट के कुछ प्रकारों पर बारफिल्ट करता है, जैसे बहुस्तरीय टिप्पणियां (कम से कम मेरे readlineकॉन्फ़िगरेशन के साथ )।
चब्रोने

4

replpad शांत है, लेकिन एक फ़ाइल को नोड में लोड करने के लिए एक त्वरित और आसान तरीका के लिए, इसके चर आयात करें और उत्तर शुरू करें, आप अपनी .js फ़ाइल के अंत में निम्नलिखित कोड जोड़ सकते हैं।

if (require.main === module){
    (function() {
        var _context = require('repl').start({prompt: '$> '}).context;
        var scope = require('lexical-scope')(require('fs').readFileSync(__filename));
        for (var name in scope.locals[''] )
            _context[scope.locals[''][name]] = eval(scope.locals[''][name]);
        for (name in scope.globals.exported)
            _context[scope.globals.exported[name]] = eval(scope.globals.exported[name]);
    })();
}

अब यदि आपकी फ़ाइल है src.js, तो रनिंग node src.jsनोड शुरू हो जाएगा, फ़ाइल लोड करें, REPL शुरू करें, और varशीर्ष स्तर पर घोषित सभी वस्तुओं के साथ-साथ किसी भी निर्यात किए गए ग्लोबल्स को कॉपी करें । if (require.main === module)सुनिश्चित होगा कि इस कोड यदि निष्पादित नहीं किया जाएगा src.jsएक के माध्यम से शामिल किया गया है requireबयान। मैं वास्तव में, जब आप वक्तव्य के src.jsअंदर डीबगिंग उद्देश्यों के लिए स्टैंडअलोन चला रहे हों, तो आप किसी भी कोड को जोड़ सकते हैं if


4

यहां जॉर्ज के उत्तर का एक बश फ़ंक्शन संस्करण है :

noderepl() {
    FILE_CONTENTS="$(< $1 )"
    node -i -e "$FILE_CONTENTS"
}

यदि आप इसे अपने में रखते हैं, ~/.bash_profileतो आप इसे एक उपनाम की तरह उपयोग कर सकते हैं, अर्थात:

noderepl foo.js

2
मैं अब महीनों से इसका उपयोग कर रहा हूं, और एक नए शेल वातावरण में संक्रमण के कारण मैंने अपनी कुछ सेटिंग्स खो दीं और इसे फिर से नीचे ट्रैक करना पड़ा। इसलिए जब से मैं यहां हूं, मैंने सोचा कि मैं वास्तव में इस उपयोगी कार्य के लिए आपको धन्यवाद दूंगा।
Xaekai

3

एक और सुझाव जो मुझे यहाँ दिखाई नहीं देता है: इस छोटे से कोड की कोशिश करें

#!/usr/bin/env node
'use strict';

const repl = require('repl');
const cli = repl.start({ replMode: repl.REPL_MODE_STRICT });
cli.context.foo = require('./foo'); // injects it into the repl

तब आप बस इस स्क्रिप्ट को चला सकते हैं और इसमें fooएक चर के रूप में शामिल किया जाएगा


1

पुराना उत्तर

type test.js|node -i

नोड REPL को खोलेगा और test.js से REPL में सभी लाइनों में टाइप करेगा, लेकिन किसी कारणवश फ़ाइल के बाद नोड निकल जाएगा

एक अन्य समस्या यह है, कि फंक्शंस को फहराया नहीं जाएगा।

बेहतर जवाब

node -e require('repl').start({useGlobal:true}); -r ./test2.js

तब test2.js के बिना var के घोषित सभी ग्लोबल्स REPL में उपलब्ध होंगे

निश्चित नहीं है कि वैश्विक दायरे में var क्यों उपलब्ध नहीं होगा


8
कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें
mechnicov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.