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读取memcache示例分享
Jan 02 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
nodejs开发一个最简单的web服务器实例讲解
Jan 02 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
NodeJS配置CORS实现过程详解
Dec 02 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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
ie focus bug 解决方法
2009/09/03 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
js中less常用的方法小结
2017/08/09 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
Python函数返回不定数量的值方法
2019/01/22 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
英国电器零售商:PRC Direct
2018/06/21 全球购物
护理自荐信
2013/10/22 职场文书
小学开学典礼主持词
2014/03/19 职场文书
协议书样本
2014/04/23 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
学校献爱心活动总结
2014/07/08 职场文书
合同意向书范本
2014/07/30 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL