Adds generate error report from renderer and minification. Changes the behavior where generate would terminate on error, now it instead gathers the error from crashing routes and compiles an error report.

This commit is contained in:
Johan Roxendal 2017-04-24 22:21:11 +02:00 committed by johan.roxendal@gu.se
parent ded7de0e72
commit d469f38d98
2 changed files with 36 additions and 5 deletions

View File

@ -41,6 +41,7 @@ const defaults = {
export default function () {
const s = Date.now()
let errors = []
/*
** Set variables
*/
@ -97,14 +98,26 @@ export default function () {
yield routes.splice(0, 500).map((route) => {
return co(function * () {
yield waitFor(n++ * self.options.generate.interval)
var { html } = yield self.renderRoute(route, { _generate: true })
html = minify(html, self.options.generate.minify)
var { html, error } = yield self.renderRoute(route, { _generate: true })
// TODO: if error is truthy and html null, do continue
if(error) {
// console.log("error caught", error)
errors.push([route, error.errorObj])
return
}
try {
var minifiedHtml = minify(html, self.options.generate.minify)
} catch(err) {
let minifyErr = new Error(`HTML minification failed. Make sure the route generates valid HTML. Failed HTML:\n ${html}`)
errors.push([route, minifyErr])
return
}
var path = join(route, sep, 'index.html') // /about -> /about/index.html
debug('Generate file: ' + path)
path = join(distPath, path)
// Make sure the sub folders are created
yield mkdirp(dirname(path))
yield writeFile(path, html, 'utf8')
yield writeFile(path, minifiedHtml, 'utf8')
})
})
}
@ -119,6 +132,12 @@ export default function () {
.then(() => {
const duration = Math.round((Date.now() - s) / 100) / 10
debug(`HTML Files generated in ${duration}s`)
if(errors.length) {
console.error("==== Error report ==== \n" + errors.map( ([route, err]) => {
return `Route: '${route}'\n${err.stack}`
}).join("\n\n"))
}
return this
})
}

View File

@ -96,7 +96,19 @@ export function renderRoute (url, context = {}) {
// Call renderToSting from the bundleRenderer and generate the HTML (will update the context as well)
const self = this
return co(function * () {
let APP = yield self.renderToString(context)
try {
var APP = yield self.renderToString(context)
} catch(err) {
return {
html : null,
error : {
statusCode : 500,
message : err.message,
errorObj : err
},
redirected: context.redirected
}
}
if (!context.nuxt.serverRendered) {
APP = '<div id="__nuxt"></div>'
}
@ -168,4 +180,4 @@ export function renderAndGetWindow (url, opts = {}) {
}
})
})
}
}