Как зависеть от дополнительного встроенного модуля, не нарушая работу пользователей webpack?

#javascript #webpack #webpack-4

#javascript #webpack #webpack-4

Вопрос:

Я поддерживаю модуль npm, который используется в node и браузере, как с webpack, так и без него. Я хочу добавить дополнительную функцию, которая опирается на собственный модуль, не нарушая или не требуя изменений от наших пользователей webpack.

Собственный модуль является необязательным

 "optionalDependencies": {
  "feature-module": "^1.0.0",
}
 

Я требую этого в try / catch

 module.export = function doThing() {
  try {
    require('feature-module');
  } catch (err) {
    // fallack without feature
  }
}
 

Это очень похоже на пример в документации package.json .

Он работает нормально вне webpack и даже в webpack, когда дополнительные зависимости не установлены.

Однако, когда установлен дополнительный модуль, webpack пытается запросить его и выдает ошибки, потому что у него нет загрузчика для файлов, которые он находит.

 ERROR in ./node_modules/my-package/node_modules/feature-module/build/Release/feature-module.node 1:0
Module parse failed: Unexpected character '' (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
(Source code omitted for this binary file)
@ ./node_modules/my-package/node_modules/feature-module/index.js
@ ./node_modules/my-package/index.js
 

Комментарии:

1. Является ли добавление загрузчика опцией?

2. Браузеры не смогут загружать или запускать собственный модуль. Я бы также предпочел не требовать изменений от всех потребителей.

Ответ №1:

Вы можете описать это в своем package.json

 {
  ...

  "browser": { "feature-module": false },

  ...
}

 

Вот как я исправил такую проблему для txml. (github/txml/package.json).

Комментарии:

1. У вас есть исходный код? Это использование не соответствует npmjs.org документация docs.npmjs.com/cli/v6/configuring-npm/package-json#browser

2. Я думаю, что речь идет не столько о npm, сколько о bunders. github.com/webpack/webpack/issues/4674 кажется, поле браузера описано независимым, и webpack следует этому определению. аналогично browserify и rollup. Правило webpack exclude также может работать, но я не использовал его раньше.