Хорошо, благодаря @ jfriend00, я понял, что мне нужно исправить что-то еще с моим кодом, чтобы его комментарии все еще могли быть полезны для других людей. Что касается моей проблемы выгрузки необходимых модулей или перезагрузки их без перезапуска сервера, я нашел довольно элегантный способ сделать это. Позвольте мне начать с показа всех моих тестовых классов и app.js, и я объясню, что я сделал и как это работает.
Class.js:
"use strict";
class Class {
constructor() {
// this.file will be put in comments post run-time, and this.Output = "Hey" will be uncommented to change the source file.
var date = new Date()
this.Output = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "." + date.getMilliseconds();
this.file = global.require.fs.readFileSync('./file.mov');
//this.Output = "Hey";
}
}
module.exports = Class;
app.js:
'use strict';
global.require = {
fs: require('fs')
};
const arr = [];
const mod = './class.js'
let Class = [null];
Class[0] = require(mod);
let c = [];
c.push(new Class[0]());
console.log(c[0].Output);
console.log(process.memoryUsage());
setTimeout(() => {
delete require.cache[require.resolve(mod)];
delete Class[0];
Class[0] = require(mod);
console.log(Class)
delete c[0];
c[0] = new Class[0]();
console.log(c[0].Output);
console.log(process.memoryUsage());
}, 10000);
Теперь позвольте мне объяснить здесь немного, и учтите, что это тестовый код, поэтому наименование просто ужасно.
Вот как я приступил к работе:
Шаг 1
Мне нужен был способ разделения необходимых модулей (таких как fs или websocket, express и т. Д.), Чтобы он не мешалвся delete require_cache()
часть кода, мое решение делало это глобально необходимым:
global.required = {
fs: require('fs')
}
Шаг 2
Найдите способ убедиться, что сборщик мусора удаляет выгруженный код , я добился этого, поместив свои объявления require и class внутри переменной, чтобы я мог использовать функциональность delete
в Node / Javascript. (Я использовал let
в своем тестовом коде, потому что я тестировал другой метод заранее, не проверял, будет ли const
работать снова). Я также создал переменную, которая содержит строку пути для файла (в данном случае '. / Class.js' , но для пояснения ниже я просто напишу его как есть)
let Class = [null] //this declares an array that has an index '0'
Class[0] = require('./Class');
let c = [new Class[0]()] // this declares an array that has the class instantiated inside of index '0'
Что касается сборки мусора, я просто могу сделать следующее:
delete Class[0];
delete c[0];
После этого я могу повторить объявление требуемого класса, а затем самого класса и сохранить свойкод работает без перезапуска.
Помните, что для его реализации в реальном проекте требуется немало усилий, но вы можете разделить его, добавив метод unload () в класс длявыгрузить базовые пользовательские классы. Но мое первоначальное тестирование показывает, что это работает как шарм!
Редактировать: я чувствую, что должен отметить, что без комментариев jfriend00 я бы никогда не нашел это решение
Вывод
При запуске проекта выводится текущее время и process.memoryUsage()
13:49:13.540
{ rss: 50343936,
heapTotal: 7061504,
heapUsed: 4270696,
external: 29814377 }
в течение 10 секунд ожидания, я изменяю файл Class.js
, чтобы он не читалсяfile.mov
и сказать «Привет» вместо времени, после тайм-аута 10 с это вывод:
Hey
{ rss: 48439296,
heapTotal: 7585792,
heapUsed: 4435408,
external: 8680 }