Commit 68cdaa80 authored by Evan You's avatar Evan You

improve dev server startup

parent d09f91a9
...@@ -6,6 +6,13 @@ const serverConfig = require('./webpack.server.config') ...@@ -6,6 +6,13 @@ const serverConfig = require('./webpack.server.config')
module.exports = function setupDevServer (app, cb) { module.exports = function setupDevServer (app, cb) {
let bundle, clientManifest let bundle, clientManifest
let resolve
let resolved = false
const readyPromise = new Promise(r => { resolve = r })
const ready = (...args) => {
if (!resolved) resolve()
cb(...args)
}
// modify client config to work with hot middleware // modify client config to work with hot middleware
clientConfig.entry.app = ['webpack-hot-middleware/client', clientConfig.entry.app] clientConfig.entry.app = ['webpack-hot-middleware/client', clientConfig.entry.app]
...@@ -27,7 +34,7 @@ module.exports = function setupDevServer (app, cb) { ...@@ -27,7 +34,7 @@ module.exports = function setupDevServer (app, cb) {
const readFile = file => fs.readFileSync(path.join(clientConfig.output.path, file), 'utf-8') const readFile = file => fs.readFileSync(path.join(clientConfig.output.path, file), 'utf-8')
clientManifest = JSON.parse(readFile('vue-ssr-client-manifest.json')) clientManifest = JSON.parse(readFile('vue-ssr-client-manifest.json'))
if (bundle) { if (bundle) {
cb(bundle, { ready(bundle, {
clientManifest clientManifest
}) })
} }
...@@ -50,9 +57,11 @@ module.exports = function setupDevServer (app, cb) { ...@@ -50,9 +57,11 @@ module.exports = function setupDevServer (app, cb) {
// read bundle generated by vue-ssr-webpack-plugin // read bundle generated by vue-ssr-webpack-plugin
bundle = JSON.parse(readFile('vue-ssr-server-bundle.json')) bundle = JSON.parse(readFile('vue-ssr-server-bundle.json'))
if (clientManifest) { if (clientManifest) {
cb(bundle, { ready(bundle, {
clientManifest clientManifest
}) })
} }
}) })
return readyPromise
} }
...@@ -34,7 +34,7 @@ function createRenderer (bundle, options) { ...@@ -34,7 +34,7 @@ function createRenderer (bundle, options) {
} }
let renderer let renderer
let readyPromise
if (isProd) { if (isProd) {
// In production: create server renderer using built server bundle. // In production: create server renderer using built server bundle.
// The server bundle is generated by vue-ssr-webpack-plugin. // The server bundle is generated by vue-ssr-webpack-plugin.
...@@ -49,7 +49,7 @@ if (isProd) { ...@@ -49,7 +49,7 @@ if (isProd) {
} else { } else {
// In development: setup the dev server with watch and hot-reload, // In development: setup the dev server with watch and hot-reload,
// and create a new renderer on bundle / index template update. // and create a new renderer on bundle / index template update.
require('./build/setup-dev-server')(app, (bundle, options) => { readyPromise = require('./build/setup-dev-server')(app, (bundle, options) => {
renderer = createRenderer(bundle, options) renderer = createRenderer(bundle, options)
}) })
} }
...@@ -78,11 +78,7 @@ const microCache = LRU({ ...@@ -78,11 +78,7 @@ const microCache = LRU({
// headers. // headers.
const isCacheable = req => useMicroCache const isCacheable = req => useMicroCache
app.get('*', (req, res) => { function render (req, res) {
if (!renderer) {
return res.end('waiting for compilation... refresh in a moment.')
}
const s = Date.now() const s = Date.now()
res.setHeader("Content-Type", "text/html") res.setHeader("Content-Type", "text/html")
...@@ -122,6 +118,10 @@ app.get('*', (req, res) => { ...@@ -122,6 +118,10 @@ app.get('*', (req, res) => {
console.log(`whole request: ${Date.now() - s}ms`) console.log(`whole request: ${Date.now() - s}ms`)
} }
}) })
}
app.get('*', isProd ? render : (req, res) => {
readyPromise.then(() => render(req, res))
}) })
const port = process.env.PORT || 8080 const port = process.env.PORT || 8080
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment