webpack-udev-server

1.0.0 • Public • Published

webpack-udev-server

A better dev-server for webpack.

build status coverage license version downloads

Features:

  • Run server-side node applications in development mode.
  • Supports react-native.
  • Supports webpack@1, webpack@2, webpack@3, webpack@4.
  • Parallelized builds for multi-webpack configurations.
  • Sick emoji logging.
  • Custom HMR runtime.
  • Hot-reloading of webpack configuration files.
  • Universal, detachable IPC.
  • Simple, dynamic proxying.
  • Host multiple applications at once.

IMPORTANT: We're not super battle-tested. Use at your own risk. The current version is a fairly major rewrite and while the external API you use for spawning the server hasn't changed much for the typical use case, a lot of stuff has changed.

Usage

No changes to your webpack configuration are required for using the universal dev server. All you need to do is to run the dev server using whatever configuration files you want it to run:

#!/bin/sh 
webpack-udev-server --config client.webpack.config.js --config server.webpack.config.js

Globs are totally supported too:

#!/bin/sh 
webpack-udev-server --config config/*.webpack*.js

API

createClient()

If your server requires access to some data that's not available on the local file system you'll need to use createClient to connect to your webpack-udev-server instance – since web assets are generated in memory, (in development mode), you won't be able to read them with traditional fs calls. A simple example of this scenario using express:

import {createClient} from 'webpack-udev-server';
import express from 'express';
import fs from 'fs';
 
const app = express();
 
if (process.env.NODE_ENV === 'development' || !process.env.NODE_ENV) {
  const devServer = createClient();
  app.use((req, res, next) => {
    devServer.getStats('client').then(
      (stats) => {
        req.stats = stats;
        next();
      },
      (err) => next(err)
    );
  });
} else {
  // In production mode we can just read the data from disk instead.
  const stats = JSON.parse(fs.readFileSync('stats.json', 'utf8'));
  app.use((req, res, next) => {
    req.stats = stats;
    next();
  });
}

Architecture

There is a central IPC hub from which all other services connect:

==================== hub ====================
^         ^        ^      ^       ^        ^
compiler  watcher  proxy  logger  runtime  ..

When you start webpack-udev-server is generally automatically starts this hub for you and then any child processes that are spawned or any web pages that need access to the information then connect to the hub.

proxy

The proxy is what handles routing requests to the children. It watches PROXY_SET events to know which paths to proxy to what URLs.

watcher

The watcher handles generating and removing webpack config files to be compiled. It received PATH_WATCHED and PATH_UNWATCHED events to know what paths to monitor. In turn it generates CONFIG_LOADED and CONFIG_UNLOADED events to indicate which files should be compiled.

supervisor

The supervisor handles spawning child processes to compile the webpack config files. It monitors CONFIG_LOADED and CONFIG_UNLOADED to determine which compilation processes to start and end.

compiler

The compiler actually compiles the webpack config files and does any associated output management. For web this means providing a URL to access the generated assets at and informing the proxy, for node this means spawning the node child process and keeping it alive. Generally this means there will be a PROXY_SET event at some point so that you can access the results of your compilation through the main server.

The compiler additionally handles demand for files. So if someone needs to read the contents of a stats.json file then the compiler will handle this. This is done using FILE_CONTENTS demands.

runtime

The dev runtime (the JS bundle that gets embedded into your application) watches for WEBPACK_STATS events to see if the stats file that corresponds to the JS bundle has changed. When this happens either HMR is triggered or you need to restart/reload your application. The node runtime additionally hijacks http.createServer to automatically send a PROXY_SET event when you create a server that starts listening.

logger

The logger is just a dummy service that watches a variety of events and outputs them to the console. Most of the time people want to see what's going on in their app so this lets them do that. However sometimes you would prefer to have a different UI (e.g. something using react-blessed) and so you can turn off the console entirely if you need to.

Readme

Keywords

none

Package Sidebar

Install

npm i webpack-udev-server

Weekly Downloads

23

Version

1.0.0

License

CC0-1.0

Unpacked Size

847 kB

Total Files

332

Last publish

Collaborators

  • izaakschroeder