Как я могу расширить файл node_module, который module.экспортирует всего несколько переменных, но используется во всем модуле? (с примером)

#javascript #node.js #npm

#javascript #node.js #npm

Вопрос:

Я использую модуль node, файловая структура которого представлена ниже.

Внутри файла node_core_ctx.js он содержит следующий код:

 const EventEmitter = require('events');

let sessions = new Map();
let publishers = new Map();
let idlePlayers = new Set();
let nodeEvent = new EventEmitter();
let stat = {
  inbytes: 0,
  outbytes: 0,
  accepted: 0
};

module.exports = { sessions, publishers, idlePlayers, nodeEvent, stat };
  

и этот код импортируется и используется во всем этом проекте. Я хотел бы расширить этот файл и пару классов в других файлах внутри проекта, над которым я работаю, но если я расширю этот файл, то это не сработает, потому что он все еще импортируется локально в модуле node. Каков наилучший способ расширить этот файл, чтобы он по-прежнему считывался, но в нем также были новые переменные, которые я хочу добавить к нему?

Я думаю, что мне следует просто создать новый файл и использовать его в расширенных объектах, но не уверен, что в какой-то момент я столкнусь с проблемами, идущими по этому пути. Каков наилучший способ сделать это?


введите описание изображения здесь

Комментарии:

1. Попробуйте задавать вопросы с формулировкой «как я могу …», а не «какой наилучший способ …» Первый способ устанавливает четко определенную цель и требования, второй слишком открытый и, как правило, вызывает мнения и ответы низкого качества.

Ответ №1:

Создайте новый модуль, который выполняет require() функции существующего модуля, добавляет к нему несколько новых свойств, а затем экспортирует все это. Тогда любой, кому нужен расширенный модуль, может просто require() добавить его в ваш новый модуль, и они получат как оригиналы, так и расширения.

 // node_core_ctx_extended.js

// get original exports
let data = require('node_core_ctx.js');

// add some new properties to it
data.someNewProperty1 = someNewValue1;    
data.someNewProperty2 = someNewValue2;

// export the combined object
module.exports = data;
  

Затем, везде, где вы хотите использовать расширенную версию:

 const core_extended = require('node_core_ctx_extended.js');
  

Комментарии:

1. Хороший пример этой стратегии см. Express.js который расширяет встроенный http.Server класс node без редактирования реализующих файлов http.Server . app Класс Express в основном принадлежит node http.Server с дополнительными функциями, такими как слой промежуточного программного обеспечения

2. Спасибо, ребята, я попробую. Как насчет расширения класса только для переименования одной переменной в одном из методов? Я только что воссоздал метод, который, я уверен, является единственным способом, но просто на всякий случай, на случай, если есть способ сделать это, о котором я не знаю.

3. @BlakeBell — Я не понимаю, что вы имеете в виду, говоря «переименовать одну переменную в одном из методов». Вам пришлось бы показать конкретный код и описать, чего вы пытаетесь достичь (возможно, в новом вопросе). Вас не должно волновать, какие имена переменных используются внутри методов, поскольку они в любом случае будут находиться в частной области видимости и недоступны вне метода.