2014-06-08 53 views
8

在Python中有一个很好的功能,python -i。例如,python -i myprogram.py将运行该程序,然后进入交互模式,就好像我已将整个程序粘贴到交互式shell中一样。什么是python -i的node.js模拟:运行并进入交互模式?

node.js中是否有类似的命令?

+1

节点命令行实用程序还具有用于进入交互模式(即REPL)的'-i'修饰符,但如果您传递其他参数(如要执行的文件),则它不起作用。 –

+4

[执行一些代码然后进入交互式节点]的可能的重复(https://stackoverflow.com/questions/8549145/execute-some-code-and-then-go-into-interactive-node) – jpaugh

回答

3

我认为节点可执行文件不允许您将-i与任何其他文件参数结合使用。

这可能不是您想要阅读的解决方案。但是,这对我有效。有一个叫做REPL的模块,基本上可以让你手动执行。所以,我意识到,我可以创建一个围绕任何文件的包装,如下所示:

#!/bin/bash 

COMMAND=$(cat <<EOF 
(function(){ 
    var repl = require('repl'); 

    process.stdin.push('.load ${1}\n'); 

    repl.start({ 
     useGlobal:true, 
     ignoreUndefined:true, 
     prompt:'> ' 
    }); 
})(); 
EOF 
) 

node -e "${COMMAND}" 

假如你把这个脚本nodejs,那么我可以把这个脚本做这样的事情

nodejs ./demo.js 

它启动以编程方式REPL并将脚本加载到其中。这相当于手动打开REPL会话,然后运行命令.load <file>

+0

此方法有我发现有一些缺点。脚本中的局部变量不可用于检查,但全局是。 – osa

+0

@SergeyOrshanskiy我已经编写了一个新版本的程序,将您的脚本加载到当前会话中,而不是仅仅需要该模块。这应该工作。 –

2

文档在https://nodejs.org/api/cli.html

-r, --require module

预压在启动时指定的模块。

遵循require()的模块解析规则。模块可以是文件的路径,也可以是节点模块名称的 路径。

node -i -r ./myprogram.js

-e, --eval "script"

评估以下参数,如JavaScript。在REPL中预定义的模块 也可以在脚本中使用。

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

这些功能,因为在2014年之前的响应与下面的拉请求已被添加。

+0

有没有办法从REPL访问所需的模块? – Antimony

1

不幸的是,节点具有用于此没有内建溶液。正如这里所提到的,您可以使用-r选项预加载模块,但是您仍然无法从REPL访问它们,因此有点无用。

到目前为止,我已经找到了最好的解决方法是做

cat ./test.js - | node -i 

哪里test.js是要运行该文件。这通过stdin发送它,就好像你自己输入了文件,然后等待额外的输入。一个缺点是它会在命令提示符下将文件和每行结果回显给您。