npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

universal-hot-reload

v3.3.9

Published

Hot reload client and server webpack bundles for the ultimate development experience

Downloads

685

Readme

universal-hot-reload

Circle CI npm version npm downloads npm npm

Easily hot reload your server, client or universal apps :clap:

Why this package?

  • Setup hot reload for your app in four lines of code or less.
  • Supports server, client and universal hot reloads!
  • Works with react, typescript, graphql and nexus.

This should be used in development only!

Installation

yarn add universal-hot-reload -D

Quickstart: server only

To hot reload graphql servers and express servers without ssr, create index.js and server.js like below. For graphql, only express-graphql and apollo-server are supported for now.

index.js

const { serverHotReload } = require('universal-hot-reload');

// server.js is where you export your http.server instance (see below) 
serverHotReload(require.resolve('./server.js'));

server.js

// You'll need to export default an instance of http.server so universal-hot-reload
// can restart your server when changes are detected.

// For express or express-graphql
export default app.listen(PORT, () => console.log(`Listening at ${PORT}`));

// For apollo-server
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(() => console.log(`Listening at ${PORT}`));
export default server.httpServer;

Run your app:

node index.js

Quickstart: universal apps

To hot reload a universal app, create index.js like below and follow the same steps as Quickstart: server only.

index.js

const UniversalHotReload = require('universal-hot-reload').default;

// supply your own webpack configs
const serverConfig = require('../webpack.config.server.js');
const clientConfig = require('../webpack.config.client.js');

// the configs are optional, you can supply either one or both.
// if you omit say the server config, then your server won't hot reload.
UniversalHotReload({ serverConfig, clientConfig });

Advanced

If you use the serverHotReload function then you won't need to supply your own server webpack config. universal-hot-reload uses a default server webpack config so you don't have to supply your own.

If you want to use your own custom server webpack config or if you want to hot reload your universal app, then you'll need to supply your own webpack configs. Follow the lines marked Important.

  1. Your server webpack config should look like this:

    const path = require('path');
    const nodeExternals = require('webpack-node-externals');
       
    module.exports = {
      mode: 'development',
      devtool: 'source-map',
      entry: './src/server/server.js',
      target: 'node', // Important
      externals: [nodeExternals()], // Important
      output: {
        path: path.resolve('dist'),
        filename: 'serverBundle.js',
        libraryTarget: 'commonjs2' // Important
      },
      // other webpack config
    };
  2. Your client webpack config should look like this:

    const path = require('path');
    const webpackServeUrl = 'http://localhost:3002';
       
    module.exports = {
      mode: 'development',
      devtool: 'source-map',
      entry: './src/client/index',
      output: {
        path: path.resolve('dist'),
        publicPath: `${webpackServeUrl}/dist/`, // Important: must be full path with trailing slash
        filename: 'bundle.js'
      },
      // other webpack config
    };
  3. Create an index.js file:

    const UniversalHotReload = require('universal-hot-reload').default;
    
    // You can provide only a server or a client config or both. 
    const serverConfig = require('../webpack.config.server.js');
    const clientConfig = require('../webpack.config.client.js');
    
    // Omitting a config means that side of your app won't hot reload.
    UniversalHotReload({ serverConfig, clientConfig });
  4. Lastly in your server entry file:

    import { getDevServerBundleUrl } from 'universal-hot-reload';
    import webpackClientConfig from 'path/to/webpack.config.client';
    
    // Important: gets webpack-dev-server url from your client config 
    const devServerBundleUrl = getDevServerBundleUrl(webpackClientConfig);
    
    // Important: feed the url into script src
    const html = `<!DOCTYPE html>
                <html>
                  <body>
                    <div id="reactDiv">${reactString}</div>
                    <script src="${devServerBundleUrl}"></script>
                  </body>
                </html>`;
                   
    // Important: the listen method returns a http.server object which must be default exported
    // so universal-hot-reload can access it
    export default app.listen(PORT, () => {
      log.info(`Listening at ${PORT}`);
    });
  5. Run your app!

    node index.js

Examples

For graphql, check this example with nexus, apollo server and typescript. Only express-graphql and apollo-server are supported right now. graphql-yoga does not expose its http.server instance and so it's not hot-reloadable this way for now.

For universal webpack apps, check the react example for a fully working spa with react and react-router.