diff --git a/build/setup-dev-server.js b/build/setup-dev-server.js index 53c9fca..346a14b 100644 --- a/build/setup-dev-server.js +++ b/build/setup-dev-server.js @@ -52,7 +52,7 @@ module.exports = function setupDevServer (app, cb) { }) // hot middleware - app.use(require('webpack-hot-middleware')(clientCompiler)) + app.use(require('webpack-hot-middleware')(clientCompiler, { heartbeat: 5000 })) // watch and update server renderer const serverCompiler = webpack(serverConfig) diff --git a/server.js b/server.js index 40368db..1b985b5 100644 --- a/server.js +++ b/server.js @@ -85,7 +85,9 @@ function render (req, res) { res.setHeader("Server", serverInfo) const handleError = err => { - if (err && err.code === 404) { + if (err.url) { + res.redirect(err.url) + } else if(err.code === 404) { res.status(404).end('404 | Page Not Found') } else { // Render Error Page or Redirect diff --git a/src/entry-client.js b/src/entry-client.js index 23aade2..5e730a4 100644 --- a/src/entry-client.js +++ b/src/entry-client.js @@ -63,6 +63,6 @@ router.onReady(() => { }) // service worker -if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { +if ('https:' === location.protocol && navigator.serviceWorker) { navigator.serviceWorker.register('/service-worker.js') } diff --git a/src/entry-server.js b/src/entry-server.js index 2adc7fc..f5aa447 100644 --- a/src/entry-server.js +++ b/src/entry-server.js @@ -12,8 +12,15 @@ export default context => { const s = isDev && Date.now() const { app, router, store } = createApp() + const { url } = context + const fullPath = router.resolve(url).route.fullPath + + if (fullPath !== url) { + reject({ url: fullPath }) + } + // set router's location - router.push(context.url) + router.push(url) // wait until router has resolved possible async hooks router.onReady(() => { @@ -26,12 +33,10 @@ export default context => { // A preFetch hook dispatches a store action and returns a Promise, // which is resolved when the action is complete and store state has been // updated. - Promise.all(matchedComponents.map(component => { - return component.asyncData && component.asyncData({ - store, - route: router.currentRoute - }) - })).then(() => { + Promise.all(matchedComponents.map(({ asyncData }) => asyncData && asyncData({ + store, + route: router.currentRoute + }))).then(() => { isDev && console.log(`data pre-fetch: ${Date.now() - s}ms`) // After all preFetch hooks are resolved, our store is now // filled with the state needed to render the app.