#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 в основном принадлежит nodehttp.Server
с дополнительными функциями, такими как слой промежуточного программного обеспечения2. Спасибо, ребята, я попробую. Как насчет расширения класса только для переименования одной переменной в одном из методов? Я только что воссоздал метод, который, я уверен, является единственным способом, но просто на всякий случай, на случай, если есть способ сделать это, о котором я не знаю.
3. @BlakeBell — Я не понимаю, что вы имеете в виду, говоря «переименовать одну переменную в одном из методов». Вам пришлось бы показать конкретный код и описать, чего вы пытаетесь достичь (возможно, в новом вопросе). Вас не должно волновать, какие имена переменных используются внутри методов, поскольку они в любом случае будут находиться в частной области видимости и недоступны вне метода.