如何在保留所有环境的情况下挂起节点REPL并在稍后阶段恢复

How to suspend node REPL and resume at a later stage with all the environment preserved?

本文关键字:段恢复 恢复 REPL 节点 保留 环境 挂起 情况下      更新时间:2023-09-26

我希望挂起一个REPL会话,这样我就可以关闭系统,然后在以后的时间继续在REPL会话上工作,就好像我从未关闭过它一样,也就是说,不必失去所有的环境。

我认为可能的解决办法是

  1. 快照内存,保存到文件,然后从文件加载env :我认为这将是最简洁的解决方案,就像你使用Windows的"休眠"功能一样。我已经找到了这个堆转储实用程序,它旨在采取内存快照来分析内存泄漏,但我不知道您是否可以从该快照中恢复整个环境,我没有找到这样做的工具。

  2. 保存命令并重放:这种方法的一个主要缺点是,虽然它适用于简单的事情,如var x = "Hello World";,它不会工作的东西,如var reciptId = bankAccount.makePayment(1000);,因为它会重复每次重放的动作,而不是保存原始函数调用的细节。

  3. 序列化/反序列化整个环境:这将涉及到制作环境中存在的所有对象的列表,然后制作一种机制将它们每个对象写入文件,即序列化它们,然后制作一种机制反序列化这些对象并在需要时加载它们。我还没有看到一种干净的方式来序列化和反序列化js变量没有限制。我认为这种方法的主要限制是它不能保留引用,因此对象失去了它们的类,在序列化时必须复制,在反序列化时失去相等性。 var f = function (x) {...}; var a = {}; a.f = f; a.f === f? //is true, not true if your serialization mechanism saves a function defn for f and a.f separately and deserializes them separately 循环引用可能不起作用(x = {}; x.cyclic = x;…)。因此,这种方法,如果它真的有效,将需要大量的脏工作。

所以真正的问题是,实现我希望实现的目标有多难?还有其他的解决方案吗?在实现这一目标的过程中,是否存在我忽视的主要障碍?

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

相关:

    Swift REPL:如何保存/加载REPL状态?(也就是挂起/恢复、快照、克隆)

所以如果你想要能够"暂停"一个REPL会话,然后在关闭后捡起你离开的地方似乎不能直接在Node.js的REPL中使用。与此最接近的是(我认为)在Node 4.2.1中添加的REPL的Persistent History特性。这将允许您以纯文本形式查看REPL中命令的历史记录,但这是Node中最接近的东西。

<

持久历史/h2>

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

Node.js/io.js v2以前版本。使用NODE_REPL_HISTORY_FILE环境变量控制REPL历史记录,历史记录以JSON格式保存。该变量现在已被弃用,您的REPL历史记录将自动转换为使用纯文本。新文件将保存到您的主目录,或者由NODE_REPL_HISTORY变量定义的目录,如下所示。

REPL模块的完整文档在这里。

然而,有一个REPL"包装器";节点模块,它将执行您的请求。您可以做的是,将您的REPL历史记录保存到一个文件中,然后在下一个会话中加载历史文件,并在下一个REPL会话中访问您保存到文件中的内容。模块是Nesh。它有很多额外的功能,包括配置你的shell和评估不同版本的JS,如ES6/ES7(使用Babel) &Coffeescript .

安装松软的:

npm install -g nesh

通过简单地键入nesh在终端中启动新闻。像在任何其他REPL会话中一样工作,当你想保存时,你可以在refresh中输入以下命令来保存你的REPL历史记录到给定的文件:

.save <filepath>

在您的下一个REPL会话中,即使在关机之后,您也可以通过输入

重新启动您的新会话并重新加载您的历史记录:

.load <filepath>

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

希望这对你有帮助,我认为它符合你的需求。

我认为您正在寻找的是如何暂停和恢复进程。请参阅如何挂起和恢复进程

的答案。