How do I load my script into the node.js REPL?

Javascriptnode.jsRead Eval-Print-Loop

Javascript Problem Overview


I have a script foo.js that contains some functions I want to play with in the REPL.

Is there a way to have node execute my script and then jump into a REPL with all the declared globals, like I can with python -i foo.py or ghci foo.hs?

Javascript Solutions


Solution 1 - Javascript

There is still nothing built-in to provide the exact functionality you describe. However, an alternative to using require it to use the .load command within the REPL, like such:

.load foo.js

It loads the file in line by line just as if you had typed it in the REPL. Unlike require this pollutes the REPL history with the commands you loaded. However, it has the advantage of being repeatable because it is not cached like require.

Which is better for you will depend on your use case.


Edit: It has limited applicability because it does not work in strict mode, but three years later I have learned that if your script does not have 'use strict', you can use eval to load your script without polluting the REPL history:

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

Solution 2 - Javascript

i always use this command

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

works exactly as in Python without any packages.

Solution 3 - Javascript

I made Vorpal.js, which handles this problem by turning your node add into an interactive CLI. It supports a REPL extension, which drops you into a REPL within the context of your running app.

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

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

Then you can run the app and it will drop into a REPL.

$ node myapp.js repl
myapp> repl: 

Solution 4 - Javascript

Another way is to define those functions as global.

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

Then preload the file in the REPL as:

node -r ./file.js

Then the function helloWorld can be accessed directly in the REPL.

Solution 5 - Javascript

Here's a bash function version of George's answer:

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

If you put this in your ~/.bash_profile you can use it like an alias, i.e.:

noderepl foo.js

Solution 6 - Javascript

I created replpad since I got tired of reloading the script repeatedly.

Simply install it via: npm install -g replpad

Then use it by running: replpad

If you want it to watch all files in the current and all subdirectories and pipe them into the repl when they change do: replpad .

Check out the videos on the site to get a better idea of how it works and learn about some other nice features that it has like these:

  • access core module docs in the repl via the dox() function that is added to every core function, i.e. fs.readdir.dox()
  • access user module readmes in the repl via the dox() function that is added to every module installed via npm, i.e. marked.dox()
  • access function's highlighted source code, info on where function was defined (file, linenumber) and function comments and/or jsdocs where possible via the src property that is added to every function, i.e. express.logger.src
  • scriptie-talkie support (see .talk command)
  • adds commands and keyboard shortcuts
  • vim key bindings
  • key map support
  • parens matching via match token plugin
  • appends code entered in repl back to file via keyboard shortcut or .append command

See: https://github.com/thlorenz/replpad

Solution 7 - Javascript

Why not load the file into an interactive node repl?

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

Then you can add to package.json scripts

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

tested using node v8.1.2

Solution 8 - Javascript

Currently you can't do that directly, but you can mylib = require('./foo.js') in the REPL. Remember methods are exported, not declared as globals.

Solution 9 - Javascript

replpad is cool, but for a quick and easy way to load a file into node, import its variables and start a repl, you can add the following code to the end of your .js file

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]);
    })();
}

Now if your file is src.js, running node src.js will start node, load the file, start a REPL, and copy all the objects declared as var at the top level as well as any exported globals. The if (require.main === module) ensures that this code will not be executed if src.js is included through a require statement. I fact, you can add any code you want to be excuted when you are running src.js standalone for debugging purposes inside the if statement.

Solution 10 - Javascript

Another suggestion that I do not see here: try this little bit of code

#!/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

Then you can simply run this script and it will include foo as a variable

Solution 11 - Javascript

Old answer

type test.js|node -i

Will open the node REPL and type in all lines from test.js into REPL, but for some reason node will quit after file ends

Another problem is, that functions will not be hoisted.

Better answer

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

Then all globals declared without var within test2.js will be available in the REPL

not sure why var a in global scope will not be available

Solution 12 - Javascript

There is an Official Node.js REPL that supports also async methods

console.js

const repl = require('repl')
const mongoose = require('mongoose')

const run = async () => {
	await mongoose.connect(process.env.DB_URL, {
		useNewUrlParser: true,
		useUnifiedTopology: true
	})

	const r = repl.start(`(${process.env.NODE_EN}) ⚡️ `)
	r.context.User = require('./src/models/user.model')
	r.context.mongoose = mongoose
	console.log(`Ready 🚀`);
}

run()

Start the console:

NODE_OPTIONS=--experimental-repl-await node console.js

User model its exposed to console

await User.find({})

source

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionhugomgView Question on Stackoverflow
Solution 1 - Javascriptvossad01View Answer on Stackoverflow
Solution 2 - JavascriptGeorge ShalvashviliView Answer on Stackoverflow
Solution 3 - JavascriptdthreeView Answer on Stackoverflow
Solution 4 - JavascriptAshish ChaudharyView Answer on Stackoverflow
Solution 5 - JavascriptEliotView Answer on Stackoverflow
Solution 6 - JavascriptThorsten LorenzView Answer on Stackoverflow
Solution 7 - Javascriptlfender6445View Answer on Stackoverflow
Solution 8 - JavascriptRicardo TomasiView Answer on Stackoverflow
Solution 9 - JavascriptyegodzView Answer on Stackoverflow
Solution 10 - JavascriptcorvidView Answer on Stackoverflow
Solution 11 - JavascriptSam WashingtonView Answer on Stackoverflow
Solution 12 - JavascriptmsrootView Answer on Stackoverflow