Skip to content

Commit 5eeb9de

Browse files
committed
ssr: repeat all test cases for directMode
1 parent 760a744 commit 5eeb9de

File tree

3 files changed

+90
-70
lines changed

3 files changed

+90
-70
lines changed

src/server/bundle-renderer/create-bundle-runner.js

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,30 +92,33 @@ export function createBundleRunner (entry, files, basedir, direct) {
9292
// default mode: creates a fresh context and re-evaluate the bundle
9393
// on each render. Ensures entire application state is fresh for each
9494
// render, but incurs extra evaluation cost.
95-
return (_context = {}) => new Promise((resolve, reject) => {
96-
_context._registeredComponents = new Set()
97-
const res = evaluate(entry, createContext(_context))
98-
resolve(typeof res === 'function' ? res(_context) : res)
95+
return (userContext = {}) => new Promise(resolve => {
96+
userContext._registeredComponents = new Set()
97+
const res = evaluate(entry, createContext(userContext))
98+
resolve(typeof res === 'function' ? res(userContext) : res)
9999
})
100100
} else {
101101
// direct mode: instead of re-evaluating the whole bundle on
102102
// each render, it simply calls the exported function. This avoids the
103103
// module evaluation costs but requires the source code to be structured
104104
// slightly differently.
105-
const initialExposedContext = {}
106-
const context = createContext(initialExposedContext)
107-
const runner = evaluate(entry, context)
108-
if (typeof runner !== 'function') {
109-
throw new Error('direct mode expects bundle export to be a function.')
110-
}
111-
return (_context = {}) => {
112-
context.__VUE_SSR_CONTEXT__ = _context
113-
_context._registeredComponents = new Set()
105+
const initialContext = {}
106+
const sharedContext = createContext(initialContext)
107+
let runner // lazy creation so that errors can be caught by user
108+
return (userContext = {}) => new Promise(resolve => {
109+
if (!runner) {
110+
runner = evaluate(entry, sharedContext)
111+
if (typeof runner !== 'function') {
112+
throw new Error('direct mode expects bundle export to be a function.')
113+
}
114+
}
115+
sharedContext.__VUE_SSR_CONTEXT__ = userContext
116+
userContext._registeredComponents = new Set()
114117
// vue-style-loader styles imported outside of component lifecycle hooks
115-
if (initialExposedContext._styles) {
116-
_context._styles = deepClone(initialExposedContext._styles)
118+
if (initialContext._styles) {
119+
userContext._styles = deepClone(initialContext._styles)
117120
}
118-
return runner(_context)
119-
}
121+
resolve(runner(userContext))
122+
})
120123
}
121124
}

test/ssr/ssr-bundle-render.spec.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,13 @@ export function createRenderer (file, options, cb) {
3333
}
3434

3535
describe('SSR: bundle renderer', () => {
36+
createAssertions(true)
37+
createAssertions(false)
38+
})
39+
40+
function createAssertions (directMode) {
3641
it('renderToString', done => {
37-
createRenderer('app.js', renderer => {
42+
createRenderer('app.js', { directMode }, renderer => {
3843
const context = { url: '/test' }
3944
renderer.renderToString(context, (err, res) => {
4045
expect(err).toBeNull()
@@ -46,7 +51,7 @@ describe('SSR: bundle renderer', () => {
4651
})
4752

4853
it('renderToStream', done => {
49-
createRenderer('app.js', renderer => {
54+
createRenderer('app.js', { directMode }, renderer => {
5055
const context = { url: '/test' }
5156
const stream = renderer.renderToStream(context)
5257
let res = ''
@@ -62,7 +67,7 @@ describe('SSR: bundle renderer', () => {
6267
})
6368

6469
it('renderToString catch error', done => {
65-
createRenderer('error.js', renderer => {
70+
createRenderer('error.js', { directMode }, renderer => {
6671
renderer.renderToString(err => {
6772
expect(err.message).toBe('foo')
6873
done()
@@ -71,7 +76,7 @@ describe('SSR: bundle renderer', () => {
7176
})
7277

7378
it('renderToStream catch error', done => {
74-
createRenderer('error.js', renderer => {
79+
createRenderer('error.js', { directMode }, renderer => {
7580
const stream = renderer.renderToStream()
7681
stream.on('error', err => {
7782
expect(err.message).toBe('foo')
@@ -85,6 +90,7 @@ describe('SSR: bundle renderer', () => {
8590
const get = jasmine.createSpy('get')
8691
const set = jasmine.createSpy('set')
8792
const options = {
93+
directMode,
8894
cache: {
8995
// async
9096
get: (key, cb) => {
@@ -127,6 +133,7 @@ describe('SSR: bundle renderer', () => {
127133
const get = jasmine.createSpy('get')
128134
const set = jasmine.createSpy('set')
129135
const options = {
136+
directMode,
130137
cache: {
131138
// async
132139
has: (key, cb) => {
@@ -172,7 +179,10 @@ describe('SSR: bundle renderer', () => {
172179
const cache = LRU({ maxAge: Infinity })
173180
spyOn(cache, 'get').and.callThrough()
174181
spyOn(cache, 'set').and.callThrough()
175-
const options = { cache }
182+
const options = {
183+
cache,
184+
directMode
185+
}
176186
createRenderer('nested-cache.js', options, renderer => {
177187
const expected = '<div data-server-rendered="true">/test</div>'
178188
const key = 'app::1'
@@ -203,7 +213,7 @@ describe('SSR: bundle renderer', () => {
203213
})
204214

205215
it('renderToString (bundle format with code split)', done => {
206-
createRenderer('split.js', { asBundle: true }, renderer => {
216+
createRenderer('split.js', { directMode, asBundle: true }, renderer => {
207217
const context = { url: '/test' }
208218
renderer.renderToString(context, (err, res) => {
209219
expect(err).toBeNull()
@@ -214,7 +224,7 @@ describe('SSR: bundle renderer', () => {
214224
})
215225

216226
it('renderToStream (bundle format with code split)', done => {
217-
createRenderer('split.js', { asBundle: true }, renderer => {
227+
createRenderer('split.js', { directMode, asBundle: true }, renderer => {
218228
const context = { url: '/test' }
219229
const stream = renderer.renderToStream(context)
220230
let res = ''
@@ -229,7 +239,7 @@ describe('SSR: bundle renderer', () => {
229239
})
230240

231241
it('renderToString catch error (bundle format with source map)', done => {
232-
createRenderer('error.js', { asBundle: true }, renderer => {
242+
createRenderer('error.js', { directMode, asBundle: true }, renderer => {
233243
renderer.renderToString(err => {
234244
expect(err.stack).toContain('test/ssr/fixtures/error.js:1:6')
235245
expect(err.message).toBe('foo')
@@ -239,7 +249,7 @@ describe('SSR: bundle renderer', () => {
239249
})
240250

241251
it('renderToString catch error (bundle format with source map)', done => {
242-
createRenderer('error.js', { asBundle: true }, renderer => {
252+
createRenderer('error.js', { directMode, asBundle: true }, renderer => {
243253
const stream = renderer.renderToStream()
244254
stream.on('error', err => {
245255
expect(err.stack).toContain('test/ssr/fixtures/error.js:1:6')
@@ -248,4 +258,4 @@ describe('SSR: bundle renderer', () => {
248258
})
249259
})
250260
})
251-
})
261+
}

test/ssr/ssr-template.spec.js

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -169,56 +169,63 @@ describe('SSR: template option', () => {
169169
`<script src="/main.js"></script>` +
170170
`</body></html>`
171171

172-
it('bundleRenderer + renderToString + clientManifest', done => {
173-
createRendererWithManifest('split.js', renderer => {
174-
renderer.renderToString({}, (err, res) => {
175-
expect(err).toBeNull()
176-
expect(res).toContain(expectedHTMLWithManifest(false))
177-
done()
172+
createClientManifestAssertions(true)
173+
createClientManifestAssertions(false)
174+
175+
function createClientManifestAssertions (directMode) {
176+
it('bundleRenderer + renderToString + clientManifest', done => {
177+
createRendererWithManifest('split.js', { directMode }, renderer => {
178+
renderer.renderToString({}, (err, res) => {
179+
expect(err).toBeNull()
180+
expect(res).toContain(expectedHTMLWithManifest(false))
181+
done()
182+
})
178183
})
179184
})
180-
})
181185

182-
it('bundleRenderer + renderToStream + clientManifest + shouldPreload', done => {
183-
createRendererWithManifest('split.js', {
184-
shouldPreload: (file, type) => {
185-
if (type === 'image' || type === 'script' || type === 'font') {
186-
return true
186+
it('bundleRenderer + renderToStream + clientManifest + shouldPreload', done => {
187+
createRendererWithManifest('split.js', {
188+
directMode,
189+
shouldPreload: (file, type) => {
190+
if (type === 'image' || type === 'script' || type === 'font') {
191+
return true
192+
}
187193
}
188-
}
189-
}, renderer => {
190-
const stream = renderer.renderToStream({})
191-
let res = ''
192-
stream.on('data', chunk => {
193-
res += chunk.toString()
194-
})
195-
stream.on('end', () => {
196-
expect(res).toContain(expectedHTMLWithManifest(true))
197-
done()
194+
}, renderer => {
195+
const stream = renderer.renderToStream({})
196+
let res = ''
197+
stream.on('data', chunk => {
198+
res += chunk.toString()
199+
})
200+
stream.on('end', () => {
201+
expect(res).toContain(expectedHTMLWithManifest(true))
202+
done()
203+
})
198204
})
199205
})
200-
})
201-
202-
it('bundleRenderer + renderToString + clientManifest + no template', done => {
203-
createRendererWithManifest('split.js', {
204-
template: null
205-
}, renderer => {
206-
const context = {}
207-
renderer.renderToString(context, (err, res) => {
208-
expect(err).toBeNull()
209-
210-
const customOutput =
211-
`<html><head>${
212-
context.renderPreloadLinks() +
213-
context.renderPrefetchLinks()
214-
}</head><body>${
215-
res +
216-
context.renderScripts()
217-
}</body></html>`
218206

219-
expect(customOutput).toContain(expectedHTMLWithManifest(false))
220-
done()
207+
it('bundleRenderer + renderToString + clientManifest + no template', done => {
208+
createRendererWithManifest('split.js', {
209+
directMode,
210+
template: null
211+
}, renderer => {
212+
const context = {}
213+
renderer.renderToString(context, (err, res) => {
214+
expect(err).toBeNull()
215+
216+
const customOutput =
217+
`<html><head>${
218+
context.renderPreloadLinks() +
219+
context.renderPrefetchLinks()
220+
}</head><body>${
221+
res +
222+
context.renderScripts()
223+
}</body></html>`
224+
225+
expect(customOutput).toContain(expectedHTMLWithManifest(false))
226+
done()
227+
})
221228
})
222229
})
223-
})
230+
}
224231
})

0 commit comments

Comments
 (0)