@ewizardjs/prerenderer
Version:
Fast, flexible, framework-agnostic prerendering for sites and SPAs.
55 lines (41 loc) • 1.43 kB
JavaScript
const express = require('express')
const proxy = require('http-proxy-middleware')
const path = require('path')
class Server {
constructor (Prerenderer) {
this._prerenderer = Prerenderer
this._options = Prerenderer.getOptions()
this._expressServer = express()
this._nativeServer = null
}
initialize () {
const server = this._expressServer
if (this._options.server && this._options.server.before) {
this._options.server.before(server)
}
this._prerenderer.modifyServer(this, 'pre-static')
server.get('*', express.static(this._options.staticDir, {
dotfiles: 'allow'
}))
this._prerenderer.modifyServer(this, 'post-static')
this._prerenderer.modifyServer(this, 'pre-fallback')
if (this._options.server && this._options.server.proxy) {
for (let proxyPath of Object.keys(this._options.server.proxy)) {
server.use(proxyPath, proxy(this._options.server.proxy[proxyPath]))
}
}
server.get('*', (req, res) => {
res.sendFile(this._options.indexPath ? this._options.indexPath : path.join(this._options.staticDir, 'index.html'))
})
this._prerenderer.modifyServer(this, 'post-fallback')
return new Promise((resolve, reject) => {
this._nativeServer = server.listen(this._options.server.port, () => {
resolve()
})
})
}
destroy () {
this._nativeServer.close()
}
}
module.exports = Server