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 Express框架中处理404页面一个方式
May 28 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
nodejs集成sqlite使用示例
Jun 05 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 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
ajax缓存问题解决途径
2006/12/06 PHP
PHP Directory 函数的详解
2013/03/07 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
Python-opencv 双线性插值实例
2020/01/17 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
Python3实现飞机大战游戏
2020/04/24 Python
基于python实现模拟数据结构模型
2020/06/12 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
政府法律服务方案
2014/06/14 职场文书
学校政风行风评议心得体会
2014/10/21 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
活动宣传稿范文
2015/07/23 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python