From 10791b231aa459d4d482a7b9cf112feb1e7390aa Mon Sep 17 00:00:00 2001 From: "yihang.lyh" Date: Wed, 26 Apr 2017 12:33:33 +0800 Subject: [PATCH] feat: add switch for server render error fallback --- .gitignore | 1 + README.md | 3 +++ app/extend/context.js | 7 +++++-- config/config.default.js | 1 + test/view-vue-ssr.test.js | 8 ++++++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 69d1744..77ecfeb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ run/ .DS_Store *.swp *.iml +*.lock .vscode diff --git a/README.md b/README.md index 1682afd..1b8d9a4 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ exports.vuessr = { // buildConfig: path.join(app.baseDir, 'config/buildConfig.json'), // injectCss: true, // injectJs: true, + // fallbackToClient: true, // fallback to client rendering after server rendering failed // afterRender: (html, context) => { // return html; // }, @@ -63,3 +64,5 @@ Please open an issue [here](https://github.com/hubcarl/egg-view-vue-ssr/issues). ## License [MIT](LICENSE) + + diff --git a/app/extend/context.js b/app/extend/context.js index 2a5ad6d..0a2d5bd 100644 --- a/app/extend/context.js +++ b/app/extend/context.js @@ -18,8 +18,11 @@ module.exports = { const template = options.renderOptions && options.renderOptions.template || this.app.vue.resource.template; const context = { state: locals }; const html = yield this.app.vue.renderCode(code, context, options).catch(err => { - this.app.logger.error('[%s] server render bundle error, try client render, the server render error', name, err); - return this.renderString(template, context.state); + if (config.fallbackToClient) { + this.app.logger.error('[%s] server render bundle error, try client render, the server render error', name, err); + return this.renderString(template, context.state); + } + throw err; }); this.body = this.app.vue.resource.inject(name, html, context, config); }, diff --git a/config/config.default.js b/config/config.default.js index bdde525..2393405 100644 --- a/config/config.default.js +++ b/config/config.default.js @@ -22,6 +22,7 @@ module.exports = app => { buildConfig: path.join(app.baseDir, 'config/buildConfig.json'), injectCss: true, injectJs: true, + fallbackToClient: true, // fallback to client rendering if server render failed afterRender: (html, context) => { /* eslint no-unused-vars:off */ return html; }, diff --git a/test/view-vue-ssr.test.js b/test/view-vue-ssr.test.js index 94915d7..72c00b2 100644 --- a/test/view-vue-ssr.test.js +++ b/test/view-vue-ssr.test.js @@ -62,6 +62,14 @@ describe('test/view-vue-ssr.test.js', () => { assert(res.text.indexOf('/public/static/js/error/error.js"') > -1); }); }); + + it('should GET /render server error, don\'t fallback', () => { + mm(app.config.vuessr, 'fallbackToClient', false); + + return request(app.callback()) + .get('/renderServerError') + .expect(500); + }); }); });