Skip to content

Instantly share code, notes, and snippets.

@alexklyuev
Created September 16, 2019 15:54
Show Gist options
  • Save alexklyuev/aa5b191857d81d0d6a69fa771beb5cff to your computer and use it in GitHub Desktop.
Save alexklyuev/aa5b191857d81d0d6a69fa771beb5cff to your computer and use it in GitHub Desktop.
const fs = require('fs');
const path = require('path');
const webpack = require('webpack');
const { createBundleRenderer } = require('vue-server-renderer');
const clientConfig = require('./build/webpack.client.config');
const serverConfig = require('./build/webpack.server.config');
const clientCompiler = webpack(clientConfig);
const serverCompiler = webpack(serverConfig);
const app = require('express')();
const devMiddleware = require('webpack-dev-middleware')(clientCompiler, {
publicPath: clientConfig.output.publicPath,
});
app.use(devMiddleware);
app.use(require('webpack-hot-middleware')(clientCompiler, { heartbeat: 5000 }));
clientConfig.entry.app = ['webpack-hot-middleware/client', clientConfig.entry.app];
clientConfig.plugins.push(new webpack.HotModuleReplacementPlugin());
const memory = new (require('memory-fs'));
const template = fs.readFileSync('./src/index.template.html', 'utf-8');
const ready = Promise.all([
new Promise(resolve => { // client
clientCompiler.plugin('done', _stats => {
const clientManifest = JSON.parse(
devMiddleware.fileSystem.readFileSync(
path.resolve(__dirname, './dist/vue-ssr-client-manifest.json'), 'utf-8'
)
);
resolve(clientManifest);
});
}),
new Promise(resolve => { // server
serverCompiler.outputFileSystem = memory;
serverCompiler.watch({}, () => {
const serverBundle = JSON.parse(
memory.readFileSync(
path.resolve(__dirname, './dist/vue-ssr-server-bundle.json'), 'utf-8'
)
);
resolve(serverBundle);
});
}),
]);
app.get('*', async (request, response) => {
const [ clientManifest, serverBundle ] = await ready;
const renderer = createBundleRenderer(serverBundle, { clientManifest, template });
const render = await renderer.renderToString({url: request.url, title: 'hello'});
response.end(render);
});
app.listen(9999);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment