Created
April 18, 2019 20:33
-
-
Save webislife/05840cecd5e3d106ade53457bd92ace3 to your computer and use it in GitHub Desktop.
This file contains 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
const path = require('path'); | |
const LRU = require('lru-cache'); | |
const fastify = require('fastify'); | |
const server = fastify({ | |
logger: false, | |
}); | |
const bundle = require('./../dist/vue-ssr-server-bundle.json'); | |
const vueRenderer = require('vue-server-renderer'); | |
const fs = require('fs'); | |
const templatePath = path.resolve(__dirname, './index.html'); | |
const template = fs.readFileSync(templatePath, 'utf-8'); | |
const isProd = (process.env.NODE_ENV === 'production'); | |
const resolve = file => path.resolve(__dirname, file); | |
const appConf = require('./env.conf.js'); | |
server.register(require('fastify-cookie')); | |
/* eslint-disable no-console */ | |
const clientManifest = require('./../dist/client-manifest.json'); | |
function createRenderer(bundle, options) { | |
return vueRenderer.createBundleRenderer(bundle, Object.assign(options, { | |
cache: new LRU({ | |
max: 10000, | |
maxAge: 1000 * 60 * 60, | |
}), | |
basedir: resolve('./dist'), | |
runInNewContext: 'once', | |
clientManifest, | |
})); | |
} | |
let renderer = null; | |
let readyPromise = null; | |
if(appConf.ENV === 'production') { | |
renderer = createRenderer(bundle, { | |
template, | |
}); | |
} else { | |
readyPromise = require(resolve('./../build/dev-server'))( | |
server, | |
templatePath, | |
(bundle, options) => { | |
renderer = createRenderer(bundle, options); | |
} | |
); | |
} | |
const handleError = (err, res, req) => { | |
// Render Error Page or Redirect | |
if (err.url) { | |
res.redirect(err.url); | |
} else if(err.code === 404) { | |
res.status(404).send('404 | Page Not Found'); | |
} else { | |
server.log.error('error during render', err.stack); | |
res.status(500).send('500 | Internal Server Error'); | |
} | |
}; | |
function render (req, res) { | |
const context = { | |
req, | |
res, | |
title: 'Vue SSR app', | |
url: req.raw.url, | |
}; | |
renderer.renderToString(context, (err, html) => { | |
if (err) { | |
return handleError(err, res, req); | |
} | |
res | |
.code(200) | |
.header('Content-Type', 'text/html; charset=utf-8') | |
.send(html); | |
}); | |
} | |
//Forward all get requests to renderer | |
server.get('*', (req, res) => { | |
if (appConf.ENV === 'development') { | |
readyPromise.then(() => render(req, res)).catch(err => server.log.error(err)); | |
} else { | |
render(req, res); | |
} | |
}); | |
//В dev режиме статику раздает нода | |
if(isProd === false) { | |
server.register(require('fastify-static'), { | |
root: resolve('./../dist'), | |
prefix: '/dist', | |
}); | |
} | |
server.listen(appConf.SSR_PORT, (err, addr) => { | |
if (err) { | |
server.log.error(err); | |
throw err; | |
} | |
server.log.info(`SSR listening on ${addr}`); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment