class Script
The importModuleDynamically parameter is not supported.
The runInContext method does not support break on SIGINT.
Instances of the vm.Script class contain precompiled scripts that can be
executed in specific contexts.
Constructors #
#Script(code: string,options?: ScriptOptions | string,) Properties #
#cachedData: Buffer | undefined #cachedDataProduced: boolean | undefined #cachedDataRejected: boolean | undefined When cachedData is supplied to create the vm.Script, this value will be set
to either true or false depending on acceptance of the data by V8.
Otherwise the value is undefined.
#sourceMapURL: string | undefined When the script is compiled from a source that contains a source map magic comment, this property will be set to the URL of the source map.
import vm from 'node:vm';
const script = new vm.Script(`
function myFunc() {}
//# sourceMappingURL=sourcemap.json
`);
console.log(script.sourceMapURL);
// Prints: sourcemap.json
Methods #
#createCachedData(): Buffer Creates a code cache that can be used with the Script constructor's cachedData option. Returns a Buffer. This method may be called at any
time and any number of times.
The code cache of the Script doesn't contain any JavaScript observable
states. The code cache is safe to be saved along side the script source and
used to construct new Script instances multiple times.
Functions in the Script source can be marked as lazily compiled and they are
not compiled at construction of the Script. These functions are going to be
compiled when they are invoked the first time. The code cache serializes the
metadata that V8 currently knows about the Script that it can use to speed up
future compilations.
const script = new vm.Script(`
function add(a, b) {
return a + b;
}
const x = add(1, 2);
`);
const cacheWithoutAdd = script.createCachedData();
// In `cacheWithoutAdd` the function `add()` is marked for full compilation
// upon invocation.
script.runInThisContext();
const cacheWithAdd = script.createCachedData();
// `cacheWithAdd` contains fully compiled function `add()`.
#runInContext(contextifiedObject: Context,options?: RunningScriptOptions,): any Runs the compiled code contained by the vm.Script object within the given contextifiedObject and returns the result. Running code does not have access
to local scope.
The following example compiles code that increments a global variable, sets
the value of another global variable, then execute the code multiple times.
The globals are contained in the context object.
import vm from 'node:vm';
const context = {
animal: 'cat',
count: 2,
};
const script = new vm.Script('count += 1; name = "kitty";');
vm.createContext(context);
for (let i = 0; i < 10; ++i) {
script.runInContext(context);
}
console.log(context);
// Prints: { animal: 'cat', count: 12, name: 'kitty' }
Using the timeout or breakOnSigint options will result in new event loops
and corresponding threads being started, which have a non-zero performance
overhead.
#runInNewContext(contextObject?: Context | constants.DONT_CONTEXTIFY,options?: RunningScriptInNewContextOptions,): any This method is a shortcut to script.runInContext(vm.createContext(options), options).
It does several things at once:
- Creates a new context.
- If
contextObjectis an object, contextifies it with the new context. IfcontextObjectis undefined, creates a new object and contextifies it. IfcontextObjectisvm.constants.DONT_CONTEXTIFY, don't contextify anything. - Runs the compiled code contained by the
vm.Scriptobject within the created context. The code does not have access to the scope in which this method is called. - Returns the result.
The following example compiles code that sets a global variable, then executes
the code multiple times in different contexts. The globals are set on and
contained within each individual context.
const vm = require('node:vm');
const script = new vm.Script('globalVar = "set"');
const contexts = [{}, {}, {}];
contexts.forEach((context) => {
script.runInNewContext(context);
});
console.log(contexts);
// Prints: [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }]
// This would throw if the context is created from a contextified object.
// vm.constants.DONT_CONTEXTIFY allows creating contexts with ordinary
// global objects that can be frozen.
const freezeScript = new vm.Script('Object.freeze(globalThis); globalThis;');
const frozenContext = freezeScript.runInNewContext(vm.constants.DONT_CONTEXTIFY);
#runInThisContext(options?: RunningScriptOptions): any Runs the compiled code contained by the vm.Script within the context of the
current global object. Running code does not have access to local scope, but does have access to the current global object.
The following example compiles code that increments a global variable then
executes that code multiple times:
import vm from 'node:vm';
global.globalVar = 0;
const script = new vm.Script('globalVar += 1', { filename: 'myfile.vm' });
for (let i = 0; i < 1000; ++i) {
script.runInThisContext();
}
console.log(globalVar);
// 1000