Я пытаюсь сделать что-то, что, по моему мнению, должно быть возможным, но я действительно не могу понять, как это сделать, просто из документации веб-пакета.
Я пишу библиотеку JavaScript с несколькими модулями, которые могут зависеть или не зависеть друг от друга. Кроме того, jQuery используется всеми модулями, и некоторые из них могут нуждаться в плагинах jQuery. Затем эта библиотека будет использоваться на нескольких разных веб-сайтах, для которых могут потребоваться некоторые или все модули.
Определить зависимости между моими модулями было очень просто, но определить их сторонние зависимости оказалось сложнее, чем я ожидал.
Чего я хотел бы достичь : для каждого приложения я хочу иметь два комплекта файлов: один с необходимыми сторонними зависимостями, а другой с необходимыми модулями из моей библиотеки.
Пример : давайте представим, что моя библиотека имеет следующие модули:
- a (требуется: jquery, jquery.plugin1)
- б (требуется: JQuery, а)
- c (требуется: jquery, jquery.ui, a, b)
- d (требуется: jquery, jquery.plugin2, a)
И у меня есть приложение (рассматривается как уникальный входной файл), для которого требуются модули a, b и c. Webpack для этого случая должен сгенерировать следующие файлы:
- комплект поставщиков : с jquery, jquery.plugin1 и jquery.ui;
- комплектация сайта : с модулями a, b и c;
В конце концов, я бы предпочел использовать jQuery в качестве глобального, поэтому мне не нужно требовать его для каждого отдельного файла (например, я могу требовать его только для основного файла). А плагины jQuery просто расширили бы $ global в случае необходимости (это не проблема, если они доступны для других модулей, которым они не нужны).
Предполагая, что это возможно, что будет примером файла конфигурации веб-пакета для этого случая? Я попробовал несколько комбинаций загрузчиков, внешних модулей и плагинов в моем файле конфигурации, но я не совсем понимаю, что они делают и какие мне следует использовать. Спасибо!
источник
Ответы:
в моем файле webpack.config.js (версия 1,2,3), у меня есть
в моем массиве плагинов
Теперь у меня есть файл, который только добавляет сторонние библиотеки в один файл по мере необходимости.
Если вы хотите получить более детальную информацию о том, где вы разделяете своих поставщиков и файлы точек входа:
Обратите внимание, что порядок плагинов имеет большое значение.
Кроме того, это изменится в версии 4. Когда это будет официально, я обновлю этот ответ.
Обновление: изменение индекса поиска для пользователей Windows
источник
isExternal
вminChunks
сделал мой день. Как это не задокументировано? Есть минусы?options.minChunks (number|Infinity|function(module, count) -> boolean):
я пока не вижу обратной стороны.module.userRequest
(и загрузчик, вероятно, находится вnode_modules
). Мой код дляisExternal()
:return typeof module.userRequest === 'string' && !!module.userRequest.split('!').pop().match(/(node_modules|bower_components|libraries)/);
Я не уверен, полностью ли я понимаю вашу проблему, но, поскольку у меня недавно была похожая проблема, я постараюсь помочь вам.
Поставщик комплектации.
Вы должны использовать CommonsChunkPlugin для этого. в конфигурации вы указываете имя чанка (например
vendor
) и имя файла, который будет сгенерирован (vendor.js
).Теперь важная часть, теперь вы должны указать, что означает
vendor
библиотека, и вы делаете это в разделе ввода. Еще один элемент в списке записей с тем же именем, что и имя только что объявленного чанка (в данном случае «vendor»). Значением этой записи должен быть список всех модулей, которые вы хотите переместить вvendor
пакет. в вашем случае это должно выглядеть примерно так:JQuery как глобальный
Была такая же проблема и решена с помощью ProvidePlugin . здесь вы определяете не глобальный объект, а какие-то помехи для модулей. то есть вы можете настроить его так:
И теперь вы можете просто использовать в
$
любом месте вашего кода - веб-пакет автоматически преобразует это вНадеюсь, это помогло. Вы также можете посмотреть мой конфигурационный файл веб-пакета, который находится здесь
Я люблю webpack, но я согласен, что документация не самая лучшая в мире ... но эй .. люди говорили то же самое об Angular документации в начале :)
Редактировать:
Чтобы иметь чанки вендоров для конкретной точки входа, просто используйте CommonsChunkPlugins несколько раз:
а затем объявите разные внешние библиотеки для разных файлов:
Если некоторые библиотеки перекрываются (и для большинства из них) между точками входа, вы можете извлечь их в общий файл, используя один и тот же плагин только с другой конфигурацией. Смотрите этот пример.
источник
Если вы заинтересованы в автоматическом объединении ваших скриптов отдельно от вендоров:
Вы можете прочитать больше об этой функции в официальной документации .
источник
vendor : Object.keys(pkg.dependencies)
это не всегда работает и зависит от того, как собран пакет.package.json
настроен. Этот обходной путь работает в большинстве случаев, но есть исключения, когда вам придется выбрать другой путь. Может быть интересно опубликовать свой ответ на вопрос, чтобы помочь сообществу.Object.keys(pkg.dependencies)
будет связывать все !!!! пусть говорит, что там есть куча загрузчиков ... да, это будет включено !!! так что будьте осторожны ... разделите осторожно, что такое devDependency и что такое зависимостьdependencies
?Также не уверен, что я полностью понимаю ваш случай, но вот фрагмент конфигурации для создания отдельных блоков поставщиков для каждого из ваших пакетов:
И ссылка на
CommonsChunkPlugin
документы: http://webpack.github.io/docs/list-of-plugins.html#commonschunkpluginисточник
react
должен присутствовать в комплекте поставщика только в том случае, если это явно требуется для bundle1 и bundl2. Мне не нужно указывать это в файле конфигурации ... Имеет ли это смысл? Любые идеи?