如何暂停节点REPL并在所有环境保留的后期恢复?

我希望暂停REPL会话,这样我可以closures系统,然后再继续在REPL会话上工作,就好像我永远不会closures系统一样,即不会丢失所有的环境。

我认为可能的解决scheme是这样的

  1. 快照内存,保存到文件并在以后从文件加载env :我认为这将是最好的解决scheme,就像使用Windows的“hibernate”function时发生的那样。 我发现这个heapdump实用程序是为了获取内存快照来分析内存泄漏,但我不知道是否可以从该快照中重新生成整个环境,而且我也没有发现这样做的工具。

  2. 保存命令并重放它们 :这个方法的一个主要缺点是它适用于像var x = "Hello World";这样简单的东西var x = "Hello World"; ,它不适用于var reciptId = bankAccount.makePayment(1000); 因为它将重复每个重播操作,而不是保存原始函数调用的细节。

  3. 序列化/反序列化整个环境 :这将包括列出环境中存在的所有对象,然后build立一个机制,将它们中的每一个写入一个文件,即将它们序列化,然后build立一个反序列化机制并加载它们在需要的时候。 我还没有看到一个干净的方式来序列化和反序列化JSvariables没有限制。 我认为这种方法的主要限制是它无法保留引用,所以对象松散他们的类,事情将不得不被重复序列化,并失去其反序列化的平等 – 例如var f = function (x) {...}; var a = {}; af = f; af === f? //is true, not true if your serialization mechanism saves a function defn for f and af separately and deserializes them separately var f = function (x) {...}; var a = {}; af = f; af === f? //is true, not true if your serialization mechanism saves a function defn for f and af separately and deserializes them separately var f = function (x) {...}; var a = {}; af = f; af === f? //is true, not true if your serialization mechanism saves a function defn for f and af separately and deserializes them separately ,循环引用可能不起作用( x = {}; x.cyclic = x; …)。 所以这个方法,如果有效的话需要很多肮脏的工作。

所以问题是,要实现我想达到的目标有多难? 有什么可以做一些其他的解决scheme呢? 是否有阻碍我实现这个目标?

此外,是否有任何替代节点repl程序(如浏览器中的控制台), 可以像这样暂停?

相关:

  • Swift REPL:如何保存/加载REPL状态? (又名暂停/恢复,快照,克隆)

所以如果你希望能够“暂停”一个REPL会话,然后在Node.js的REPL中看不到直接可用的closures之后继续停止。 最接近这个的是在节点4.2.1中增加(我认为)的REPL的持久历史function。 这将允许您在纯文本中查看您的REPL中的命令的历史logging,但这是最接近Node的开箱即用function。

持久的历史

默认情况下,REPL将通过保存到用户主目录中的.node_repl_history文件来保存节点REPL会话之间的历史logging。 这可以通过设置环境variablesNODE_REPL_HISTORY =“”来禁用。

以前在Node.js / io.js v2.x中,REPL历史logging是使用NODE_REPL_HISTORY_FILE环境variables控制的,历史logging是以JSON格式保存的。 这个variables现在已经被弃用了,你的REPL历史logging将被自动转换为纯文本格式。 新文件将被保存到您的主目录或由NODE_REPL_HISTORYvariables定义的目录中,如下所述。

有关REPL模块的完整文档可以在这里find 。

但是,有一个REPL“包装器”节点模块,可以完成你所要求的function。 你可以做的是,把你的REPL历史logging保存到一个文件中,然后在下一个会话中加载历史文件,并在下一个REPL会话中访问你保存的文件。模块是Nesh 。 它有很多额外的function,包括configuration你的shell和评估不同版本的JS,如ES6 / ES7(Using Babel)&Coffeescript。

安装nesh:

npm install -g nesh

只需inputnesh ,在terminal中启动nesh 。 像其他REPL会话中一样工作,当您想要保存时,您可以在nesh中键入以下内容以将REPL历史logging保存到给定的文件中:

.save <filepath>

在您的下一个REPL会话中,即使在closures之后,也可以重新启动您的nesh会话并通过键入以下命令重新加载历史logging:

.load <filepath>

这将重新评估整个历史文件,并将使当前REPL / nesh会话中的任何variables或函数可用。

希望这是有益的,我认为这符合您的需求。

我想你正在寻找的是如何暂停和恢复一个过程。 看到如何暂停和恢复过程的这个答案