如何在保留所有环境的情况下挂起节点REPL并在稍后阶段恢复
How to suspend node REPL and resume at a later stage with all the environment preserved?
我希望挂起一个REPL会话,这样我就可以关闭系统,然后在以后的时间继续在REPL会话上工作,就好像我从未关闭过它一样,也就是说,不必失去所有的环境。
我认为可能的解决办法是
快照内存,保存到文件,然后从文件加载env :我认为这将是最简洁的解决方案,就像你使用Windows的"休眠"功能一样。我已经找到了这个堆转储实用程序,它旨在采取内存快照来分析内存泄漏,但我不知道您是否可以从该快照中恢复整个环境,我没有找到这样做的工具。
保存命令并重放:这种方法的一个主要缺点是,虽然它适用于简单的事情,如
var x = "Hello World";
,它不会工作的东西,如var reciptId = bankAccount.makePayment(1000);
,因为它会重复每次重放的动作,而不是保存原始函数调用的细节。序列化/反序列化整个环境:这将涉及到制作环境中存在的所有对象的列表,然后制作一种机制将它们每个对象写入文件,即序列化它们,然后制作一种机制反序列化这些对象并在需要时加载它们。我还没有看到一种干净的方式来序列化和反序列化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会话中的任何变量或函数可用。
希望这对你有帮助,我认为它符合你的需求。
我认为您正在寻找的是如何暂停和恢复进程。请参阅如何挂起和恢复进程
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- 如何临时暂停浏览器渲染,然后恢复整个页面
- NodeJS-readline暂停和恢复事件发射器(逐行读取)
- 谷歌地图劫持了iphone's滚动(触摸事件)-如何恢复
- 我希望在不替换现有变量的情况下恢复localStorage中的变量
- 克隆和恢复”;工具化的“;元素
- 如何暂停和恢复jquery间隔
- 在python中,我如何才能恢复被隐藏的元素的内容
- javascript恢复样式
- 在意外断电时恢复JS计时器
- 将JSON存储和恢复到此Ionic应用程序的最有效方法
- 在文本区域禁用javascript定义的keydown事件并恢复默认行为
- 将嵌套的主干模型存储并恢复到本地存储中
- 当客户端在JW Player中恢复丢失的连接时,会自动重新连接
- 从jquery对话框恢复原始数据,脚本不起作用
- 如何恢复Kinetic.js鼠标事件
- CRM 2011,保存后,字段将恢复为不可见
- 如何保存和恢复表单字段中的多个值(仅使用前端逻辑)
- 验证输入字段并恢复上一个有效值
- 如何在jQuery中恢复文本字段的默认值