vm是node的一个核心模块,核心功能官方文档介绍是:
The vm module provides APIs for compiling and running code within V8 Virtual Machine contexts. The vm module is not a security mechanism. Do not use it to run untrusted code. The term "sandbox" is used throughout these docs simply to refer to a separate context, and does not confer any security guarantees.
意思就是:vm可以使用v8的Virtual Machine contexts动态地编译和执行代码,而代码的执行上下文是与当前进程隔离的,但是这里的隔离并不是绝对的安全,不完全等同浏览器的沙箱环境。
vm的使用很简单,下面是几个例子:
const vm = require('vm');
const sandbox = { a: 1 };
// 在新的上下文运行
const result = vm.runInNewContext('a += 1', sandbox);
console.log(result);// 2
console.log(sandbox);// { a: 2 }
2.vm.runInContext
const vm = require('vm');
const sandbox = { a: 1 };
// https://nodejs.org/api/vm.html#vm_what_does_it_mean_to_contextify_an_object
vm.createContext(sandbox);
// 在执行上下文运行
const result = vm.runInContext('a += 1', sandbox);
console.log(result);// 2
console.log(sandbox);// { a: 2 }
3.vm.runInThisContext
const vm = require('vm');
global.a = 1;
// 在当前上下文运行
vm.runInThisContext('a += 1');
console.log(global.a);// 2
我个人理解vm的使用场景有2个:
vm也有明显的劣势:
eval
和vm
的性能:https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/。(当然eval的安全问题更大,这是另外的话题)。