执行一些代码,然后进入交互式节点

时间:2011-12-18 01:07:17

标签: javascript node.js

在node.js中进入交互模式之前,有没有办法执行某些代码(在文件中或从字符串中,并不重要)?

例如,如果我创建一个包含以下内容的脚本__preamble__.js

console.log("preamble executed! poor guy!");

并且用户输入node __preamble__.js他们得到此输出:

preamble executed! poor guy!
> [interactive mode]

10 个答案:

答案 0 :(得分:90)

真的很老问题但是......

我相信,我正在寻找类似的东西,并发现了这一点。 您可以打开REPL(在终端上键入node),然后加载文件。 像这样:.load ./script.js。 按Enter键,将执行文件内容。现在,脚本中创建的所有内容(对象,变量,函数)都可用。

例如:

// script.js
var y = {
    name: 'obj',
    status: true
};

var x = setInterval(function () {
    console.log('As time goes by...');
}, 5000);

在REPL上:

//REPL
.load ./script.js

现在您键入REPL并与“生活代码”进行交互。 您可以console.log(y)clearInterval(x);

这将有点奇怪,因为“随着时间的推移......”每五秒钟(或左右)继续出现。 但它会奏效!

答案 1 :(得分:24)

您可以非常轻松地在Node软件中启动新的repl

var repl = require("repl");
var r = repl.start("node> ");
r.context.pause = pauseHTTP;
r.context.resume = resumeHTTP;

然后,您可以在REPL中调用pause()resume()并直接执行pauseHTTP()resumeHTTP()这两项功能。只需将您想要公开的内容分配给REPL的context成员。

答案 2 :(得分:19)

这可以通过current version of NodeJS5.9.1):

来实现
$ node -i -e "console.log('A message')"

-e标志评估字符串,-i标志开始交互模式。

您可以在引用的pull request

中阅读更多内容

答案 3 :(得分:7)

我最近开始了一个项目,为Node和相关语言(如CoffeeScript)创建高级交互式shell。其中一个功能是在启动时在解释器的上下文中加载文件或字符串,其中考虑了加载的语言。

http://danielgtaylor.github.com/nesh/

示例:

# Load a string (Javascript)
nesh -e 'var hello = function (name) { return "Hello, " + name; };'

# Load a string (CoffeeScript)
nesh -c -e 'hello = (name) -> "Hello, #{name}"'

# Load a file (Javascript)
nesh -e hello.js

# Load a file (CoffeeScript)
nesh -c -e hello.coffee

然后在解释器中,您可以访问hello函数。

答案 4 :(得分:7)

--ignore-ssl-errors=true --ssl-protocol=any --debug=true 允许您在REPL启动时需要一个模块。 node -r设置模块搜索路径。所以你可以在命令行上运行这样的东西:

NODE_PATH

这应该会在加载脚本的情况下将您置于REPL中。

答案 5 :(得分:2)

编辑:忽略这一点。 @jaywalking101的答案要好得多。那样做。

如果你是从Bash shell(Linux,OS X,Cygwin)内部运行,那么

cat __preamble__.js - | node -i

会奏效。这也会通过评估前导 .js的每一行来产生大量噪音,但是在您想要的上下文中,您将进入交互式shell。

(' - '到'cat'只是指定“使用标准输入”。)

答案 6 :(得分:2)

@slacktracer的类似答案,但如果你在脚本中使用global就可以了,你只需require而不是(学习和)使用.load

示例lib.js

global.x = 123;

示例node会话:

$ node
> require('./lib')
{}
> x
123

作为一个很好的副作用,您甚至不必进行var x = require('x'); 0舞蹈,因为module.exports仍然是一个空对象,因此require结果将无法填充使用模块的内容启动屏幕。

答案 7 :(得分:1)

Vorpal.js就是为了做到这一点。它提供了一个API,用于在应用程序的上下文中构建交互式CLI。

它包含插件,其中一个是Vorpal-REPL。这使您可以键入repl,这将使您进入应用程序上下文中的REPL

实施示例:

var vorpal = require('vorpal')();
var repl = require('vorpal-repl');
vorpal.use(repl).show();

// Now you do your custom code...

// If you want to automatically jump
// into REPl mode, just do this:
vorpal.exec('repl');

这就是全部!

免责声明:我写了Vorpal。

答案 8 :(得分:0)

本地没有办法做到这一点。您可以输入节点交互式shell node或运行您拥有node myScrpt.js的脚本。 @sarnold是对的,因为如果你想要你的应用程序,你需要自己做,并使用repl工具包对这种事情是有帮助的

答案 9 :(得分:0)

nit-tool 允许您将节点模块加载到repl交互式中,并且可以访问内部模块环境(连接上下文)以进行开发目的

npm install nit-tool -g