Skip to content

Commit a0042c4

Browse files
HerringtonDarkholmeyyx990803
authored andcommitted
use vm.Script to avoid reparse (#4892)
1 parent 7e1d07a commit a0042c4

File tree

2 files changed

+45
-28
lines changed

2 files changed

+45
-28
lines changed

Diff for: src/server/create-bundle-renderer.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,14 @@ export function createBundleRendererCreator (createRenderer: () => Renderer) {
4141
} else {
4242
throw new Error(INVALID_MSG)
4343
}
44+
const evaluate = runInVm(entry, files)
4445
return {
4546
renderToString: (context?: Object, cb: (err: ?Error, res: ?string) => void) => {
4647
if (typeof context === 'function') {
4748
cb = context
4849
context = {}
4950
}
50-
runInVm(entry, files, context).catch(err => {
51+
evaluate(context).catch(err => {
5152
rewriteErrorTrace(err, maps)
5253
cb(err)
5354
}).then(app => {
@@ -61,7 +62,7 @@ export function createBundleRendererCreator (createRenderer: () => Renderer) {
6162
},
6263
renderToStream: (context?: Object) => {
6364
const res = new PassThrough()
64-
runInVm(entry, files, context).catch(err => {
65+
evaluate(context).catch(err => {
6566
rewriteErrorTrace(err, maps)
6667
// avoid emitting synchronously before user can
6768
// attach error listener

Diff for: src/server/run-in-vm.js

+42-26
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,55 @@ function createContext (context) {
1919
return sandbox
2020
}
2121

22-
function evaluateModule (filename, files, context, evaluatedModules) {
23-
if (evaluatedModules[filename]) {
24-
return evaluatedModules[filename]
25-
}
22+
function compileModule (files) {
23+
const compiledScripts = {}
2624

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]
4028
}
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
4137
}
42-
compiledWrapper.call(m.exports, m.exports, r, m)
4338

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
4964
}
5065

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) => {
5369
const context = createContext(_context)
54-
const res = evaluateModule(entry, files, context, {})
70+
const res = evaluate(entry, context, {})
5571
resolve(typeof res === 'function' ? res(_context) : res)
5672
})
5773
}

0 commit comments

Comments
 (0)