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


72

有没有一种方法可以在放入node.js的交互模式之前执行一些代码(在文件或字符串中,没关系)?

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

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

和用户类型,node __preamble__.js他们得到以下输出:

preamble executed! poor guy!
> [interactive mode]

Answers:


103

真的是老问题了,但是...

我相信,我一直在寻找类似的东西,并发现了这一点。您可以打开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);

这会有些奇怪,因为“随着时间的流逝...”每五秒钟(或大约五秒钟)不断出现。但这会起作用!


5
这正是我一直在寻找的东西。有一些警告。一些javascript格式的习惯用法会使repl混乱(我发现这var foo = ""\n\t, bar = "";不起作用),并且不会提供某些全局变量(例如__dirname,您可以在repl会话开始时手动提供)。否则,这太棒了。很强大!
T3db0t 2013年

它也无法使用someObject.doStuff()\n.doMoreStuff()。它吐出来了Invalid REPL keyword-似乎正在试图将其解释为某种命令。
tomekwi 2014年

很高兴我不断滚动+1
Keon 2015年

更新了此答案,使它位于顶部,同时清除了它的工作原理。
凯尔·凯利

@KyleKelley不要那样做。meta.stackoverflow.com/questions/320291/...

28

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

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

从REPL内你就可以打电话pause()resume()和执行功能pauseHTTP()resumeHTTP()直接。只需将您要公开的内容分配给REPL的context成员即可。


我将如何vm.runInThisContext()使用repl?

@Matt:嘿,我认为你是对的。我更关注标题执行一些代码然后进入交互式节点的问题,而不是问题:在加入node.js的交互模式之前,有没有一种方法可以执行一些代码...?,这只是排序的假设node将启动交互模式。我不确定如何回答其他问题-您可以添加一个吗?谢谢。
sarnold

2
@Matt:我在node源头看不到有什么办法可以满足您的要求;您可以编写一个shell脚本来执行类似的操作。(-e命令行开关允许您运行命令,但是您必须编写类似的代码才能自己启动REPL。)
sarnold 2012年

1
是我的版本,使用repl和bash脚本/别名来运行它。它对我
有用

2
非常烦人的是,我现在必须按Ctrl + q 4次才能退出...甚至之前2次也不过是1倍而已...如何解决此问题?
davidhq '16

24

这可以通过当前版本的NodeJS5.9.1)实现:

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

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

您可以在参考的请求请求中阅读更多内容


3
这应该是最佳答案,所有其他答案均已过时AF
lasec0203

3
此答案允许从输入字符串执行某些代码,但不允许从文件执行代码 停留在REPL中。这样,node+。load ./script.js答案更好。
jakub.g

1
在bash之类的东西中,您也可以使用node -i -e "$(< ./script.js)"文件。
丹尼尔·夏普

2
node -i -e "require('./script.js')"也用于文件。
user1742529 '20

9

node -r允许您在REPL启动时需要一个模块。NODE_PATH设置模块搜索路径。因此,您可以在命令行上运行以下内容:

NODE_PATH=. node -r myscript.js

这应该使您处于加载脚本的REPL中。


2
这真太了不起了。这样一个简单的答案,以及
aggregate116​​6877

7

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

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功能。


1
纳什很棒。谢谢。
姚靖国2015年

3

编辑:忽略此。@ jaywalking101的答案要好得多。改为这样做。

如果您是从Bash shell(Linux,OS X,Cygwin)内部运行,则

cat __preamble__.js - | node -i

将工作。这也从评估序言.js的每一行中散发出很多噪音,但是后记将落在所需上下文中的交互式外壳中。

(“-”至“ cat”仅指定“使用标准输入”。)


1
这对我不起作用。该脚本只是执行并返回外壳。
Mauvis Ledford

确保将其包括在内-。当然可以,但是您无法在REPL中完成制表符的功能。
凯尔·凯利

出于某些原因(?),使用cat打印选项javascript并传递给带有-i选项的节点将阻止使用历史记录命令(箭头键),而这些命令将使用$node; and the .load myfile.js`起作用。当然,对于后者,您松开了一种将其作为命令的方法。
loretoparisi

2

与@slacktracer类似的答案,但是如果您可以global在脚本中很好地使用require它,则可以简单地使用它,而不是使用和学习.load

范例lib.js

global.x = 123;

node会话示例:

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

作为一个很好的副作用,您甚至不必var x = require('x'); 0跳舞,因为它module.exports仍然是一个空对象,因此require结果将不会用模块的内容填满屏幕。


require的路径不是我启动REPL的路径。
kzh 2015年

2

创建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。


在内部时如何要求特定的模块vorpal
loretoparisi 2016年

您可以require在启动时仅使用vanilla js要求它们,或者发出需要它们的Vorpal命令。查看Vorpal API以获得更多详细信息。
2016年

0

本机没有办法。您可以输入节点交互式外壳程序node或运行您拥有的脚本node myScrpt.js。@sarnold是正确的,因为如果您想为自己的应用程序使用它,则需要自己制作,使用repl工具包对此类事情很有帮助。


同意,我在玩repl。当然,这是一个开发工具,我不会(以任何方式)将其推荐给生产环境。加上依赖项之一是用于节点的“包含”工具……它的全部内容就是共享上下文以与本来可以在模块封装中锁定的东西一起玩
neu-rah 2015年

0

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

npm install nit-tool -g

我已经从这个和类似的帖子中收集了这些信息,谢谢大家,我可以随意改进
neu-rah 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.