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


    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个:

  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 attacked

    vm也存在安全问题,对于执行外部的代码,可能引发安全问题。

    所以有个开源库专门解决了这个问题,https://github.com/patriksimek/vm2,声明已经过滤了所有已知攻击。

来源:https://segmentfault.com/a/1190000017210397

node核心模块-vm的更多相关文章

  1. Node核心模块

    在Node中,模块主要分两大类:核心模块和文件模块.核心模块部分在 Node 源代码的编译过程中,编译进了二进制执行文件.在 Node 进启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引 ...

  2. Node.js学习(第二章:node核心模块--fs)

    前言 Node.js中赋予了JavaScript很多在浏览器中没有的能力,譬如:文件读写,创建http服务器等等,今天我们就来看看在node中怎样用JavaScript进行文件的读写操作. 读文件 我 ...

  3. Node.js核心模块_全局变量、util学习

    全局对象 javascript的全局对象是window,他及其所有属性都可以在程序的任何地方访问.即全局变量. 而在node中全局对象是global,所有全局变量都是global对象的属性,包括其本身 ...

  4. 浅析 Node.js 的 vm 模块以及运行不信任代码

    在一些系统中,我们希望给用户提供插入自定义逻辑的能力,除了 RPC 和 REST 之外,运行客户提供的代码也是比较常用的方法,好处是可以极大地减少在网络上的耗时.JavaScript 是一种非常流行而 ...

  5. node八-核心模块、包

    学会查API,远比会几个API更重要. 核心模块意义 -如果只是在服务器运行javascript代码,并没有多大意义,因为无法实现任何功能>读写文件.访问网络 -Node的用处在于它本身还提供可 ...

  6. Node.js核心模块-fs文件系统

    fs是file-system的简写,文件系统的意思.在Node中如果想要进行文件操作,就必须引入fs这个核心模块. 引入 const fs = require('fs') fs.readFile(pa ...

  7. 深入浅出node(2) 模块机制

    这部分主要总结深入浅出Node.js的第二章 一)CommonJs 1.1CommonJs模块定义 二)Node的模块实现 2.1模块分类 2.2 路径分析和文件定位 2.2.1 路径分析 2.2.2 ...

  8. Node.js模块 加载笔记

    //核心模块就是Node.js标准API种提供的模块,如fs,http,net.vm等.官方提供,编译成二进制代码//核心模块拥有最高的加载优先级 //文件模块则是存储为单独的文件(或文件夹)的模块, ...

  9. 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)

    一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须按照一定的格式编写.AMD,CMD,CommonJS 是目前最常用的三种模块化书写规范.  1.AMD(Asy ...

随机推荐

  1. python爬虫之多线程、多进程+代码示例

    python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...

  2. Java抽象类简述

    Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不 ...

  3. 重写简易的confirm函数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 阿里巴巴Java开发手册1.4.0

    链接:https://pan.baidu.com/s/16kKzcRcu20SMDdydMm9ZUw 提取码:p9ef

  5. org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed(转)

    xml文件不能被正确解析/The processing instruction target matching "[xX][mM][lL]" is not allowed. The ...

  6. POJ-2299-Ultra-QuickSort(单点更新 + 区间查询+离散化)

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...

  7. Java内存模型分析

    在学习Java内存模型之前,先了解一下线程通信机制. 1.线程通信机制 在并发编程中,线程之间相互交换信息就是线程通信.目前有两种机制:内存共享与消息传递. 1.1.共享内存 Java采用的就是共享内 ...

  8. Linux—账号管理及命令使用详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在Linux系统中,我们常常会看到目录或文件的所属关系: [root@linux01 ~]# ll -d test.sh -rw ...

  9. Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)

    官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...

  10. Zabbix 5.0切换中文语言小结

    最近测试Zabbix 5.0,去修改语言时发现不能选择"Chinese(zh_CN)",这个选项在下拉框中是灰色的(无法选择).提示"You are not able t ...