Skip to content

Instantly share code, notes, and snippets.

@webislife
Created April 18, 2019 20:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save webislife/05840cecd5e3d106ade53457bd92ace3 to your computer and use it in GitHub Desktop.
Save webislife/05840cecd5e3d106ade53457bd92ace3 to your computer and use it in GitHub Desktop.
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