Применить CommonsChunkPlugin к разным экспортным конфигурациям в Webpack?

Я работаю над проектом, который состоит из следующих «сущностей»:

  • Несколько страниц для статического сайта
  • Приложение
  • Панель администратора

В моей первоначальной webpack.config настройке я обрабатывал каждую из этих сущностей как разные entry точки. Например, у меня было бы что-то вроде

entry: {
    vendor: [
        'jquery',
        'bootstrap',
        'bootstrap/dist/css/bootstrap.css'
    ],
    admin: [
        'admin.js',
        'admin.css'
    ],
    websitePageA: [
        'analytics.js',
        'websitePageA.js',
        'websitePageA.css'
    ],
    websitePageB: [
        'analytics.js',
        'websitePageB.js',
        'websitePageB.css'
    ],
    websitePageC: [
        'analytics.js',
        'websitePageC.js',
        'websitePageC.css'
    ],
    app: [
        'analytics.js',
        'app.js',
        'app.css'
    ]
}

Когда я применил CommonsChunkPlugin, я бы сделал это таким образом, чтобы попытаться разделить мои собственные общие файлы (например, analytics.js сверху) на их собственный common пакет и общие файлы поставщика (например, jquery) в их собственный vendor пакет.

Это сработало, однако семантически, я не был доволен результатом, потому что, пока я делал vendor пакет, который предположительно должен включать каждый файл поставщика, я этого не делал. Не каждой странице нужен был файл каждого поставщика, необходимый для разных страниц, поэтому я оптимизировал так, чтобы мой пакет vendor включал только общие файлы поставщиков между этими точками входа.

После размышлений я решил, что лучше всего будет разбить мою конфигурацию на 3 части: одну для объекта приложения, одну для объекта панели администратора и одну для веб-сайта в целом.

Итак, теперь у меня есть 4 config файла, по одному для каждой из трех вышеупомянутых сущностей и один основной webpack.config.js, который импортирует 3 других и экспортирует массив, содержащий их.

Мой webpack.config.js выглядит так

'use strict';

const appConfig = require('./webpack.config.app');
const siteConfig = require('./webpack.config.site');
const adminConfig = require('./webpack.config.admin');

module.exports = [
    appConfig,
    siteConfig,
    adminConfig,
];

И конфигурация entry каждой соответствующей подконфигурации выглядит так:

Для приложения

entry = {
    vendor: [
        'jquery',
        'bootstrap',
        'bootstrap/dist/css/bootstrap.css',
         etc...
    ],
    main: [
        'analytics.js',
        'app.js',
        'app.css'
    ]
};

Для сайта

entry: {
    vendor: [
        'jquery',
        'bootstrap',
        'bootstrap/dist/css/bootstrap.css',
         etc...
    ],
    websitePageA: [
        'analytics.js',
        'websitePageA.js',
        'websitePageA.css'
    ],
    websitePageB: [
        'analytics.js',
        'websitePageB.js',
        'websitePageB.css'
    ],
    websitePageC: [
        'analytics.js',
        'websitePageC.js',
        'websitePageC.css'
    ]
}

Для панели администратора

entry: {
    vendor: [
        'jquery',
        'bootstrap',
        'bootstrap/dist/css/bootstrap.css',
         etc...
    ],
    admin: [
        'admin.js',
        'admin.css'
    ]
}

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

Я также создаю отдельный manifest файл для каждого из них, который включает только среду выполнения веб-пакета.

Каждая из этих конфигураций выводится в определенном каталоге в моем каталоге build/. Например, моя конфигурация приложения выводит на build/app/, веб-сайт - на build/site и т. Д. Пути вывода также используются в качестве publicURL параметра для каждой конфигурации, чтобы веб-пакет знал, откуда брать код в сценариях разделения кода

Вопрос

Как вы могли заметить, зависимость jquery является общей для всех различных конфигураций.

Мой вопрос: в моем основном webpack.config.js можно ли применять CommonsChunkPlugin для файлов / пакетов поставщиков каждой из отдельных субконфигураций?

Чтобы я мог иметь один "суперглобальный" vendor пакет, который включает файлы общих поставщиков для всех сущностей? (приложение, панель администратора и веб-сайт)

ОБНОВЛЕНИЕ

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

Пакеты для сайта  Пакеты сайтов

Пакеты для приложения  Наборы приложений

Пакеты для административной панели  Пакеты сайтов

Итак, я хочу создать еще один пакет, который перемещает все экземпляры, в которых используются jquery и bootstrap, в новый пакет, содержащий только их. Этот пакет будет совместно использоваться приложением, сайтом и административной панелью, которая теперь не будет содержать jquery и bootstrap в соответствующих пакетах поставщиков.


person Dimitris Karagiannis    schedule 03.11.2016    source источник
comment
Вы импортируете jQuery в код своего сайта, приложения и панели администратора с помощью import или require?   -  person SkrewEverything    schedule 27.09.2017
comment
Я давно перешел к другим проектам, так как я спросил об этом, но я использовал импорт, не требующий   -  person Dimitris Karagiannis    schedule 27.09.2017
comment
Поскольку вы перешли в другие проекты, я не буду писать подробный ответ. Как вы уже указали jQuery как entry, не импортируйте его в свои .js файлы. Затем используйте html-webpack-plugin, чтобы автоматически вставить его в качестве первого .js файла в ваши HTML-файлы.   -  person SkrewEverything    schedule 27.09.2017
comment
Блин, я попробую, когда вернусь домой, и дам вам знать, чтобы вы могли опубликовать его в качестве ответа, если он сработает (что, я думаю, будет)   -  person Dimitris Karagiannis    schedule 27.09.2017