vm文档

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所拥有的属性。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐