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

Javascript 如何在保留所有环境的情况下挂起节点REPL并在稍后阶段恢复?,javascript,node.js,read-eval-print-loop,Javascript,Node.js,Read Eval Print Loop,我希望暂停REPL会话,以便关闭系统,然后在以后的时间继续处理REPL会话,就好像我从未关闭过它一样,也就是说,不必失去所有环境 我认为可能的解决办法是 快照内存,保存到文件,稍后从文件加载env:我认为这将是最简洁的解决方案,就像使用Windows的“休眠”功能一样。我发现了这个实用程序,它旨在拍摄内存快照以分析内存泄漏,但我不知道是否可以从该快照中恢复整个环境,而且我还没有找到这样做的工具 保存命令并重放它们:此方法的一个主要缺点是,它只适用于像var x=“Hello World”这样的简

我希望暂停REPL会话,以便关闭系统,然后在以后的时间继续处理REPL会话,就好像我从未关闭过它一样,也就是说,不必失去所有环境

我认为可能的解决办法是

  • 快照内存,保存到文件,稍后从文件加载env:我认为这将是最简洁的解决方案,就像使用Windows的“休眠”功能一样。我发现了这个实用程序,它旨在拍摄内存快照以分析内存泄漏,但我不知道是否可以从该快照中恢复整个环境,而且我还没有找到这样做的工具

  • 保存命令并重放它们:此方法的一个主要缺点是,它只适用于像
    var x=“Hello World”这样的简单操作,它不适用于
    var reciptId=bankAccount.makePayment(1000)因为它将在每次重播时重复操作,而不是保存原始函数调用的详细信息

  • 对整个环境进行序列化/反序列化:这将涉及列出环境中存在的所有对象,然后建立一种机制将每个对象写入一个文件,即对其进行序列化,然后建立一种机制,对这些对象进行反序列化,并在需要时加载它们。我还没有看到一种无限制地序列化和反序列化js变量的干净方法。我认为这个方法的主要限制是它不能保留引用,因此对象失去了它们的类,在序列化时东西必须被复制,在反序列化时失去它们的相等性-例如。
    
    var f=函数(x){…};
    变量a={};
    a、 f=f;
    a、 f==f//如果序列化机制分别为f和a.f保存函数defn并分别反序列化它们,则为true,而不是true
    
    循环引用可能不起作用(
    x={};x.cyclic=x;
    …)。因此,如果这种方法有效,将需要大量的脏活

  • 所以问题真的是,实现我希望实现的目标有多困难?还有什么其他解决方案可以做到这一点?我忽略了实现这一目标的主要障碍吗

    另外,除了node repl程序(如浏览器中的控制台)之外,还有其他可以像这样挂起的程序吗

    相关的:


    因此,如果您希望能够“挂起”REPL会话,然后在关闭后重新开始,Node.js的REPL中似乎没有直接可用的功能。最接近这一点的是REPL的持久历史记录特性,我认为它是在Node 4.2.1中添加的。这将允许您以纯文本的形式查看REPL中命令的历史记录,但这是最接近Node的现成功能

    持续的历史 默认情况下,REPL将通过保存到用户主目录中的.node_REPL_历史文件,在节点REPL会话之间保留历史记录。通过设置环境变量NODE_REPL_HISTORY=“”,可以禁用此功能

    在Node.js/io.js v2.x中,REPL history是通过使用Node_REPL_history_FILE环境变量来控制的,历史记录是以JSON格式保存的。此变量现在已被弃用,您的REPL历史记录将自动转换为使用纯文本。新文件将保存到主目录或由NODE_REPL_HISTORY变量定义的目录,如下所述

    REPL模块的完整文档可用

    但是,有一个REPL“包装器”节点模块,它将执行您所要求的操作。您可以做的是,将REPL历史保存到一个文件中,然后在下一个会话中加载历史文件,并在下一个REPL会话中访问您保存到该文件中的内容。它还有很多附加功能,包括配置shell和评估不同版本的JS,比如ES6/ES7(使用Babel)和Coffeescript

    安装nesh:

    npm安装-g nesh

    只需键入
    nesh
    即可在终端中启动nesh。在任何其他REPL会话中都可以正常工作,如果要保存,可以在nesh中键入以下命令将REPL历史记录保存到给定文件:

    。保存

    在下一个REPL会话中,即使在关机后,也可以通过键入以下内容重新启动nesh会话并重新加载历史记录:

    .load

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


    希望这对您有所帮助,并且我认为它满足您的需要。

    我认为您正在寻找的是如何暂停和恢复进程

    将它放在虚拟机中,并对其进行快照/存储/恢复。如果您愿意,您甚至可以“远程”连接到虚拟机。在任何情况下,我不相信解决方案存在于node中,而是有一个通用的操作系统实用程序将进程置于停滞状态。但是如果我关闭计算机,我不会失去VM吗?或者快照和恢复是否意味着从磁盘保存和检索?是的,虚拟机可以保存到磁盘。CRIU是否可以作为替代方案?它是一个Linux工具,可以让您对正在运行的应用程序/进程进行快照,将快照保存到磁盘,然后在以后恢复应用程序/进程。它在构建在Linux之上的Windows和OS X上不起作用。我自己还没有尝试过,但我知道Tonic,web上的可视节点REPL,谈到了运行节点REPL的快照。他们使用Virtualbox和CRIU方法进行比较。很棒的read@Snore,这篇文章讨论了我在问题中列出的所有三种方法,Bergi讨论过的一种,然后还有一种!看起来他们的REPL实现具有我所要求的功能,尽管我还没有亲自尝试过。请形成一个关于t的答案