@@ -19,39 +19,55 @@ function createContext (context) {
19
19
return sandbox
20
20
}
21
21
22
- function evaluateModule ( filename , files , context , evaluatedModules ) {
23
- if ( evaluatedModules [ filename ] ) {
24
- return evaluatedModules [ filename ]
25
- }
22
+ function compileModule ( files ) {
23
+ const compiledScripts = { }
26
24
27
- const code = files [ filename ]
28
- const wrapper = NativeModule . wrap ( code )
29
- const compiledWrapper = vm . runInNewContext ( wrapper , context , {
30
- filename,
31
- displayErrors : true
32
- } )
33
- const m = { exports : { } }
34
- const r = file => {
35
- file = path . join ( '.' , file )
36
- if ( files [ file ] ) {
37
- return evaluateModule ( file , files , context , evaluatedModules )
38
- } else {
39
- return require ( file )
25
+ function getCompiledScript ( filename ) {
26
+ if ( compiledScripts [ filename ] ) {
27
+ return compiledScripts [ filename ]
40
28
}
29
+ const code = files [ filename ]
30
+ const wrapper = NativeModule . wrap ( code )
31
+ const script = new vm . Script ( wrapper , {
32
+ filename,
33
+ displayErrors : true
34
+ } )
35
+ compiledScripts [ filename ] = script
36
+ return script
41
37
}
42
- compiledWrapper . call ( m . exports , m . exports , r , m )
43
38
44
- const res = Object . prototype . hasOwnProperty . call ( m . exports , 'default' )
45
- ? m . exports . default
46
- : m . exports
47
- evaluatedModules [ filename ] = res
48
- return res
39
+ function evaluateModule ( filename , context , evaluatedModules ) {
40
+ if ( evaluatedModules [ filename ] ) {
41
+ return evaluatedModules [ filename ]
42
+ }
43
+
44
+ const script = getCompiledScript ( filename )
45
+ const compiledWrapper = script . runInNewContext ( context )
46
+ const m = { exports : { } }
47
+ const r = file => {
48
+ file = path . join ( '.' , file )
49
+ if ( files [ file ] ) {
50
+ return evaluateModule ( file , context , evaluatedModules )
51
+ } else {
52
+ return require ( file )
53
+ }
54
+ }
55
+ compiledWrapper . call ( m . exports , m . exports , r , m )
56
+
57
+ const res = Object . prototype . hasOwnProperty . call ( m . exports , 'default' )
58
+ ? m . exports . default
59
+ : m . exports
60
+ evaluatedModules [ filename ] = res
61
+ return res
62
+ }
63
+ return evaluateModule
49
64
}
50
65
51
- export default function runInVm ( entry , files , _context = { } ) {
52
- return new Promise ( ( resolve , reject ) => {
66
+ export default function runInVm ( entry , files ) {
67
+ const evaluate = compileModule ( files )
68
+ return ( _context = { } ) => new Promise ( ( resolve , reject ) => {
53
69
const context = createContext ( _context )
54
- const res = evaluateModule ( entry , files , context , { } )
70
+ const res = evaluate ( entry , context , { } )
55
71
resolve ( typeof res === 'function' ? res ( _context ) : res )
56
72
} )
57
73
}
0 commit comments