@@ -5,7 +5,7 @@ const path = require('path')
5
5
const resolve = require ( 'resolve' )
6
6
const NativeModule = require ( 'module' )
7
7
8
- function createContext ( context ) {
8
+ function createSandbox ( context ) {
9
9
const sandbox = {
10
10
Buffer,
11
11
console,
@@ -40,20 +40,20 @@ function compileModule (files, basedir, runInNewContext) {
40
40
return script
41
41
}
42
42
43
- function evaluateModule ( filename , context , evaluatedFiles = { } ) {
43
+ function evaluateModule ( filename , sandbox , evaluatedFiles = { } ) {
44
44
if ( evaluatedFiles [ filename ] ) {
45
45
return evaluatedFiles [ filename ]
46
46
}
47
47
48
48
const script = getCompiledScript ( filename )
49
- const compiledWrapper = runInNewContext
50
- ? script . runInNewContext ( context )
51
- : script . runInThisContext ( )
49
+ const compiledWrapper = runInNewContext === false
50
+ ? script . runInThisContext ( )
51
+ : script . runInNewContext ( sandbox )
52
52
const m = { exports : { } }
53
53
const r = file => {
54
54
file = path . join ( '.' , file )
55
55
if ( files [ file ] ) {
56
- return evaluateModule ( file , context , evaluatedFiles )
56
+ return evaluateModule ( file , sandbox , evaluatedFiles )
57
57
} else if ( basedir ) {
58
58
return require (
59
59
resolvedModules [ file ] ||
@@ -90,13 +90,13 @@ function deepClone (val) {
90
90
91
91
export function createBundleRunner ( entry , files , basedir , runInNewContext ) {
92
92
const evaluate = compileModule ( files , basedir , runInNewContext )
93
- if ( runInNewContext ) {
93
+ if ( runInNewContext !== false && runInNewContext !== 'once' ) {
94
94
// new context mode: creates a fresh context and re-evaluate the bundle
95
95
// on each render. Ensures entire application state is fresh for each
96
96
// render, but incurs extra evaluation cost.
97
97
return ( userContext = { } ) => new Promise ( resolve => {
98
98
userContext . _registeredComponents = new Set ( )
99
- const res = evaluate ( entry , createContext ( userContext ) )
99
+ const res = evaluate ( entry , createSandbox ( userContext ) )
100
100
resolve ( typeof res === 'function' ? res ( userContext ) : res )
101
101
} )
102
102
} else {
@@ -108,13 +108,16 @@ export function createBundleRunner (entry, files, basedir, runInNewContext) {
108
108
let initialContext
109
109
return ( userContext = { } ) => new Promise ( resolve => {
110
110
if ( ! runner ) {
111
+ const sandbox = runInNewContext === 'once'
112
+ ? createSandbox ( )
113
+ : global
111
114
// the initial context is only used for collecting possible non-component
112
115
// styles injected by vue-style-loader.
113
- initialContext = global . __VUE_SSR_CONTEXT__ = { }
114
- runner = evaluate ( entry )
116
+ initialContext = sandbox . __VUE_SSR_CONTEXT__ = { }
117
+ runner = evaluate ( entry , sandbox )
115
118
// On subsequent renders, __VUE_SSR_CONTEXT__ will not be avaialbe
116
119
// to prevent cross-request pollution.
117
- delete global . __VUE_SSR_CONTEXT__
120
+ delete sandbox . __VUE_SSR_CONTEXT__
118
121
if ( typeof runner !== 'function' ) {
119
122
throw new Error (
120
123
'bundle export should be a function when using ' +
0 commit comments