1.0.0 • Published 5 years ago

dynamic-vendor-webpack-plugin v1.0.0

Weekly downloads
211
License
MIT
Repository
github
Last release
5 years ago

npm

deps node

dynamic-vendor-webpack-plugin relies on webpack 4. It will be updated as needed on major updates of webpack.

yarn add -D dynamic-vendor-webpack-plugin
# or
npm i --save-dev dynamic-vendor-webpack-plugin

Dynamic vendor code splitting is a two steps code process. First, you need to setup the plugin in your webpack config with desired "lazy" vendors, then import the dynamic importer wherever you need in your code.
FYI, the following examples are based on a Typescript code based application.

webpack.config.t-s

import { DynamicVendorPlugin } from 'dynamic-vendor-webpack-plugin';
import { Configuration } from 'webpack';

const config: Configuration = {
    // ... your webpack configuration
    plugins: [
        new DynamicVendorPlugin({
            vendors: ['my-vendor'],
        }),
    ],
}
export default config;

index.ts

// fetch the array of your vendors
// the module is not load by default but wrapped in a pure function
import { dynamicImporter } from 'dynamic-vendor-webpack-plugin/dynamicImporter';

(async () => {
    // run through it
    for (const fn of dynamicImporter) {
        // get the module with the function
        const m = await fn(); 

        // use it
        new (m.default)();
    }
})();

This will generate a separated chunk with this vendor (and its exclusive dependencies) loaded on demand by you application.

  • options.vendors: Array<string | VendorEntry>: The list of vendors by their name of by a more detailed object.
  • options.webpackChunkName: string: A name for the dynamic vendor chunk. 'dynamic-vendor' by default, you can atomically override this for each vendors with a vendor object.

Conditional vendor

webpack.config.ts

const DEV = process.env.NODE_ENV === 'development';
{
    mode: DEV ? 'development' : 'production',
    plugins: [
        new DynamicVendorPlugin({
            vendors: [
                {
                    // admiting that you have a services third party library
                    name: DEV ? 'mock-service-lib' : 'service-lib',
                },
            ],
        }),
    ],
}

Group similar specific vendor together (i.e. plugins)

webpack.config.ts

import packageJson from './package.json';

{
    plugins: [
        new DynamicVendorPlugin({
            // admiting that you want to lazy blind load all vendors under a specific pattern
            // in this case '@mylib/*'
            vendors: Object.keys(packageJson.dependencies).filter(d => d.startsWith('@mylib/')),
        }),
    ],
}