webpack-assembler

Assemble webpack configs by merging common and custom parts.


Keywords
webpack, clean, copy, analyzer, html, parts
License
MIT
Install
npm install webpack-assembler@0.0.23

Documentation

webpack-assembler

Assemble webpack configs by merging common and custom parts.

It passes through most options to the underlying webpack plugins without trying to change the paradigm too much. The result is reduced webpack config size without too much loss of control.

It includes two exports:

  • merge - the default export of webpack-merge for merging configurations
  • parts - a set of common parts.

Also easily brings in these dependencies:

  • circular-dependency-plugin
  • clean-webpack-plugin
  • copy-webpack-plugin
  • file-loader
  • html-webpack-plugin
  • url-loader
  • webpack-bundle-analyzer
  • webpack-merge

Related modules:

Examples

Basic

const {merge, parts} = require('webpack-assembler')

const ROOT_DIR = __dirname
const SRC_DIR = exports.SRC_DIR = path.resolve(ROOT_DIR, './src')
const BUILD_DIR = exports.DIST_DIR = path.resolve(ROOT_DIR, './build')

var config = merge([
    parts.env({
        NODE_ENV: 'development',
        DEBUG: true
    }),

    // Output
    parts.output({
        entry: SRC_DIR + '/index.js',
        output: {
            path: BUILD_DIR,
            filename: 'bundle.js'
        },
        clean: true
    }),

    // Copy hosting page.
    parts.copy([
        {
            from: './src/index.html'
        }
    ])
])

module.exports = config

A bit more

var path = require('path')
const {merge, parts} = require('webpack-assembler')

const ROOT_DIR = __dirname
const SRC_DIR = exports.SRC_DIR = path.resolve(ROOT_DIR, './src')
const BUILD_DIR = exports.DIST_DIR = path.resolve(ROOT_DIR, './build')

var config = merge([
    parts.circularDependencies(),

    // Page hosted entry
    parts.page({
        entry: {
            app: SRC_DIR + '/index.js'
        }
    }),

    // Output
    parts.output({
        output: {
            path: BUILD_DIR,
            filename: '[name].bundle.[hash:8].js'
        },
        clean: true
    }),

    // Use
    parts.useFiles(),
    parts.useFonts(),

    // Split bundles.
    parts.split([
        // Extract remaining vendor bundles.
        {
            name: 'vendor',
            minChunks: parts.isVendor
        },

        // Extract the webpack manifest.
        // This changes with every build.
        {
            name: 'runtime',
            minChunks: Infinity,
        }
    ]) // extractBundles
])

module.exports = config

Advanced

var path = require('path')
const {parts, assemble} = require('webpack-assembler')

const ROOT_DIR = __dirname
const SRC_DIR = exports.SRC_DIR = path.resolve(ROOT_DIR, './src')
const BUILD_DIR = exports.DIST_DIR = path.resolve(ROOT_DIR, './build')

const genBase = (env) => [
    // Env
    parts.env({
        NODE_ENV: (env && env.production) ? 'production' : 'development',
        DEBUG: !env || !env.production
    }),
    parts.circularDependency(),
    
    // Page hosted entry
    parts.page({
        entry: {
            app: SRC_DIR + '/index.js'
        }
    }),

    // Handle extracted bundles.
    parts.split([
        // Extract remaining vendor bundles.
        {
            name: 'vendor',
            minChunks: parts.isVendor
        },

        // Extract the webpack manifest.
        // This changes with every build.
        {
            name: 'runtime',
            minChunks: Infinity,
        }
    ]), // extractBundles
]

const genDev = () => [
    // Output
    parts.output({
        // entry: SRC_DIR + '/index.js',
        output: {
            path: BUILD_DIR + '/dev',
            filename: '[name].bundle.[hash:8].js'
        },
        clean: true
    }),

    // Dev server
    {
        devtool: 'eval-source-map',
        devServer: {
            inline: true,
            contentBase: 'src',
            port: '3001'
        }
    }
]

const genProd = () => [
    // Output
    parts.output({
        output: {
            path: BUILD_DIR + '/prod',
            filename: '[name].bundle.[hash:8].js'
        },
        clean: true
    }),

    {
        devtool: false,
    }
]

module.exports = assemble(genBase, genDev, genProd)

See also