react-project
react-project copied to clipboard
Add express middleware hooks
This would allow some optional server customization, but still keep everything 'battery-pack included'
// PublicServerAPI.js
export function createServer({ renderDocument, renderApp, routes, devMiddlewares, prodMiddlewares }) {
const server = express()
const webpackStats = getWebpackStats()
if (process.env.NODE_ENV === 'production') {
server.use(compression())
prodMiddlewares(server)
server.use(express.static(PUBLIC_DIR))
} else {
devMiddlewares(server)
}
...
// Example middleware hooks (psuedo code)
// modules/server.js
...
import { createServer } from 'react-project/server'
..
import morgan from 'morgan'
import newrelic from 'newrelic'
...
function devMiddlewares(server) {
server.use(morgan('dev'))
}
function prodMiddlewares(server) {
server.use(morgan('combined'))
server.locals.newrelic = newrelic
}
createServer({
renderDocument,
renderApp,
routes,
devMiddlewares,
prodMiddlewares
}).start()
...
This is interesting, but is there anything wrong with:
// Example middleware hooks (psuedo code)
// modules/server.js
...
import { createServer } from 'react-project/server'
..
import morgan from 'morgan'
import newrelic from 'newrelic'
...
const server = createServer({
renderDocument,
renderApp,
routes
})
if (process.env.NODE_ENV === 'development') {
server.use(morgan('dev'))
}
if (process.env.NODE_ENV === 'production') {
server.use(morgan('combined'))
server.locals.newrelic = newrelic
}
server.start()
I'm a little hesitant to become a wrapper over express.
@ryanflorence middleware needs to be defined before the routes are defined.
@ryanflorence 100% agree, but if we don't want to wrap express, then maybe we should do the following:
- Move all the great default express-specific middleware to the
server.js
blueprint file - Keep the awesome rendering functions you wrote in the
react-project
server api
^ how about that?
LGTM
I actually want to just put morgan in by default
Pretty sure this is now solved with the createServer
API.
// server.js
...
import morgan from 'morgan'
...
const server = createServer(getApp)
process.env.NODE_ENV !== 'production' ? server.use(morgan('dev')) : server.use(morgan('combined'))
server.start()
I'm leaving this open because I am interested in having nicer hooks around things as we learn what is commonly added/replaced/removed.
fair enough.