Если вы создаете пакет 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
, чтобы она не выдавала ошибку, если не может найти эти зависимости в процессе сборки.