@@ -5,7 +5,7 @@ const path = require('path')
55const resolve = require ( 'resolve' )
66const NativeModule = require ( 'module' )
77
8- function createContext ( context ) {
8+ function createSandbox ( context ) {
99 const sandbox = {
1010 Buffer,
1111 console,
@@ -40,20 +40,20 @@ function compileModule (files, basedir, runInNewContext) {
4040 return script
4141 }
4242
43- function evaluateModule ( filename , context , evaluatedFiles = { } ) {
43+ function evaluateModule ( filename , sandbox , evaluatedFiles = { } ) {
4444 if ( evaluatedFiles [ filename ] ) {
4545 return evaluatedFiles [ filename ]
4646 }
4747
4848 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 )
5252 const m = { exports : { } }
5353 const r = file => {
5454 file = path . join ( '.' , file )
5555 if ( files [ file ] ) {
56- return evaluateModule ( file , context , evaluatedFiles )
56+ return evaluateModule ( file , sandbox , evaluatedFiles )
5757 } else if ( basedir ) {
5858 return require (
5959 resolvedModules [ file ] ||
@@ -90,13 +90,13 @@ function deepClone (val) {
9090
9191export function createBundleRunner ( entry , files , basedir , runInNewContext ) {
9292 const evaluate = compileModule ( files , basedir , runInNewContext )
93- if ( runInNewContext ) {
93+ if ( runInNewContext !== false && runInNewContext !== 'once' ) {
9494 // new context mode: creates a fresh context and re-evaluate the bundle
9595 // on each render. Ensures entire application state is fresh for each
9696 // render, but incurs extra evaluation cost.
9797 return ( userContext = { } ) => new Promise ( resolve => {
9898 userContext . _registeredComponents = new Set ( )
99- const res = evaluate ( entry , createContext ( userContext ) )
99+ const res = evaluate ( entry , createSandbox ( userContext ) )
100100 resolve ( typeof res === 'function' ? res ( userContext ) : res )
101101 } )
102102 } else {
@@ -108,13 +108,16 @@ export function createBundleRunner (entry, files, basedir, runInNewContext) {
108108 let initialContext
109109 return ( userContext = { } ) => new Promise ( resolve => {
110110 if ( ! runner ) {
111+ const sandbox = runInNewContext === 'once'
112+ ? createSandbox ( )
113+ : global
111114 // the initial context is only used for collecting possible non-component
112115 // 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 )
115118 // On subsequent renders, __VUE_SSR_CONTEXT__ will not be avaialbe
116119 // to prevent cross-request pollution.
117- delete global . __VUE_SSR_CONTEXT__
120+ delete sandbox . __VUE_SSR_CONTEXT__
118121 if ( typeof runner !== 'function' ) {
119122 throw new Error (
120123 'bundle export should be a function when using ' +
0 commit comments