Extending Webpack #

Webpack is used to build your app into a format that the client can understand. Learn how to extend and add new functionality to your Webpack build.

All Webpack customization uses Filters, make sure to run them in the server context.

Plugins #

To add additional Webpack plugins use the webpack-plugins filter.

import {addFilter} from "@factor/api" 
import BundleAnalyzer from "webpack-bundle-analyzer"

addFilter({
  hook: "webpack-plugins", 
  key: "exampleKey", 
  callback: (plugins, _arguments) => {

    // Add if is for the server build
    if(_arguments.target == 'server'){
      plugins.push(new BundleAnalyzer.BundleAnalyzerPlugin())
    }
    
    return plugins
  }
})

Define Cross Environment Variables #

The app and server environments don't share a context so it's necessary to use Webpack define plugin in order to share variables. To do so use the webpack-define filter.

The only caveat to this plugin is that you have to wrap everything in quotes including strings (double wrap strings). This is because they are written to files and unwrapped on build.

import {addFilter} from "@factor/api" 

addFilter({
  hook: "webpack-define", 
  key: "exampleKey", 
  callback: vars => {

    const var = "example" 
    vars["process.env.MY_VARIABLE"] = JSON.stringify(var) // stringify to wrap twice

    return vars
  }
})

Aliases #

To add Webpack module aliases use the webpack-aliases filter.

import {addFilter} from "@factor/api" 

addFilter({
  hook: "webpack-define", 
  key: "exampleKey", 
  callback: vars => {

    const var = "example" 
    vars.__MY_ALIAS__ = "/my-path/to/alias"

    return vars
  }
})

Loaders #

To add or adjust Webpack Loaders use the webpack-loaders filter:

import {addFilter} from "@factor/api" 

addFilter({
  hook: "webpack-loaders", 
  key: "exampleKey", 
  callback: loaders => {

    loaders.push({ test: /\.scss$/, loader: "sass-loader" })

    return loaders
  }
})

Copy Files to Distribution Build #

When the application builds, in advanced cases you might want to copy files from you app into the distribution folder directly. For, this use the webpack-copy-files-config filter. This filter follows into the WebpackCopyPlugin plugin.

The format for entries is { from: 'source', to: 'dest' }

import {addFilter} from "@factor/api" 

addFilter({
  hook: "webpack-copy-files-config", 
  key: "exampleKey", 
  callback: copyItems => {

    const var = { from: 'source', to: 'dest' }
    copyItems.push(var)

    return copyItems
  }
})

General Config #

Finally, you can make edits to the entire Webpack configuration using the webpack-config filter along with the arguments used to generate it.

import {addFilter} from "@factor/api" 

addFilter({
  hook: "webpack-config", 
  key: "exampleKey", 
  callback: (config, _arguments) => {

    // do something with config 

    return config
  }
})