前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >node核心模块-vm

node核心模块-vm

作者头像
Keller
发布2021-12-14 09:27:35
5380
发布2021-12-14 09:27:35
举报
文章被收录于专栏:KellerKeller

vm

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的使用很简单,下面是几个例子:

  1. vm.runInNewContext
代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
const vm = require('vm');
    
global.a = 1;
// 在当前上下文运行
vm.runInThisContext('a += 1');
console.log(global.a);// 2

使用场景

我个人理解vm的使用场景有2个:

  1. 环境隔离:因为node的js代码是单线程,在并发的场景下,需要考虑上下文的竞争和互相影响,直接使用vm,可以最小成本的解决这个问题。 vue ssr在2.3.0以前,就是用vm来做隔离的渲染的,但是也带来了性能的问题,具体可以查看文档的介绍。
  2. 动态执行字符串代码:这在某些需求场景下只能使用vm。

劣势

vm也有明显的劣势:

  1. 耗费资源:这里有文章比较evalvm的性能:https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/。(当然eval的安全问题更大,这是另外的话题)。
  2. maybe attackedvm也存在安全问题,对于执行外部的代码,可能引发安全问题。 所以有个开源库专门解决了这个问题,https://github.com/patriksimek/vm2,声明已经过滤了所有已知攻击。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • vm
    • 例子
      • 使用场景
        • 劣势
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档