vue-easy-renderer
Version:
Vue.js 2.0 server-side renderer for *.vue file with Node.js.
55 lines (48 loc) • 1.87 kB
JavaScript
//
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;