Webpack имеет конфигурацию resolve.mainFields
: https://webpack.js.org/configuration/resolve/#resolvemainfields
Это позволяет контролировать, какое поле package.json следует использовать в качестве точки входа.
У меня есть приложение, которое использует десятки различных сторонних пакетов. Вариант использования заключается в том, что я хочу указать, какое поле использовать в зависимости от имени пакета. Пример:
- Для пакета
foo
используйте полеmain
вnode_modules/foo/package.json
- Для пакета
bar
используйте полеmodule
вnode_modules/bar/package.json
Некоторые пакеты, на которые я полагаюсь, не связаны должным образом, код, на который указывает поле module
, не соответствует этим правилам: https://github.com/dherman/defense-of-dot-js/blob/master/proposal.md Это приводит к тому, что приложение сломаться, если я полностью изменю конфигурацию веб-пакета на:
resolve: {
mainFields: ['module']
}
mainFields
должно быть установлено на main
, чтобы в настоящее время приложение работало. Это приводит к тому, что он всегда извлекает версию CommonJS для каждой зависимости и пропускает встряску деревьев. В надежде сделать что-то вроде этого:
resolve: {
foo: {
mainFields: ['main']
},
bar: {
mainFields: ['module'],
}
Пакет foo
подключается к моему приложению через поле main
, а пакет bar
подключается через поле module
. Я понимаю преимущества treeshaking с пакетом bar
и не ломаю приложение с пакетом foo
(имеет поле модуля, которое не соответствует синтаксису модуля).