node的vm(虚拟机),改变运行的环境
vm文档node文档中对vm的解释是:vm 模块提供了一系列 API 用于在 V8 虚拟机环境中编译和运行代码。JavaScript 代码可以被编译并立即运行,也可以编译、保存然后再运行。同时node文档中提醒:vm模块并不是实现代码安全性的一套机制。 绝不要试图用其运行未经信任的代码.vm模块允许改变一些JavaScript脚本代码的上下文运行环境。但是这些代码仍然是运行在nodejs应用程序的
node文档中对vm的解释是:
vm 模块提供了一系列 API 用于在 V8 虚拟机环境中编译和运行代码。
JavaScript 代码可以被编译并立即运行,也可以编译、保存然后再运行。
同时node文档中提醒:
vm模块并不是实现代码安全性的一套机制。 绝不要试图用其运行未经信任的代码.
vm模块允许改变一些JavaScript脚本代码的上下文运行环境。但是这些代码仍然是运行在nodejs应用程序的当前进程中。从这个角度来说,vm的功能有些类似于eval函数,但是vm模块提供了一些eval函数所不能实现的特性,也提供了更好的代码管理功能。
使用vm前需要先引入
const vm = require('vm');
1、vm.Script类
1、创建script对象
new vm.Script(code, options)
创建一个新的vm.Script对象只编译代码但不会执行它。编译过的vm.Script此后可以被多次执行。
通过vm.Script对象的各种方法来运行这些代码。
- code 需要被解析的JavaScript代码
- options配置对象
2、使用script对象
1、runInContext
script.runInContext(contextifiedSandbox[, options])
例子:
在new vm.Script传入字符串创建了一个script对象;
在vm.createContext中传入一个对象创建了一个上下文context;
在script.runInContext中传入上一步创建的这个上下文,执行了script对象。
多次执行,都是在这个context上下文中执行的。
const util = require('util');
const vm = require('vm');
const sandbox = {
animal: 'cat',
count: 2
};
const script = new vm.Script('count += 1; name = "kitty";');
const context = vm.createContext(sandbox);
for (let i = 0; i < 10; ++i) {
script.runInContext(context);
}
console.log(util.inspect(sandbox));
2、runInNewContext
script.runInNewContext([sandbox[, options]])
首先给指定的sandbox提供一个隔离的上下文, 再在此上下文中执行vm.Script中被编译的代码,最后返回结果。运行中的代码无法获取本地作用域。
例子
const util = require('util');
const vm = require('vm');
const script = new vm.Script('globalVar = "set"');
const sandboxes = [{}, {}, {}];
sandboxes.forEach((sandbox) => {
script.runInNewContext(sandbox);
});
console.log(util.inspect(sandboxes));
3、runInThisContext
script.runInThisContext([options])
在global对象的上下文中执行Script对象里被编译的代码,并返回其结果。
2、vm方法
1、createContext
vm.createContext([sandbox])
传入一个对象,vm.createContext()会设置此对象,从而让它具备在vm.runInContext()或者script.runInContext()中被使用的能力。对于此二方法中所调用的脚本,他们的全局对象不仅拥有我们提供的sandbox对象的所有属性,同时还有任何global object所拥有的属性。
更多推荐
所有评论(0)