/ webpack_config / devServer.js
devServer.js
 1  'use strict';
 2  const path = require('path');
 3  const express = require('express');
 4  const webpack = require('webpack');
 5  const https = require('https');
 6  const fs = require('fs');
 7  const webpackConfig = require('./webpack.dev');
 8  const config = require('./config');
 9  const LogPlugin = require('./plugins/serverLog');
10  
11  const app = express();
12  
13  const port = config.port;
14  webpackConfig.entry.client = [
15    'react-hot-loader/patch',
16    'webpack-hot-middleware/client?reload=true',
17    'webpack/hot/only-dev-server',
18    webpackConfig.entry.client
19  ];
20  
21  webpackConfig.plugins.push(new LogPlugin(port));
22  
23  let compiler;
24  
25  try {
26    compiler = webpack(webpackConfig);
27  } catch (err) {
28    console.error(err.message);
29    process.exit(1);
30  }
31  
32  const devMiddleWare = require('webpack-dev-middleware')(compiler, {
33    publicPath: webpackConfig.output.publicPath,
34    logLevel: 'warn',
35    inline: true,
36    headers: {
37      'Access-Control-Allow-Origin': '*',
38      'Access-Control-Allow-Methods': '*',
39      'Access-Control-Allow-Headers': '*'
40    },
41    watchOptions: {
42      aggregateTimeout: 100
43    }
44  });
45  app.use(devMiddleWare);
46  app.use(
47    require('webpack-hot-middleware')(compiler, {
48      log: false
49    })
50  );
51  
52  const mfs = devMiddleWare.fileSystem;
53  const file = path.join(webpackConfig.output.path, 'index.html');
54  
55  devMiddleWare.waitUntilValid();
56  
57  app.get('*', (req, res) => {
58    devMiddleWare.waitUntilValid(() => {
59      const html = mfs.readFileSync(file);
60      res.end(html);
61    });
62  });
63  
64  if (process.env.HTTPS) {
65    let creds = {};
66    try {
67      creds.key = fs.readFileSync(path.resolve(__dirname, 'server.key'), 'utf8');
68    } catch (err) {
69      console.error('Failed to get SSL private key at webpack_config/server.key');
70      console.error(err);
71      process.exit(1);
72    }
73  
74    try {
75      creds.cert = fs.readFileSync(path.resolve(__dirname, 'server.crt'), 'utf8');
76    } catch (err) {
77      console.error('Failed to get SSL certificate at webpack_config/server.crt');
78      console.error(err);
79      process.exit(1);
80    }
81  
82    const httpsApp = https.createServer(creds, app);
83    httpsApp.listen(port);
84  } else {
85    app.listen(port);
86  }