Я хочу приостановить сеанс REPL, чтобы я мог отключить систему, а затем в более позднее время продолжаю работать над сеансом REPL, как если бы я никогда не закрывал его, т.е. не теряя всю среду.
Я думаю, что возможные решения этого могут быть
-
Память моментальных снимков, сохранение в файл и загрузка env из файла позже. Я думаю, что это было бы самым аккуратным решением, например, когда вы используете функцию "спящий режим" Windows. Я нашел эту утилиту heapdump, которая предназначена для получения моментального снимка памяти для анализа утечек памяти, но я не знаю, если вы можете воскресить всю среду из этого моментального снимка, и я не нашел инструментов, которые это делают.
-
Сохранить команды и воспроизвести их. Основной недостаток этого метода заключается в том, что он работает для простых вещей, таких как
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;
...). Поэтому этот метод, если он когда-либо будет работать, потребует много грязной работы.
Итак, вопрос в том, насколько трудно достичь того, чего я хочу достичь? Какие могут быть другие решения? Существует ли серьезное препятствие для достижения этого, о котором я не замечаю?
Также есть ли какие-либо альтернативы программе замены node (например, консоли в браузере), которая может быть приостановлена так?
Связанный: