90

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

例如,如果我创建一个脚本__序言__.js其中包括:

log(“序言已执行!可怜的家伙!”);

和用户类型节点__preamble__.js他们得到这个输出:

已执行序言!可怜的家伙!>[交互模式]
1
  • 1
    “被处决了!可怜的家伙!”:喜欢^^ 评论 2023年8月30日15:18

12个答案12

重置为默认值
126

真的是个老问题,但是。。。

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

例如:

//脚本.js变量y={name:'对象',状态:true};var x=设置间隔(函数(){console.log(“随着时间流逝……”);}, 5000);

在REPL上:

//REPL(更换).load./script.js

现在,您在REPL上键入并与“活动代码”交互。你可以控制台.log(y)清除间隔(x);

这有点奇怪,因为“随着时间的推移……”每隔五秒左右就会出现一次。但它会起作用的!

7
  • 6
    这正是我想要的。这里有一些警告;一些javascript格式习惯用法会混淆repl(我发现var foo=“”\n\t,bar=“”;不起作用),并且将不提供某些全局变量(例如__目录名,您可以在repl会话开始时手动提供)。否则,这太棒了。非常强大!
    – T3db0吨
    评论 2013年6月30日0:41
  • 它也无法与someObject.doStuff()\n.doMoreStuff().它吐出来无效的REPL关键字–似乎试图将其解释为某种命令。
    – 托梅奎
    评论 2014年11月10日18:34
  • 很高兴我一直滚动+1 评论 2015年6月11日3:46
  • 更新了此答案,使其位于顶部,同时明确了其工作原理。 评论 2016年1月23日18:18
  • @凯尔·凯利不要那样做。meta.stackoverflow.com/questions/320291/…
    – 
    评论 2016年4月2日23:20
32

你可以开始新的回复在Node软件中:

var repl=要求(“repl”);var r=repl.start(“节点>”);r.context.pause=暂停HTTP;r.context.resume=恢复HTTP;

在REPL中,您可以调用暂停()恢复()并执行功能暂停HTTP()恢复HTTP()直接。只需将要公开的内容分配给REPL上下文成员。

7
  • 我该如何使用vm.runInThisContext()使用repl?
    – 用户961528
    评论 2011年12月19日17:34
  • @马特:嘿,我想你是对的。我更注意标题执行一些代码,然后进入交互式节点而不是这个问题有没有办法执行一些代码。。。在node.js中进入交互模式之前?,这只是一种假设那个节点将启动交互模式。我不知道如何回答不同的问题——你能加一个吗?谢谢。
    – 沙罗
    评论 2012年5月15日20:44
  • 2
    @马特:我在节点来源做你要求的;不过,可以编写一个shell脚本来执行类似的操作.(-e(电子)命令行开关允许您运行命令,但您必须编写类似的代码才能自己启动REPL。)
    – 沙罗
    评论 2012年5月15日22:19
  • 1
    在这里是我的版本,使用repl和bash脚本/别名运行它-D类 评论 2014年2月28日14:07
  • 2
    现在我必须按Ctrl+q四次才能退出,这很烦人。。。即使是2次也比以前多了1次。。。如何解决这个问题? 评论 2016年2月28日11:16
24

这可以通过NodeJS的当前版本(5.9.1):

$node-i-e“console.log('A消息')”

这个-e(电子)标志计算字符串和-我标志开始交互模式。

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

4
  • 8
    这个答案允许从输入字符串执行一些代码,但不允许从文件中执行代码 停留在REPL.这样,节点+ .负载/脚本.js答案更好。 评论 2019年5月2日7:36
  • 2
    在bash之类的东西中,您还可以使用节点-i-e“$(<./script.js)”用于文件。 评论 2019年8月1日7:52
  • 节点-i-e“需要('./script.js')”也适用于文件。 评论 2020年3月26日7:19
  • 如果你需要('./script.js'),该脚本的名称空间都不可用于交互式会话
    – 海牛兽
    评论 2022年2月12日19:29
13

节点-r允许您在REPL启动时需要模块。节点_路径设置模块搜索路径。因此,您可以在命令行上运行以下命令:

节点路径=。节点-r myscript.js

这应该会将您放入一个REPL中,并加载您的脚本。

1
  • 1
    这不适用于较新的ESM模块。我认为需要不同的语法。 评论 4月15日11:35
7

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

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

示例:

#加载字符串(Javascript)nesh-e'var hello=function(name){return“hello,”+name;};'#加载字符串(CoffeeScript)nesh-c-e'hello=(name)->“你好,#{name}”'#加载文件(Javascript)nesh-e你好.js#加载文件(CoffeeScript)nesh-c-e你好咖啡

然后在口译员中,您可以访问你好功能。

0
6

编辑:忽略此项@乱穿马路101的答案要好得多。改为这样做。

如果您在Bash shell(Linux、OS X、Cygwin)中运行,那么

cat __preamble_.js-|节点-i

这也会在评估每行序言.js,但后记是您在想要的上下文中登录到交互式shell中。

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

  • 1
    这对我来说不起作用。脚本只是执行并返回shell。 评论 2013年3月21日17:13
  • 确保你包括了-猫。它当然可以工作,但您失去了在REPL中完成标签的能力。 评论 2016年1月23日18:17
  • 由于某些原因(?)使用cat打印javascript脚本并使用传递到节点-我选项将阻止使用历史命令(箭头键),而这些命令将使用$节点;.load myfile.js`。当然,对于后者,您会失去将其作为命令的方法。 评论 2016年4月12日13:10

类似于@slacktracer的答案,但如果你可以使用全球的在脚本中,您可以简单地要求它代替了(学习和)使用.载荷.

例子图书馆.js:

全局.x=123;

例子节点会话:

$节点>require(“./lib”){}>x个123

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

1
  • require的路径不是我开始repl的路径。
    – 千日圆
    评论 2015年7月23日15:31
2

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

它包括插件,其中之一是Vorpal-REPL公司。这允许您键入回复这会让你进入REPL在应用程序的上下文中.

实施示例:

var vorpal=要求(“vorpal”)();var repl=要求('vorpal-repl');vorpal.use(repl).show();//现在你可以自定义代码了。。。//如果你想自动跳转//进入REPl模式,只需执行以下操作:vorpal.exec(“回复”);

这就是全部!

免责声明:我写了Vorpal。

2
  • 如何在内部要求特定模块沃尔帕尔? 评论 2016年4月12日13:06
  • 您可以只需要使用vanilla js就可以了要求启动时,或生成需要它们的Vorpal命令。查看Vorpal API了解更多详细信息。
    – 数据树
    评论 2016年4月12日21:56
0

这不是天生的。您可以进入节点交互式shell节点或运行您拥有的脚本节点myScrpt.js.@sarnold是对的,因为如果你想在你的应用程序中使用它,你需要自己制作,而使用repl工具包对这类事情很有帮助

1
  • 同意,我在玩repl。这当然是一个开发工具,我不建议(以任何方式)将其用于生产环境。加上一个依赖项是节点的“包含”工具。。。它实际上是关于共享上下文来处理那些本来会被锁定在模块封装中的东西
    – 纽-拉
    评论 2015年11月13日22:29
0

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

npm安装nit-tool-g
0
0

首先我试过了

$node—交互式foo.js

但它只运行foo.js,没有REPL。

如果您正在使用出口进口在js中,运行npm初始化-y,然后告诉节点您正在将模块与“type”:“模块”,线路-

{“name”:“neomem”,“版本”:“1.0.0”,“描述”:“”,“type”:“模块”,“main”:“home.js”,“关键词”:[],“作者”:“”,“许可证”:“ISC”}

然后可以运行节点并使用动态导入导入文件-

$节点欢迎使用Node.js v18.10。键入“.help”以获取更多信息。>home=等待导入('./home.js')[模块:空原型]{get:[AsyncFunction:get],start:[AsyncFunction:start]}>home.get(“你好”)

这是一种迂回的方式——有一个命令行开关会很好。。。

0

这是另一种方式

节点-i-e“$(cat-script.js)”

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.