javascript – 如何暂停节点REPL并在后续阶段恢复所有的环境保留?

我想暂停一个REPL会议,以便我可以关闭系统,然后在稍后的时间继续在REPL会议上工作,就好像我从来没有关闭过的一样,即不必失去所有的环境.

我认为可能的解决办法可能是

>快照内存,保存到文件,然后从文件加载env:我认为这将是最整洁的解决方案,就像使用Windows的“hibernate”功能时一样.我发现这个heapdump实用程序旨在为内存泄漏进行内存快照分析,但是我不知道是否可以从该快照中复制整个环境,并且没有找到任何这样的工具.
>保存命令并重播:这个方法一个主要缺点是它适用于简单的东西,如var x =“Hello World”;它不适用于var reciptId = bankAccount.makePayment(1000);因为它将重复每个重播的操作,而不是保存原始函数调用的详细信息.
>对整个环境进行序列化/反序列化:这将包括在环境中存在的所有对象的列表,然后创建一个机制来将它们写入一个文件,即将其序列化,然后制作一个反序列化这些和加载的机制他们需要时我还没有看到一个干净的方法来序列化和反序列化js变量而不受限制.我认为这种方法的主要限制是它无法保留引用,所以这些对象松动了它们的类,事情在序列化时必须被重复,并且在反序列化时失去平等.

var f = function(x){…};
var a = {};
a.f = f;
a.f === f? //是true,如果你的序列化机制分别为f和a.f保存一个函数defn,并且反序列化它们

循环引用可能不起作用(x = {}; x.cyclic = x; …).所以这种方法,如果它有工作将需要很多肮脏的工作.

所以问题真的是,实现我想实现的难度有多大?可以做些其他的解决方案呢?是否有一个主要障碍,实现这一点,我俯瞰?

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

相关:

> Swift REPL: how to save/load the REPL state? (a.k.a. suspend/resume,snapshot,clone)

解决方法

所以如果你想能够暂停一个REPL会话,然后拿起你关闭之后的地方似乎没有直接在Node.js的REPL中可用.最接近的是REPL中的持久历史功能,该功能在Node 4.2.1中被添加(我想).这将允许您以纯文本方式查看REPL中的命令的历史记录,但是可以使用Node可以使用的最接近的东西.

Persistent History

By default,the REPL will persist history between node REPL sessions by saving to a .node_repl_history file in the user’s home directory. This can be disabled by setting the environment variable NODE_REPL_HISTORY=””.

PrevIoUsly in Node.js/io.js v2.x,REPL history was controlled by using a NODE_REPL_HISTORY_FILE environment variable,and the history was saved in JSON format. This variable has Now been deprecated,and your REPL history will automatically be converted to using plain text. The new file will be saved to either your home directory,or a directory defined by the NODE_REPL_HISTORY variable,as documented below.

REPL模块的完整文档可用here.

但是,有一个REPL“包装”节点模块可以做你所要求的.您可以做的是将REPL历史记录保存到文件中,然后在下一个会话中加载历史文件,并访问您在下一个REPL会话中保存到该文件内容.该模块是Nesh.它有很多其他功能包括配置您的外壳并评估不同版本的JS,如ES6 / ES7(使用Babel)和CoffeeScript的.

安装nesh:

npm安装-g nesh

通过简单地输入nesh,在终端上启动nesh.像您通常在任何其他REPL会话中一样工作,并且要保存时,可以在nesh中键入以下内容将REPL历史记录保存到给定文件

.save< filepath>

在下一个REPL会话中,即使关闭,您也可以重新启动nesh会话并重新加载历史记录,方法是输入以下内容

.load< filepath>

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

希望这是有帮助的,我认为它符合你的需要.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...