Фреймворк как загрузчик
Фреймворк не просто библиотека — он управляет жизненным циклом компонентов: грузит их, разрешает рекурсивные зависимости, инжектит контекст, перегружает изменённые модули.
Что это / Зачем
- Компонент описывает зависимости (декларативно — JSON или схема).
- Фреймворк строит граф, грузит в нужном порядке, инжектит инстансы.
- Динамическая перезагрузка — при изменении файла модуль выгружается и грузится заново.
- Это реальный DI/IoC «по-взрослому» — без декораторов TypeScript.
Декларация зависимостей
// component1.json()
{
"name": "userService",
"depends": ["db", "logger", "config"]
}
// loader.js — фреймворк
async function load(name) {
const meta = JSON.parse(await fs.readFile(`${name}.json`));
const deps = {};
for (const dep of meta.depends) deps[dep] = await load(dep);
const factory = require(`./${name}.js`);
return factory(deps);
}
// userService.js — пассивный компонент
module.exports = ({ db, logger, config }) => ({
async getUser(id) {
logger.info('getUser', id);
return db.query('SELECT * FROM users WHERE id=$1', [id]);
}
});
Рекурсивные зависимости
Через
requireнапрямую не описать круговые ссылки. Через фреймворк-загрузчик можно: одна сторона получает зависимость уже после загрузки, через прокидываемый контекст.
Антипаттерн: глобальные мутации
// плохо: каждый компонент тянет console.log напрямую
function a() { console.log('a'); }
// замена логирования = править 50 мест.
// С загрузчиком — логгер инжектится один раз, замена локализована.
🎓 Источники
- 🎓 [Inversion of Control and DI in Node.js] · 2018-10-09 · YouTube
- «Через require не можем описать рекурсивные зависимости. Через framework можем».
- Декларативные зависимости в JSON, фреймворк раскидывает их по контекстам компонентов.
- 🎓 [Архитектурные принципы Metarhia] · 2023-12-06 · YouTube
- В Metarhia реализован autobinding в неймспейсы.