Для чего нам модуль, который называется модуль, а именно node:module?nodejs-42

1. Что такое node:module?

node:module - это встроенный модуль Node.js, который предоставляет API для взаимодействия с системой модулей Node.js. Это "модуль о модулях", дающий низкоуровневый доступ к:

  • процессу загрузки модулей
  • кэшированию модулей
  • разрешению путей к модулям
  • созданию пользовательских загрузчиков

2. Основные возможности модуля

Доступ к внутренностям системы модулей

const Module = require('node:module');

// Получаем объект Module
console.log(Module);

Создание нового модуля

const customModule = new Module('custom-module', null);
customModule._compile('console.log("Hello from custom module!")', 'custom.js');

3. Ключевые методы и свойства

Module._cache

Доступ к кэшу загруженных модулей:

const cache = Module._cache;
console.log(Object.keys(cache)); // Список загруженных модулей

Module._resolveFilename

Разрешение полного пути к модулю:

const path = Module._resolveFilename('./my-module', null, true);
console.log(path); // Полный абсолютный путь

Module.createRequire

Создание функции require с контекстом:

const { createRequire } = require('node:module');
const myRequire = createRequire('/path/to/context');
const pkg = myRequire('./package.json');

4. Практические кейсы использования

1. Горячая перезагрузка модулей

function hotReload(modulePath) {
  const fullPath = require.resolve(modulePath);
  delete Module._cache[fullPath];
  return require(fullPath);
}

2. Создание изолированных контекстов

const req = Module.createRequire(import.meta.url);
const localModule = req('./local-module');

3. Монки-патчинг require

const originalRequire = Module.prototype.require;

Module.prototype.require = function(id) {
  console.log(`Requiring: ${id}`);
  return originalRequire.call(this, id);
};

5. Разница между require и require

Начиная с Node.js v16.0.0, можно использовать префикс node: для явного указания встроенных модулей:

// Эквивалентны, но node: явно указывает на встроенный модуль
const mod1 = require('module');
const mod2 = require('node:module');

6. Продвинутые возможности

Создание собственных загрузчиков

class CustomLoader extends Module {
  _compile(content, filename) {
    // Кастомная логика компиляции
    super._compile(content.replace(/console.log/g, ''), filename);
  }
}

Интеграция с ECMAScript модулями

const module = require('node:module');
module.syncBuiltinESMExports();

7. Ограничения и предостережения

  1. Стабильность API: Многие методы помечены как _ (подчеркивание), что означает их нестабильность
  2. Безопасность: Некорректное использование может нарушить систему модулей
  3. Производительность: Частое манипулирование кэшем может снизить производительность

Резюмируем:

node:module - это мощный инструмент для продвинутой работы с системой модулей Node.js. Он предоставляет низкоуровневый API для управления загрузкой модулей, создания изолированных контекстов и реализации кастомной логики разрешения зависимостей. Хотя большинству приложений не требуется прямое взаимодействие с этим модулем, он незаменим при создании инструментов разработки, систем горячей перезагрузки и продвинутых загрузчиков модулей.