-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathdevServer.js
73 lines (61 loc) · 2.37 KB
/
devServer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
const path = require('path');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const MemoryFileSystem = require('memory-fs');
const fetch = require('node-fetch');
const express = require('express');
const ejs = require('ejs');
const serialize = require('serialize-javascript');
const transit = require('transit-immutable-js');
const requireFromString = require('require-from-string');
const paths = require('./paths.js');
const app = express();
const clientConfig = require('./webpack.dev.config')();
const serverConfig = require('./webpack.server.config');
const clientCompiler = webpack(clientConfig);
const serverCompiler = webpack(serverConfig);
global.fetch = fetch;
let clientReady;
let serverReady;
const serverPromise = new Promise((resolve) => { serverReady = resolve; });
const clientPromise = new Promise((resolve) => { clientReady = resolve; });
const allEnvironmentReady = Promise
.all([clientPromise, serverPromise])
.then(() => console.info('All bundling process complete'));
let render;
let indexView;
const clientMfs = new MemoryFileSystem();
clientCompiler.outputFileSystem = clientMfs;
clientCompiler.plugin('done', (stats) => {
stats = stats.toJson();
if (stats.errors.length) return;
indexView = clientMfs.readFileSync(path.join(paths.functions, 'views/index.ejs'), 'utf-8');
clientReady();
});
const serverMfs = new MemoryFileSystem();
serverCompiler.outputFileSystem = serverMfs;
serverCompiler.watch({}, (err, stats) => {
if (err) throw err;
stats = stats.toJson();
if (stats.errors.length) return;
const bundle = serverMfs.readFileSync(path.join(serverConfig.output.path, 'server.bundle.js'), 'utf-8');
render = requireFromString(bundle).default;
serverReady();
});
app.use(webpackDevMiddleware(clientCompiler, { noInfo: true, publicPath: clientConfig.output.publicPath }));
app.use(webpackHotMiddleware(clientCompiler, { heartbeat: 5000 }));
app.get('/', (req, res) => {
res.redirect(301, '/news/1');
});
app.get('*', (req, res) => {
allEnvironmentReady.then(() => {
render(req.url)
.then(({ markup, state }) =>
res.send(ejs.render(indexView, { markup, state: serialize(transit.toJSON(state)) })))
});
});
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.info(`server started at localhost:${port}`);
});