RedwoodJS

# Webpack Configuration

Redwood uses webpack. And with webpack comes configuration.

One of Redwood's tenets is convention over configuration, so it's worth repeating that you don't have to do any of this! Take the golden path and everything will work just fine.

But another of Redwood's tenets is to make the hard stuff possible. Whether configuring webpack counts as hard-stuff or not is up for debate, but one thing we know for sure is that it can be an epic time sink. We hope that documenting it well makes it fast and easy.

# Configuring Webpack

The best way to start configuring webpack is with the webpack setup command:

yarn rw setup webpack

This command adds a file called webpack.config.js to your project's web/config directory, creating web/config if it doesn't exist:

// web/config/webpack.config.js

module.exports = (config, { mode }) => {
  if (mode === 'development') {
    /**
     * Add a development-only plugin
     */
  }

  /**
   * Add custom rules and plugins:
   *
   * ```
   * config.module.rules.push(YOUR_RULE)
   * config.plugins.push(YOUR_PLUGIN)
   * ```
   */

  /**
   * And make sure to return the config!
   */
  return config
}

This file exports a function that gets passed two arguments: config, which is Redwood's webpack configuration, and an object with the property mode, which is either 'development' or 'production'.

In this function, you can add custom rules and plugins or modify Redwood's webpack configuration, which you can find in @redwoodjs/core. Redwood has a common webpack configuration that gets merged with others depending on your project's environment (i.e. development or production):

# Sass

Redwood comes configured with support for Sass—all you have to do is install dependencies:

yarn workspace web add -D sass sass-loader

# Tailwind CSS

Configuring webpack just to use Tailwind CSS? Don't! Use the setup command instead:

yarn rw setup ui tailwindcss

# Webpack Dev Server

Redwood uses Webpack Dev Server for local development. When you run yarn rw dev, TOML keys in your redwood.toml's [web] table, like port and apiUrl, are used as Webpack Dev Server options (in this case, devServer.port and devServer.proxy respectively).

# Passing options with --forward

While you can configure Webpack Dev Server in web/config/webpack.config.js, it's often simpler to just pass options straight to yarn rw dev using the --forward flag.

For the full list of Webpack Dev Server options, see https://webpack.js.org/configuration/dev-server/.

# Example: Setting the Port and Disabling Browser Opening

In addition to passing new options, you can override those in your redwood.toml:

yarn rw dev --forward="--port 1234 --no-open"

This starts your project on port 1234 and disables automatic browser opening.

# Example: Allow External Host Access

If you're running Redwood in dev mode and trying to test your application from an external source (i.e. outside your network), you'll get an “Invalid Host Header”. To enable this workflow, run the following:

yarn rw dev --forward="--allow-hosts example.company.com --host 0.0.0.0"

This starts your project and forwards it to example.company.com.