Как подменить модуль при сборке пакета JavaScript?

Есть некая библиотека, в коде которой запрашивается модуль logger:
// Исходный не собранный в пакет код, может выполнятся без сбоки в node.js
var logger = require('../../tools/logger');
module.exports = { 
    // ...
};
Реализация модуля logger зависит от среды, поэтому, в случае сборки для браузера, используется другой модуль logger.

Иными словами
require('../../src/logger'); в сборке должен вернуть модуль
'../../src/logger/browser'
Не могу разобраться как подменить один модуль другим, при условии что модуль запрашивается по относительному пути (оба модуля находятся вне папки node_modules).

P.S.
Для создания сборки пробую использовать Browserify.
  • Вопрос задан
  • 2675 просмотров
Решения вопроса 1
wmakeev
@wmakeev Автор вопроса
Сейчас для этих целей использую папку node_modules внутри проекта.

К примеру:
src/node_modules/_project/logger/index.js
src/node_modules/_project/logger/browser/index.js

В коде:
const logger = require('_project/logger')

При запуске проекта в node, по умолчанию используется _project/logger/index.js.
Если нужна версия для браузера, модуль легко подменяется в процессе сборки (напр. с помощью webpack).

Недостатки:
  • Это хак
  • Нужно явно включать папку src/node_modules в .gitignore
    node_modules
    !src/node_modules

  • Нужно настраивать редактор кода или IDE, чтобы встроенные средства поиска и автодополнения учитывали вложенный node_modules не как папку с внешними модулями
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Вам нужен петтерн "интерфейс", т.е. одинаковый внешний вид логгера и разная реализация, подгружаемая в зависимости от платформы. Посмотрите вот тут интерфейс реализовывается через примеси: habrahabr.ru/post/183188 Вот сама библиотека с примерами https://github.com/tshemsedinov/global.js А живой пример использования этого метода можно найти тут https://github.com/tshemsedinov/impress В каталоге /lib/ есть impress.security.js, а impress.security.mongodb.js - это его реализация, или db.js - это интерфейс, а его реализации это db.mysql.js, db.mongodb.js, db.memcached.js. В последнем случае (с интерфейсом db) они не только реализуют интерфейс, но и расширяют его.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы