Skip to content

Commit ac219b3

Browse files
committed
ssr direct mode
1 parent dc21884 commit ac219b3

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ type RenderBundle = {
3030
export function createBundleRendererCreator (createRenderer: () => Renderer) {
3131
return function createBundleRenderer (
3232
bundle: string | RenderBundle,
33-
rendererOptions?: RenderOptions
33+
rendererOptions?: RenderOptions = {}
3434
) {
3535
let files, entry, maps, moduleMappings
36-
let basedir = rendererOptions && rendererOptions.basedir
36+
let basedir = rendererOptions.basedir
37+
const direct = rendererOptions.directMode
3738

3839
// load bundle if given filepath
3940
if (
@@ -83,7 +84,7 @@ export function createBundleRendererCreator (createRenderer: () => Renderer) {
8384
}
8485
const renderer = createRenderer(rendererOptions)
8586

86-
const run = createBundleRunner(entry, files, basedir)
87+
const run = createBundleRunner(entry, files, basedir, direct)
8788

8889
return {
8990
renderToString: (context?: Object, cb: (err: ?Error, res: ?string) => void) => {

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

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,31 @@ function compileModule (files, basedir) {
7070
return evaluateModule
7171
}
7272

73-
export function createBundleRunner (entry, files, basedir) {
73+
export function createBundleRunner (entry, files, basedir, direct) {
7474
const evaluate = compileModule(files, basedir)
75-
return (_context = {}) => new Promise((resolve, reject) => {
76-
const context = createContext(_context)
77-
const evaluatedFiles = _context._evaluatedFiles = {}
78-
const res = evaluate(entry, context, evaluatedFiles)
79-
resolve(typeof res === 'function' ? res(_context) : res)
80-
})
75+
if (!direct) {
76+
// default mode: creates a fresh context and re-evaluate the bundle
77+
// on each render. Ensures entire application state is fresh for each
78+
// render, but incurs extra evaluation cost.
79+
return (_context = {}) => new Promise((resolve, reject) => {
80+
const context = createContext(_context)
81+
const evaluatedFiles = _context._evaluatedFiles = {}
82+
const res = evaluate(entry, context, evaluatedFiles)
83+
resolve(typeof res === 'function' ? res(_context) : res)
84+
})
85+
} else {
86+
// direct mode: instead of re-evaluating the whole bundle on
87+
// each render, it simply calls the exported function. This avoids the
88+
// module evaluation costs but requires the source code to be structured
89+
// slightly differently.
90+
const context = createContext()
91+
const runner = evaluate(entry, context, {})
92+
if (typeof runner !== 'function') {
93+
throw new Error('direct mode expects bundle export to be a function.')
94+
}
95+
return (_context = {}) => {
96+
context.__VUE_SSR_CONTEXT__ = _context
97+
return runner(_context)
98+
}
99+
}
81100
}

src/server/create-renderer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export type RenderOptions = {
2424
cache?: RenderCache;
2525
template?: string;
2626
basedir?: string;
27+
directMode?: boolean;
2728
shouldPreload?: Function;
2829
serverManifest?: ServerManifest;
2930
clientManifest?: ClientManifest;

0 commit comments

Comments
 (0)