From 691ecfeb0cd5f35a96cdc4c0c40f5415bfc9d5d9 Mon Sep 17 00:00:00 2001 From: hubcarl Date: Mon, 31 Jul 2017 14:51:42 +0800 Subject: [PATCH] feat:add renderClient method --- README.md | 25 +++++++++++++++++++++++++ app/extend/context.js | 26 ++++++++++++++++++-------- lib/resource.js | 2 +- package.json | 2 +- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 75ec2c7..2a55b9c 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,31 @@ exports.vuessr = { }; ``` +## Render + +### Server Render, call `render` method + +```js +// controller/home.js +exports.index = function* (ctx) { + yield ctx.render('index/index.js', Model.getPage(1, 10)); +}; + +``` + +### Client Render, Call `renderClient` or build static html to `egg-static` dir by Webpack. + +when client render , the template is `exports.vuessr.layout` + +```js +// controller/home.js +exports.client = function* (ctx) { + yield ctx.renderClient('index/index.js', Model.getPage(1, 10)); +}; + +``` + + see [config/config.default.js](config/config.default.js) for more detail. ## Questions & Suggestions diff --git a/app/extend/context.js b/app/extend/context.js index fbcd6aa..34db6d6 100644 --- a/app/extend/context.js +++ b/app/extend/context.js @@ -15,13 +15,23 @@ module.exports = { const template = options.renderOptions && options.renderOptions.template || this.app.vue.resource.template; const context = { state: locals }; const filepath = path.join(this.app.config.view.root[0], name); - const html = yield this.app.vue.renderBundle(filepath, context, options).catch(err => { - 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, options); + let html = ''; + if (options.renderClient) { + html = yield this.renderString(template, context.state); + } else { + html = yield this.app.vue.renderBundle(filepath, context, options).catch(err => { + 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(html, context, name, config, options); + }, + + * renderClient(name, locals, options = {}) { + options.renderClient = true; + yield this.render(name, locals, options); }, }; diff --git a/lib/resource.js b/lib/resource.js index 9da6e96..dafd1bd 100644 --- a/lib/resource.js +++ b/lib/resource.js @@ -147,7 +147,7 @@ class Resource { } - inject(name, html, context, config, options) { + inject(html, context, name, config, options) { const fileKey = name; const fileManifest = this.resourceDeps[fileKey]; if (fileManifest) { diff --git a/package.json b/package.json index 014647b..57567e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "egg-view-vue-ssr", - "version": "2.0.5", + "version": "2.1.0", "description": "vue server side render solution for egg-view-vue", "eggPlugin": { "name": "vuessr",