Webpack: различные (Define Plugin) настройки для каждой точки входа

Для некоторых моих файлов пакетов я хотел бы создавать разные версии (например, один с функциональностью администратора и без него).

Кажется, что DefinePlugin обычно используется для такого рода вещей, но есть также такие загрузчики, как if-loader или ifdef-loader.

Теперь проблема в том, что все они, похоже, имеют конфигурацию среди всех точек входа. Мне нужно было бы установить другую конфигурацию (например, {with_admin_mode: true} и {with_admin_mode: false}) для разных точек входа.

Хотя я поставил конфигурацию в верхней части фактических JS файлов точки входа, но я не знаю, как правильно создать глобальную переменную во всех модулях, которые будут обнаружены как true == false и удалены.

Ответ 1

Попробуйте взглянуть на webpack-merge - Smart Merging должна помочь вам решить ваше дело.

Это может помочь в создании динамической конфигурации с конкретными точками входа, плагинами, и то, что вы когда-либо захотите, зависит от некоторой переменной env.

Хорошая практика - разбивать конфигурацию на разные файлы. Вы можете сделать некоторые общие настройки с одинаковыми вещами через все точки входа, например, загрузчики, а затем сделать пользовательские конфигурации для with_admin_mode и without_admin_node.

Ответ 2

Извините, я хотел написать offerPlugin, а не definePlugin. DefinePlugin заменит переменную в вашем коде напрямую и не будет создавать глобальную.

Вы можете использовать securityPlugin для установки глобальной переменной конфигурации из созданного вами файла модуля:

в конфигурации вашего веб-пакета:

plugins: [
  new webpack.ProvidePlugin({
    'config': 'config'
  })
  ...
],
resolve: {
  alias: { 'config':  path.resolve(__dirname, './config') },
  extensions: ['.js']
}

и config будут установлены как глобальные для экспорта файла config.js.

Затем вы можете получить доступ к этому глобальному и изменить его в разных точках входа. Например, вы можете сделать config.with_admin_mode = true; в entry1.js и config.with_admin_mode = false; в entry2.js.

Другим решением было бы установить глобальную переменную в окне непосредственно из ваших модулей, например. window.with_admin_mode = true;