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 相关文章推荐
NodeJS的模块写法入门(实例代码)
Mar 07 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 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
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
详解Python中expandtabs()方法的使用
2015/05/18 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
2019/04/29 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
详解Python3 pickle模块用法
2019/09/16 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
音乐系毕业生自荐信
2013/10/27 职场文书
2014年政协工作总结
2014/12/09 职场文书
听证通知书
2015/04/24 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
node快速搭建后台的实现步骤
2022/02/18 NodeJs
Python使用DFA算法过滤内容敏感词
2022/04/22 Python