Анализируя исходные коды прошлых проектов, рейтинг популярности прямых вызовов функций показал, что прямой вызов
require() встречается в коде node-модулей почти так же часто, как
Array#forEach(). Самое обидное, что чаще всего мы подключаем модули
"util",
"fs" и
"path", чуть реже
"url". Наличие других подключенных модулей зависит уже от задачи модуля. Причем, говоря о модуле
"util", загружается в память node-процесса даже если вы ни разу его не подключали.
В прошлой статье
Node.JS Загрузка модулей по требованию я поведал о возможности автоматической загрузкой модуля при первом обращении к его именованной ссылке. Если честно, на момент написания той статьи, я не был уверен в том, что такой подход не станет причиной странного поведения node-процесса. Но, уже сегодня с гордостью могу ручаться, что
demandLoad() работает уже пол года в продакшене. Как мы его только не гоняли… Это и нагрузочное тестирование конкретного процесса, и работа
demandLoad() в worker-процессах кластеров, и работа процесса под небольшой нагрузкой в течении долгого времени. Результаты сравнивались с использованием
demandLoad() и с использованием
require(). Никаких существенных отклонений в сравнении не было замечено.
Сегодня речь пойдет уже не о стабильности
demandLoad(). Если кому интересно, задавайте вопросы в комментариях, сделаю скриншоты, могу рассказать о методах и инструментах тестирования, других возможностях использования подхода. Сегодня, как следует из заголовка статьи, мы будем избавляться от успевших уже надоесть
require() в шапках каждого node-модуля.
Заранее отмечу, ни в коем случае не агитирую использовать предложенный метод в продакшене. Практика изложена для ознакомления и не претендует на статус «true-практики». Громкий заголовок только для привлечения внимания.