Как я могу создать пакет webpack, который импортирует модуль из другого набора точек входа?
Я пытаюсь создать второй пакет webpack, который зависит от другого пакета. Каждая страница нуждается в пакете - одна, но только некоторые страницы нуждаются в пакете-два.
Например, скажем, у меня есть следующие сценарии точки входа (это тривиальные примеры, просто используя их для получения точки):
пачка one.js
import $ from 'jquery';
$(document).data('key', 'value');
пачка two.js
import $ from 'jquery';
const value = $(document).data('key');
Я знаю, что я могу использовать CommonsChunkPlugin для создания файла commons.js, содержащего загрузчик WebPack и jQuery, но для этого потребуется загрузка как commons.js, так и bundle-one.js на каждой странице, даже если мне это не нужно для загрузки bundle-two.js.
Итак, в основном: есть ли способ построить bundle-one.js в качестве "основного" пакета JavaScript для всех моих страниц, а затем установить setup.set пакета bundle-two.js для загрузки jQuery из bundle-one.js?
Ответы
Ответ 1
Вариант 1
У вас есть две отдельные конфигурации Webpack, по одному для каждого пакета. В вашем первом пакете выведите jQuery
как глобальную переменную, когда вы сначала требуете ее, используя expose-loader:
loaders: [
{ test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' }
]
Затем в вашем втором конфигурационном файле сообщите Webpack, что jQuery является "внешним" и не должен быть связан с остальной частью кода:
{
externals: {
// require("jquery") is external and available
// on the global var jQuery
"jquery": "jQuery"
}
}
Таким образом, первый пучок предоставляет jQuery в качестве глобальной переменной, тогда второй пакет ищет эту глобальную переменную вместо включения источника.
Вариант 2
Я не уверен, что это сработает, но CommonsChunkPlugin
documentation говорит, что вы можете указать опцию name
config как существующий кусок. Вы пытаетесь установить имя для своего имени в точке входа в узел bundle1, и, теоретически, jQuery (и другие библиотеки, необходимые для всех фрагментов) будут встроены в пакет 1, а не связывать 2.
Ответ 2
Вы можете сделать это следующим образом, используя плагин обеспечения -
//webpack.config.js
module.exports = {
entry: './index.js',
output: {
filename: '[name].js'
},
externals: {
jquery: 'jQuery'
},
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
})
]
};
Это может быть полезно для рефакторинга устаревшего кода с большим количеством разных файлов, ссылающихся на $.