Live Reload

Live reload helps you have faster development iteration by using a server that automatically refreshes the page when the source changes.

Webpack is a module bundler that has its own development server - webpack-dev-server. It supports live reload and it is very easy to configure.

To install the Webpack development server run:

npm install webpack-dev-server --save-dev

According to the webpack-dev-server guide you can install and run webpack-dev-server globally, but it is recommended to install it locally as webpack-dev-server will always use a local installation over a global one.

To enable live reload just put this snippet in your webpack.config.js:

devServer: {
    hot: false,
    liveReload: true,
    disableHostCheck: true
}

You need to add a polyfill for postMessage. This is the polyfill that we recommend. To install it run:

npm install postmessage-polyfill

To enable it, add this code to the beginning of your app:

window.postMessage = function(message) {
    pm({
        target: window,
        type: '',
        data: message
    });
};

Webpack development server uses the setInterval function but only passes the callback parameter. You need to enable the setInterval function in Prysm to have a default value for the delay of the interval:

const originalSetInterval = window.setInterval;

window.setInterval = function(callback, delay = 100) {
    return originalSetInterval(callback, delay)
}

The complete webpack configuration file should look like this:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
    mode: 'development',
    entry: {
        app: './index.js',
    },
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            title: 'Development',
        }),
    ],
    devServer: {
        hot: false,
        liveReload: true,
        disableHostCheck: true
    },
    output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist'),
    },
};

The package.json file:

{
  "name": "livereload",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "webpack-dev-server"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "html-webpack-plugin": "3.2.0",
    "webpack": "4.42.0",
    "webpack-cli": "3.3.11",
    "webpack-dev-server": "3.10.3"
  },
  "dependencies": {
    "clean-webpack-plugin": "3.0.0"
  }
}

Install the dependencies by running:

npm install

You can create a simple index.js file to test that everything works as expected:

class App {
    constructor() {
        const element = document.createElement('div');
        element.textContent = '- Hello there!';

        document.body.appendChild(element);
    }
}

export default new App();

To start a development server with live reload enabled run:

npm run start

or

webpack-dev-server

Change the text in index.js and watch how the page automatically refreshes.