Apply CommonsChunkPlugin on different config exports in Webpack?
Asked Answered
S

0

7

I am working on a project which is consisting of the following 'entities':

  • A few pages for a static website
  • An app
  • An admin dashboard

In my initial webpack.config a setup I was handling each of these entities as different entry points. For example, I would have something like

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'
    ]
}

When I would apply the CommonsChunkPlugin I would do so in such a way to try and separate my own common files (for example the analytics.js from above) into their own common bundle and vendor common files (such as jquery) into their own vendor bundle.

This worked, however, semantically, I was not happy with the result because while I was making a vendor bundle which supposedly should include every vendor file, I was not doing that. Not every page needed every vendor file required by various pages, so I was optimizing in a way that my vendor bundle would only include common vendor files between these entry points.

After consideration, I decided that the best course of action would be to break my configuration into 3, one for the app entity, one for the admin dashboard entity and one for the website as a whole.

So I now have 4 config files, one for each of the above 3 entities and one main webpack.config.js which imports the 3 others and exports an array containing them.

My webpack.config.js looks like this

'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,
];

And the entry config of each respective sub-config looks like this:

For the app

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

For the site

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'
    ]
}

For the admin dashboard

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

In each of the above configs, I run CommonsChunkPlugin in such a way that separates all vendor files into a vendor bundle and in the case of the site, all own common files into their own common bundle.

I am also creating a separate manifest file for each of them, which includes just the webpack runtime.

Each of these configs outputs in a specific directory in my build/ directory. For example my app config outputs to build/app/, the website to build/site etc. The output paths are also used as the publicURL setting for each configuration, so that webpack knows where to pull code from, on code-splitting scenarios

The question

As you may have noticed the jquery dependency is common among all the different configs.

My question is, in my main webpack.config.js is it possible to apply CommonsChunkPlugin for the vendor files/bundles of each of the separate sub-configs?

So that I can have one "super-global" vendor bundle that includes the common vendor files among all the entities? (app, admin dashboard, and website)

UPDATE

I am attaching visualizations of the bundles generated by each of my configs to help you understand what I have:

The bundles for the site Site bundles

The bundles for the app App bundles

The bundles for the admin panel Site bundles

So, what I want to do, is have one more bundle, which moves all the instances where jquery and bootstrap is used into a new bundle, containing only them. That bundle would be shared amongst the app, the site and the admin panel, which now would not contain jquery and bootstrap in their respective vendor bundles.

Sick answered 3/11, 2016 at 16:6 Comment(4)
Are you importing jQuery in your site, app and admin panel code using import or require?Monosyllabic
I've long moved to other projects, since I asked this, but I was using import not requireSick
As you moved to other projects, im not gonna write a detailed answer. As you have already stated jQuery as an entry, don't import it in your .js files. Then use a html-webpack-plugin to insert it automatically as the first .js file in your HTML files.Monosyllabic
Damn, I'll try it when I get home and I'll let you know, so that you can post it as an answer if it works (which I think it will)Sick

© 2022 - 2024 — McMap. All rights reserved.