-
-
Save jochemstoel/6e539811e5e39041c5e918832cfc3b9e to your computer and use it in GitHub Desktop.
Reloading express routes/middleware on file change WITHOUT restarting node process.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if ( process.env.NODE_ENV === 'production' ) { | |
// dev runs with babel-node so this isn't necessary | |
require('babel-core/register'); // this includes the polyfill | |
require('newrelic'); | |
} | |
import 'source-map-support/register' | |
import Debug from 'debug' | |
import express from 'express' | |
import request from 'request' | |
import logger from 'morgan' | |
import cookieParser from 'cookie-parser' | |
import fs from 'fs' | |
import path from 'path' | |
import compression from 'compression' | |
import favicon from 'serve-favicon' | |
import swig from 'swig' | |
import chokidar from 'chokidar' | |
import webpack from 'webpack' | |
import webpackDevConfig from '../../build_config/webpack.dev.config' | |
import webpackDevMiddleware from 'webpack-dev-middleware' | |
import webpackHotMiddleware from 'webpack-hot-middleware' | |
const webpackDevCompiler = webpack(webpackDevConfig); | |
const debug = Debug('server'); | |
const server = express(); | |
// setup webpack middleware and server-side hot-reloading for development | |
if ( process.env.NODE_ENV === 'development' ) { | |
server.use(webpackDevMiddleware(webpackDevCompiler, { | |
noInfo: true, | |
publicPath: webpackDevConfig.output.publicPath, | |
stats: { | |
hash: false, | |
version: false, | |
timings: true, | |
assets: false, | |
chunks: false, | |
modules: false, | |
} | |
})); | |
server.use(webpackHotMiddleware(webpackDevCompiler)); | |
// load middleware | |
server.use(function(req, res, next) { | |
require('./middleware')(req, res, next); | |
}); | |
// load routes | |
server.use(function(req, res, next) { | |
require('./routes')(req, res, next); | |
}); | |
// Do "hot-reloading" of express stuff on the server | |
// Throw away cached modules and re-require next time | |
// Ensure there's no important state in there! | |
chokidar.watch(__dirname, {ignored: /index\.js$/}) | |
.on('change', (path) => { | |
debug(`Clearing ${path} module cache from server`); | |
if (require.cache[path]) delete require.cache[path]; | |
}); | |
} | |
if ( process.env.NODE_ENV === 'production' ) { | |
server.use(logger('combined')); | |
} else { | |
server.use(logger('dev')); | |
} | |
// gzip responses | |
server.use(compression()); | |
// | |
// TEMPLATE SETUP | |
// | |
// assign the swig engine to .html files | |
server.engine('html', swig.renderFile); | |
// set .html as the default extension | |
server.set('view engine', 'html'); | |
server.set('views', path.join(__dirname, '../html')); | |
// Swig will cache templates for you, but you can disable | |
// that and use Express's caching instead, if you like: | |
server.set('view cache', true); | |
// To disable Swig's cache, do the following: | |
swig.setDefaults({ cache: false }); | |
// NOTE: You should always cache templates in a production environment. | |
// Don't leave both of these to `false` in production! | |
server.use(favicon(path.join(__dirname, '../../public/favicon.ico'))); | |
// return static files if found | |
const oneYearInMilliseconds = 31536000000; | |
server.use(express.static(path.join(__dirname, '../../build_public'), {maxAge: oneYearInMilliseconds})); | |
server.use(express.static(path.join(__dirname, '../../public'), {maxAge: oneYearInMilliseconds})); | |
server.use(cookieParser()); | |
server.set('port', process.env.PORT || 3000); | |
// start server | |
server.listen(server.get('port'), function () { | |
const env = server.get('env'); | |
const port = this.address().port; | |
debug('Express server running Rentals ' + server.get('env') + ' on port %s', port); | |
if ( process.env.NODE_ENV === 'development' ) debug('Please wait, Webpack is compiling…'); | |
}); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment