UNPKG

vue-easy-renderer

Version:

Vue.js 2.0 server-side renderer for *.vue file with Node.js.

55 lines (48 loc) 1.87 kB
// const path = require('path'); const rendererFactory = require('./renderer/factory'); const ErrorTypes = require('./error'); const noop = () => { }; function vueEasyRenderer(basePath, VEROptions) { const errorHandler = (e) => { if (VEROptions && VEROptions.onError) { VEROptions.onError(e); } else { console.error(e); // eslint-disable-line no-console } }; const readyHandler = (VEROptions && VEROptions.onReady) || noop; const renderer = rendererFactory(basePath, VEROptions); renderer.on('error', errorHandler); renderer.on('ready', readyHandler); return (req, res, next) => { const url = req.originalUrl; res.vueRender = (vueFilePath, state, options) => { res.set('Content-Type', 'text/html'); const filePath = path.resolve(basePath, vueFilePath); const renderOptions = Object.assign({}, { url }, options); return renderer.renderToStream(filePath, state, renderOptions).then((stream) => { stream.on('data', chunk => res.write(chunk)); stream.on('end', () => res.end()); }).catch((e) => { const error = new ErrorTypes.RenderError(e); error.component = vueFilePath; error.state = state; errorHandler(error); next(error); }); }; res.vueRenderToStream = (vueFilePath, state, options) => { const filePath = path.resolve(basePath, vueFilePath); const renderOptions = Object.assign({}, { url }, options); return renderer.renderToStream(filePath, state, renderOptions); }; res.vueRenderToString = (vueFilePath, state, options) => { const renderOptions = Object.assign({}, { url }, options); const filePath = path.resolve(basePath, vueFilePath); return renderer.renderToString(filePath, state, renderOptions); }; return next(); }; } module.exports = vueEasyRenderer;