Я работаю над помощником по протоколированию (в Node.JS), у которого мало экспортируемых функций (error, warn, etc...)
. У меня есть, например, два других сценария, которые используют этот мой "модуль": test1, test2
Мне нужно, когда я инициализирую свой модуль регистрации (let log = require("./log.js");
) в обоих сценариях, чтобы получить сообщения об ошибках следующим образом: [time][ERROR][TEST1] actual message...
Я могу использовать метод non-singleton и добавить конструктор в мой модуль регистрации, что будет принимать TEST1
чтобы каждый скрипт мог иметь свой собственный регистратор. Но когда будет 100 скриптов с использованием регистратора, также будет 100 экземпляров регистратора.
Итак, есть ли лучший подход для получения того же результата, каждый файл CAN имеет свой собственный определенный префикс?
Модуль должен экспортировать заводскую функцию или конструктор; параметры должны быть переданы каким-либо образом, чтобы экземпляр test1
был создан.
Экземпляры могут обрабатываться либо пользователем с модулями, которые обеспечивают одиночные игры:
const loggerFactory = require('./log');
module.exports = loggerFactory('test1');
Или самой библиотекой:
loggerFactory.instances = new WeakMap();
function loggerFactory(name) {
if (!loggerFactory.instances.has(name)) {
loggerFactory.instances.set(name, ...);
}
return loggerFactory.instances.get(name);
}
Второй случай - это именно то, что делает известная библиотека debug
, хотя для соображений совместимости она обрабатывает карту экземпляров с обычным объектом вместо WeakMap
.
name
параметра). т.е. loggerFactory('test') === loggerFactory('test')
. Вы можете создать столько или несколько экземпляров, сколько вам нужно, для каждого сценария или нет. Я до сих пор не уверен, если это то, что вы хотели, вопрос довольно двусмысленный.
let log=require('./log.js'); log.init('test1')
. Это может сделать более явным, что что-то происходит, когда вы загружаете это.log.init('test1')
в файле test1.js иlog.init('test2')
в файле test2.js и test1.js вызоветlog.error(blah)
, вы будете получить префикс test2, потому что его синглтон