Если вы создаете пакет NPM, который должен работать как в среде Node (или со сборщиком модулей), так и в браузере, вы можете столкнуться с несколькими путаницами, когда дело доходит до экспорта и динамических зависимостей. Начнем с экспорта.

Одиночные модули

Если ваш пакет содержит только один модуль, вы можете использовать шаблон модуля, чтобы заключить свой код в немедленно вызываемое функциональное выражение, передавая ссылку на this. Следующий оператор if-else проверяет тип среды и соответственно экспортирует модуль. При преобразовании кода с помощью babel вы можете использовать плагин babel-preset-es2015-script, чтобы избежать преобразования this в undefined.

Несколько модулей

Если ваш пакет содержит несколько модулей, вы можете создать версию для конкретного браузера, состоящую только из одного модуля, чтобы его можно было использовать в браузере без загрузчика модулей. Вы можете сделать это с помощью Browserify, выставив ваш модуль верхнего уровня на window. Для среды узла / сборщика вам не нужно делать ничего особенного, и вы можете экспортировать свой модуль как обычно.

Динамические зависимости

Если у вашего пакета есть динамические зависимости, о которых он не узнает до времени выполнения, с ними можно справиться с помощью метода optionalRequire, определенного ниже. Параметр packageName - это имя модуля npm, а параметр globalName - это переменная, которую нужно искать, если модуль включен в тег script и отображается в окне (например, ramda и R для Ramda).

optionalRequire сначала попытается require пакет как модуль npm. Оператор switch используется потому, что webpack и Browserify не могут разрешать имена переменных без использования дополнительных плагинов. Если ошибка возникает из-за того, что require не определен или пакет npm не установлен, он ищет пакет в window. Если пакет не требуется и он не может найти его на window, он выдает error.

Поскольку динамические зависимости будут включены только во время выполнения, вам нужно добавить флаг --ignore-missing к команде browserify, чтобы она не выдавала ошибку, если не может найти эти зависимости в процессе сборки.