NodeJs中的VM模块详解


Posted in NodeJs onMay 06, 2015

什么是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的步骤

比较

NodeJs中的VM模块详解

更为复杂的情形
如果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)
NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
nodejs 终端打印进度条实例代码
Apr 22 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
Jan 02 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
nodejs简单实现中英文翻译
May 04 #NodeJs
nodejs调用cmd命令实现复制目录
May 04 #NodeJs
nodejs通过phantomjs实现下载网页
May 04 #NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 #NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 #NodeJs
Nodejs学习笔记之测试驱动
Apr 16 #NodeJs
Nodejs学习笔记之入门篇
Apr 16 #NodeJs
You might like
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
PHP对象实例化单例方法
2017/01/19 PHP
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
js Date概念详细介绍
2013/11/22 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
Python制作数据导入导出工具
2015/07/31 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
linux 下selenium chrome使用详解
2020/04/02 Python
Django xadmin安装及使用详解
2020/10/26 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python