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学习笔记之Connect中间件模块(二)
Jan 27 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 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动态生成VRML网页
2006/10/09 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
利用PHP实现短域名互转
2013/07/05 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
javascript 数组操作详解
2015/01/29 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
python套接字流重定向实例汇总
2016/03/03 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
python分布式计算dispy的使用详解
2019/12/22 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
Python 列表反转显示的四种方法
2020/11/16 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
2014社区三八妇女节活动总结
2014/03/01 职场文书
家长对老师的感言
2014/03/11 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
2015年班组工作总结
2015/04/20 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
mysql知识点整理
2021/04/05 MySQL
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android