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

68 javascript node.js

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

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

console.log("preamble executed! poor guy!");
Run Code Online (Sandbox Code Playgroud)

和用户输入node __preamble__.js他们获得此输出:

preamble executed! poor guy!
> [interactive mode]
Run Code Online (Sandbox Code Playgroud)

sla*_*cer 95

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

我相信,我正在寻找类似的东西,并发现了这一点.您可以打开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);
Run Code Online (Sandbox Code Playgroud)

在REPL上:

//REPL
.load ./script.js
Run Code Online (Sandbox Code Playgroud)

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

这将有点奇怪,导致"随着时间的流逝......"每五秒钟(或左右)继续出现.但它会奏效!

  • 这正是我正在寻找的.有一些警告; 一些javascript格式化的习惯用法会混淆repl(我发现`var foo =""\n\t\t,bar ="";``不起作用),并且不会提供某些全局变量(例如`__dirname`,其中您可以在repl会话开始时手动提供).否则,这太棒了.很强大! (4认同)

sar*_*old 26

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

var repl = require("repl");
var r = repl.start("node> ");
r.context.pause = pauseHTTP;
r.context.resume = resumeHTTP;
Run Code Online (Sandbox Code Playgroud)

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

  • @Matt:我没有看到`node`来源做任何你想要的事情; 你[虽然可以写一个shell脚本来做类似的事情](http://css.dzone.com/articles/execute-code-each-time-nodejs).(`-e`命令行开关可以让你运行命令,但你必须编写类似的代码来自己启动一个REPL.) (2认同)
  • 现在我要按Ctrl + q 4次退出是非常烦人的...即使2次也是1次太多之前...如何解决这个问题? (2认同)

gne*_*kus 23

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

$ node -i -e "console.log('A message')"
Run Code Online (Sandbox Code Playgroud)

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

您可以在引用的pull请求中阅读更多内容

  • 这个答案允许从输入字符串执行一些代码,但不允许从文件_执行代码_**和**_留在REPL_中。这样,`node` + .`load ./script.js` 答案更好。 (5认同)
  • 这应该是最好的答案,所有其他的都是过时的AF (3认同)
  • 如果您使用“require('./script.js')”,则该脚本的命名空间将不可用于交互式会话 (3认同)
  • 在 bash 之类的东西中,您还可以对文件使用 `node -i -e "$(< ./script.js)"` 。 (2认同)
  • 文件也有 `node -i -e "require('./script.js')"` 。 (2认同)

Doh*_*son 8

node -r允许您在REPL启动时需要一个模块.NODE_PATH设置模块搜索路径.所以你可以在命令行上运行这样的东西:

NODE_PATH=. node -r myscript.js

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

  • 这真太了不起了。这么简单的答案 (2认同)

Dan*_*iel 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
Run Code Online (Sandbox Code Playgroud)

然后在解释器中,您可以访问该hello功能.


fid*_*ath 6

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

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

cat __preamble__.js - | node -i
Run Code Online (Sandbox Code Playgroud)

将工作。这也会在评估前导码.js的每一行时产生大量噪音,但之后您会在所需的上下文中进入交互式 shell。

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