From 88b32fcc182035c50ab24c8a39d80c7a53c13465 Mon Sep 17 00:00:00 2001 From: Dmitry Sharshakov Date: Thu, 28 Feb 2019 11:19:39 +0300 Subject: [PATCH 1/4] feat: add access to context from serverPrefetch --- src/server/render.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/render.js b/src/server/render.js index 05ba588006d..387f25dfd72 100644 --- a/src/server/render.js +++ b/src/server/render.js @@ -57,7 +57,7 @@ function waitForServerPrefetch (vm, resolve, reject) { try { const promises = [] for (let i = 0, j = handlers.length; i < j; i++) { - const result = handlers[i].call(vm, vm) + const result = handlers[i].call(vm.$ssrContext, vm, vm) if (result && typeof result.then === 'function') { promises.push(result) } From ae5bf0be22dc9dde06dfea0c77e881015869d19e Mon Sep 17 00:00:00 2001 From: GU Yiling Date: Thu, 28 Feb 2019 11:32:35 +0300 Subject: [PATCH 2/4] Update src/server/render.js Co-Authored-By: sh7dm --- src/server/render.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/render.js b/src/server/render.js index 387f25dfd72..37d279610e6 100644 --- a/src/server/render.js +++ b/src/server/render.js @@ -57,7 +57,7 @@ function waitForServerPrefetch (vm, resolve, reject) { try { const promises = [] for (let i = 0, j = handlers.length; i < j; i++) { - const result = handlers[i].call(vm.$ssrContext, vm, vm) + const result = handlers[i].call(vm, vm.$ssrContext) if (result && typeof result.then === 'function') { promises.push(result) } From 5bd9933079d140f82c60ab42b0d36e72fdf7f497 Mon Sep 17 00:00:00 2001 From: sh7dm Date: Fri, 1 Mar 2019 13:13:56 +0300 Subject: [PATCH 3/4] fix(SSR): fix passing context --- src/server/render.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/render.js b/src/server/render.js index 37d279610e6..e5ef04da672 100644 --- a/src/server/render.js +++ b/src/server/render.js @@ -50,14 +50,14 @@ const normalizeRender = vm => { } } -function waitForServerPrefetch (vm, resolve, reject) { +function waitForServerPrefetch (vm, resolve, reject, ssrContext) { let handlers = vm.$options.serverPrefetch if (isDef(handlers)) { if (!Array.isArray(handlers)) handlers = [handlers] try { const promises = [] for (let i = 0, j = handlers.length; i < j; i++) { - const result = handlers[i].call(vm, vm.$ssrContext) + const result = handlers[i].call(vm, ssrContext) if (result && typeof result.then === 'function') { promises.push(result) } @@ -206,7 +206,7 @@ function renderComponentInner (node, isRoot, context) { const reject = context.done - waitForServerPrefetch(child, resolve, reject) + waitForServerPrefetch(child, resolve, reject, context) } function renderAsyncComponent (node, isRoot, context) { @@ -432,6 +432,6 @@ export function createRenderFunction ( const resolve = () => { renderNode(component._render(), true, context) } - waitForServerPrefetch(component, resolve, done) + waitForServerPrefetch(component, resolve, done, context) } } From c28b066ec240d07f3671a09ba97440e1da5f3935 Mon Sep 17 00:00:00 2001 From: sh7dm Date: Fri, 1 Mar 2019 14:40:28 +0300 Subject: [PATCH 4/4] test(SSR): add a test for $ssrContext passing --- test/ssr/ssr-string.spec.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/test/ssr/ssr-string.spec.js b/test/ssr/ssr-string.spec.js index 66acf008a00..8b7dc51374c 100644 --- a/test/ssr/ssr-string.spec.js +++ b/test/ssr/ssr-string.spec.js @@ -1334,6 +1334,28 @@ describe('SSR: renderToString', () => { }) }) + it('should pass $ssrContext to serverPrefetch option', done => { + renderVmWithOptions({ + template: ` +
{{ ctx }}
+ `, + data: { + count: 0 + }, + serverPrefetch (ctx) { + return new Promise((resolve) => { + setTimeout(() => { + this.ctx = ctx.userContext.foo + resolve() + }, 1) + }) + } + }, result => { + expect(result).toContain('
bar
') + done() + }, { foo: 'bar' }) + }) + it('should support serverPrefetch option (nested)', done => { renderVmWithOptions({ template: ` @@ -1543,8 +1565,8 @@ describe('SSR: renderToString', () => { }) }) -function renderVmWithOptions (options, cb) { - renderToString(new Vue(options), (err, res) => { +function renderVmWithOptions (options, cb, ctx = {}) { + renderToString(new Vue(options), ctx, (err, res) => { expect(err).toBeNull() cb(res) })