@@ -70,12 +70,31 @@ function compileModule (files, basedir) {
70
70
return evaluateModule
71
71
}
72
72
73
- export function createBundleRunner ( entry , files , basedir ) {
73
+ export function createBundleRunner ( entry , files , basedir , direct ) {
74
74
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
+ }
81
100
}
0 commit comments