You have an app folder with your initial entry point that webpack will bundle into a bundle.js file in the build folder.

NOTE: The webpack dev server is a separate NPM package. You can install it with: npm install webpack-dev-server.

Content Base

The webpack-dev-server will serve the files in the current directory, unless you configure a specific content base.

$ webpack-dev-server --content-base build/

Using this configuration, webpack-dev-server will serve the static files in your build folder. It’ll watch your source files, and recompile the bundle whenever they are changed.

This modified bundle is served from memory at the relative path specified in publicPath (see API). It will not be written to your configured output directory. Where a bundle already exists at the same URL path, the bundle in memory takes precedence (by default).

Using the configuration above, the bundle is available at localhost:8080/assets/bundle.js.

To load your bundled files, you will need to create an index.html file in the build folder from which static files are served (--content-base option). Here’s an example:

By default, go to localhost:8080/ to launch your app. In this example’s configuration (with publicPath), go to localhost:8080/assets/.

Automatic Refresh

The webpack-dev-server supports multiple modes to automatically refresh the page:

Iframe mode (page is embedded in an iframe and reloaded on change)

Inline mode (a small webpack-dev-server client entry is added to the bundle which refresh the page on change)

Each mode also supports Hot Module Replacement. In Hot Module replacement, the bundle is notified that a change happened (rather than a full page reload). A Hot Module Replacement runtime could then load the updated modules and inject them into a running app.

Iframe mode

To use the iframe mode no additional configuration is needed. Just navigate the browser to http://«host»:«port»/webpack-dev-server/«path».

With the above configuration: http://localhost:8080/webpack-dev-server/index.html.

No configuration change needed.

Nice information bar on top of your app.

URL changes in the app are not reflected in the browser’s URL bar.

Inline mode

To use the inline mode, either

specify --inline on the command line.

specify devServer: { inline: true } in your webpack.config.js

This adds the webpack-dev-server client entry point to the webpack configuration. There is no change in the URL required. Just navigate to http://«host»:«port»/«path».

With the above configuration: http://localhost:8080/index.html.

Config option or command line flag needed.

Status information in the console and (briefly) in the browser’s console log.

URL changes in the app are reflected in the browser’s URL bar.

Inline mode with Node.js API

There is no inline: true flag in the webpack-dev-server configuration, because the webpack-dev-server module has no access to the webpack configuration. Instead, the user must add the webpack-dev-server client entry point to the webpack configuration.

To do this, simply add the following to all entry points: webpack-dev-server/client?http://«path»:«port»/

Inline mode in HTML

There is also the option to add a reference to the webpack-dev-server client script to the HTML page:

<script src="http://localhost:8080/webpack-dev-server.js"></script>

Hot Module Replacement

To enable Hot Module Replacement with the webpack-dev-server specify --hot on the command line. This adds the HotModuleReplacementPlugin to the webpack configuration.

The easiest way to use Hot Module Replacement with the webpack-dev-server is to use the inline mode.

Hot Module Replacement with Inline mode on CLI

Nothing more is needed. --inline --hot does all the relevant work automatically. The CLI of the webpack-dev-server automatically adds the special webpack/hot/dev-server entry point to your configuration.

Just navigate to http://«host»:«port»/«path» and let the magic happen.

Working with editors/IDEs supporting “safe write”

Note that many editors support “safe write” feature and have it enabled by default, which makes dev server unable to watch files correctly. “Safe write” means changes are not written directly to original file but to temporary one instead, which is renamed and replaces original file when save operation is completed successfully. This behaviour causes file watcher to lose the track because the original file is removed. In order to prevent this issue, you have to disable “safe write” feature in your editor.

Proxying some URLs can be useful for a variety of configurations. One example is to serve JavaScript files and other static assets from the local development server but still send API requests to an external backend development server. Another example is splitting requests between two separate backend servers such as an authentication backend and a application backend.

Bypass the Proxy

(Added in v1.13.0) The proxy can be optionally bypassed based on the return from a function. The function can inspect the HTTP request, response, and any given proxy options. It must return either false or a URL path that will be served instead of continuing to proxy the request.

For example, the configuration below will not proxy HTTP requests that originate from a browser. This is similar to the historyApiFallback option: browser requests will receive the HTML file as normal but API requests will be proxied to the backend server.

webpack-dev-server CLI

$ webpack-dev-server <entry>

All webpackCLI options are valid for the webpack-dev-server CLI too, but there is no <output> default argument. For the webpack-dev-server CLI a webpack.config.js (or the file passed by the --config option) is accepted as well.

There are some additional options:

--content-base <file/directory/url/port>: base path for the content.

--quiet: don’t output anything to the console.

--no-info: suppress boring information.

--colors: add some colors to the output.

--no-colors: don’t use colors in the output.

--compress: use gzip compression.

--host <hostname/ip>: hostname or IP. 0.0.0.0 binds to all hosts.

--port <number>: port.

--inline: embed the webpack-dev-server runtime into the bundle.

--hot: adds the HotModuleReplacementPlugin and switch the server to hot mode. Note: make sure you don’t add HotModuleReplacementPlugin twice.

--hot --inline also adds the webpack/hot/dev-server entry.

--public: overrides the host and port used in --inline mode for the client (useful for a VM or Docker).

--lazy: no watching, compiles on request (cannot be combined with --hot).

--https: serves webpack-dev-server over HTTPS Protocol. Includes a self-signed certificate that is used when serving the requests.

--client-log-level: controls the console log messages shown in the browser. Use error, warning, info or none.

Additional configuration options

When using the CLI it’s possible to have the webpack-dev-server options in the configuration file under the key devServer. Options passed via CLI arguments override options in configuration file. For options under devServer see next section.

Notice that webpack configuration is not passed to WebpackDevServer API, thus devServer option in webpack configuration is not used in this case. Also, there is no inline mode for WebpackDevServer API. <script src="http://localhost:8080/webpack-dev-server.js"></script> should be inserted to HTML page manually.

The historyApiFallback option

If you are using the HTML5 history API you probably need to serve your index.html in place of 404 responses, which can be done by setting historyApiFallback: true. However, if you have modified output.publicPath in your Webpack configuration, you need to specify the URL to redirect to. This is done using the historyApiFallback.index option:

Combining with an existing server

You may want to run a backend server or a mock of it in development. You should not use the webpack-dev-server as a backend. Its only purpose is to serve static (webpacked) assets.

You can run two servers side-by-side: The webpack-dev-server and your backend server.

In this case you need to teach the webpack-generated assets to make requests to the webpack-dev-server even when running on a HTML-page sent by the backend server. On the other side you need to teach your backend server to generate HTML pages that include script tags that point to assets on the webpack-dev-server. In addition to that you need a connection between the webpack-dev-server and the webpack-dev-server runtime to trigger reloads on recompilation.

To teach webpack to make requests (for chunk loading or HMR) to the webpack-dev-server you need to provide a full URL in the output.publicPath option.

To make a connection between webpack-dev-server and its runtime best, use the inline mode with --inline. The webpack-dev-server CLI automatically includes an entry point which establishes a WebSocket connection. (You can also use the iframe mode if you point --content-base of the webpack-dev-server to your backend server. If you need a websocket connection to your backend server, you’ll have to use iframe mode.

When you use the inline mode just open the backend server URL in your web browsers. (If you use the iframe mode open the /webpack-dev-server/ prefixed URL of the webpack-dev-server.)