Skip to content

Commit

Permalink
Replace express with builtin node server
Browse files Browse the repository at this point in the history
Alternative to long-standing webpack-contrib#212

Express in this project does not add much value. Middleware api is not
necessary for 1.5 middlwares. We can try to use node server directly.

Serving static is left for express middleware. Can be replaced with
something smaller in another PR.
  • Loading branch information
TrySound committed Nov 28, 2020
1 parent 37f048a commit a78b7a7
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 42 deletions.
67 changes: 48 additions & 19 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -39,11 +39,11 @@
"chalk": "^4.1.0",
"commander": "^6.2.0",
"ejs": "^3.1.5",
"express": "^4.17.1",
"filesize": "^6.1.0",
"gzip-size": "^6.0.0",
"lodash": "^4.17.20",
"opener": "^1.5.2",
"serve-static": "^1.14.1",
"ws": "^7.3.1"
},
"devDependencies": {
Expand Down
61 changes: 39 additions & 22 deletions src/viewer.js
Expand Up @@ -4,7 +4,7 @@ const http = require('http');

const WebSocket = require('ws');
const _ = require('lodash');
const express = require('express');
const serveStatic = require('serve-static');
const ejs = require('ejs');
const {bold} = require('chalk');

Expand All @@ -14,6 +14,7 @@ const {open} = require('./utils');

const projectRoot = path.resolve(__dirname, '..');
const assetsRoot = path.join(projectRoot, 'public');
const viewsRoot = path.join(projectRoot, 'views');

function resolveTitle(reportTitle) {
if (typeof reportTitle === 'function') {
Expand Down Expand Up @@ -49,28 +50,44 @@ async function startServer(bundleStats, opts) {

if (!chartData) return;

const app = express();

// Explicitly using our `ejs` dependency to render templates
// Fixes #17
app.engine('ejs', require('ejs').renderFile);
app.set('view engine', 'ejs');
app.set('views', `${projectRoot}/views`);
app.use(express.static(`${projectRoot}/public`));

app.use('/', (req, res) => {
res.render('viewer', {
mode: 'server',
title: resolveTitle(reportTitle),
get chartData() { return chartData },
defaultSizes,
enableWebSocket: true,
// Helpers
escapeJson
});
});
const serveStaticMiddleware = serveStatic(`${projectRoot}/public`);

const handleError = (res, err) => {
console.error(err.stack || err.toString());
res.writeHead(500);
res.end();
};

const server = http.createServer(app);
const server = http.createServer((req, res) => {
if (req.method === 'GET' && req.url === '/') {
const data = {
mode: 'server',
title: resolveTitle(reportTitle),
get chartData() { return chartData },
defaultSizes,
enableWebSocket: true,
// Helpers
escapeJson
};
ejs.renderFile(`${viewsRoot}/viewer.ejs`, data, {cache: true}, (err, html) => {
if (err) {
handleError(res, err);
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
return res.end(html);
}
});
} else {
serveStaticMiddleware(req, res, err => {
if (err) {
handleError(res, err);
} else {
res.writeHead(404);
res.end();
}
});
}
});

await new Promise(resolve => {
server.listen(port, host, () => {
Expand Down

0 comments on commit a78b7a7

Please sign in to comment.