NodeJs中的VM模块详解

什么是VM?

VM模块是NodeJS里面的核心模块,支撑了require方法和NodeJS的运行机制,我们有些时候可能也要用到VM模板来做一些特殊的事情。

通过VM,JS可以被编译后立即执行或者编译保存下来稍后执行(JavaScript code can be compiled and run immediately or compiled, saved, and run later.)
VM模块包含了三个常用的方法,用于创建独立运行的沙箱体制,如下三个方法
vm.runInThisContext(code, filename);

此方法用于创建一个独立的沙箱运行空间,code内的代码可以访问外部的global对象,但是不能访问其他变量

而且code内部global与外部共享

代码如下:

var vm = require("vm");
 
var p = 5;
global.p = 11;
 
vm.runInThisContext("console.log('ok', p)");// 显示global下的11
vm.runInThisContext("console.log(global)"); // 显示global
 
console.log(p);// 显示5
vm.runInContext(code, sandBox);

此方法用于创建一个独立的沙箱运行空间,sandBox将做为global的变量传入code内,但不存在global变量

sandBox要求是vm.createContext()方法创建的sandBox

代码如下:

var vm = require("vm");
var util = require("util");
 
var window = {
    p: 2,
    vm: vm,
    console: console,
    require: require
};
 
var p = 5;
 
global.p = 11;
 
vm.createContext(window);
vm.runInContext('p = 3;console.log(typeof global);', window); // global是undefined
 
console.log(window.p);// 被改变为3
 
console.log(util.inspect(window));
vm.runInNewContext(code, sandbox, opt);

这个方法应该和runInContext一样,但是少了创建sandBox的步骤

比较

更为复杂的情形
如果runInContext里面执行runInThisContext会是怎么样,runInThisContext访问到的global对象是谁的?

如下代码将会怎么执行?

代码如下:

var vm = require("vm");
var util = require("util");
 
var window = {
    p: 2,
    vm: vm,
    console: console,
    require: require
};
 
window.global = window;
 
var p = 5;
 
global.p = 11;
 
vm.runInNewContext('p = 3;console.log(typeof global);require(\'vm\').runInThisContext("console.log(p)");', window);

runInThisContext里面的代码可以访问外部的global对象,但外面实际上不存在global对象(虽然有,但本质不是global对象),只要记住一点,runInThisContext只能访问最顶部的global对象就OK了

执行结果如下

代码如下:

object (global存在)
11 (顶部global的p)

(0)

相关推荐

  • NodeJs中的VM模块详解

    什么是VM? VM模块是NodeJS里面的核心模块,支撑了require方法和NodeJS的运行机制,我们有些时候可能也要用到VM模板来做一些特殊的事情. 通过VM,JS可以被编译后立即执行或者编译保存下来稍后执行(JavaScript code can be compiled and run immediately or compiled, saved, and run later.) VM模块包含了三个常用的方法,用于创建独立运行的沙箱体制,如下三个方法 vm.runInThisContex

  • Nodejs中 npm常用命令详解

    npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm install moduleNames:安装Node模块 安装完毕后会产生一个node_modules目录,其目录下就是安装的

  • Python中logger日志模块详解

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息: print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据:logging则可以由开发者决定将信息输出到什么地方,以及怎么输出: Logger从来不直接实例化,经常通过logging模块级方法(Modu

  • python中的sys模块详解

    目录 前言 处理命令行参数 sys.stdin.readline()与input sys.stdout与print 总结 前言 sys模块是与python解释器交互的一个接口.sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. sys.argv[0] 表示程序自身sys.argv[1] 表示程序的第一个参数sys.argv[2] 表示程序的第二个参数 可以做

  • Node.js中的child_process模块详解

    前言 本文主要给大家介绍了关于Node.js中child_process模块的相关内容,在介绍child_process模块之前,先来看一个例子. const http = require('http'); const longComputation = () => { let sum = 0; for (let i = 0; i < 1e10; i++) { sum += i; }; return sum; }; const server = http.createServer(); ser

  • Laravel中的Auth模块详解

    前言 本文主要给大家介绍的是关于Laravel中Auth模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 本文是基于Laravel 5.4 版本的本地化模块代码进行分析书写: 模块组成 Auth模块从功能上分为用户认证和权限管理两个部分:从文件组成上,Illuminate\Auth\Passwords目录下是密码重置或忘记密码处理的小模块,Illuminate\Auth是负责用户认证和权限管理的模块,Illuminate\Foundation\Auth提供了登录.

  • 关于NodeJS中的循环引用详解

    最近在用node的时候排查一个问题排查了半天,最终发现是循环引用导致的问题,故在此记录一下. 场景复现 出现问题场景比较简单,一共四个类: parent.ts child.ts child_2.ts util.ts export abstract class Parent { abstract hello(): string; } import {Parent} from "./parent"; export class Child extends Parent { hello():

  • python中random模块详解

    Python中的random模块用于生成随机数,它提供了很多函数.常用函数总结如下: 1. random.random() 用于生成一个0到1的随机浮点数: 0 <= n < 1.0 2. random.seed(n) 用于设定种子值,其中的n可以是任意数字.random.random() 生成随机数时,每一次生成的数都是随机的.但是,使用 random.seed(n) 设定好种子之后,在先调用seed(n)时,使用 random() 生成的随机数将会是同一个. 3. random.unifo

  • Python中BeautifulSoup模块详解

    目录 前言 安装库 导入库 解析文档示例 提取数据示例 CSS选择器 实例小项目 总结 前言 BeautifulSoup是主要以解析web网页的Python模块,它会提供一些强大的解释器,以解析网页,然后提供一些函数,从页面中提取所需要的数据,目前是Python爬虫中最常用的模块之一. 安装库 在使用前需要安装库,这里建议安装bs4,也就是第四版本,因为根据官方文档第三版的已经停止更新.同时安装lxml解释器 pip3 install bs4 pip3 install lxml 导入库 from

  • Nodejs做文本数据处理实现详解

    目录 nodejieba 简介 特点 常用API 基本使用 1.分词用法 2.词性标注 3.关键词抽取 4.其他用法 nodejieba 简介 随着汉语言的广泛应用,中文信息处理成了一个重要的研究课题,常见于搜索引擎:信息检索.中外文自动翻译.数据挖掘技术.自然语言处理等领域.在处理的过程中,中文分词是最基础的一环. nodeJieba 是结巴中文分词的 Node.js 版本实现, 由 CppJieba 提供底层分词算法实现,是兼具高性能和易用性两者的 Node.js 中文分词插件. nodej

随机推荐