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 相关文章推荐
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 NodeJs
浅谈Node的内存泄露问题
May 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
PHP数据库操作面向对象的优点
2006/10/09 PHP
php后门URL的防范
2013/11/12 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
php语法检查的方法总结
2019/01/21 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
react-native ListView下拉刷新上拉加载实现代码
2017/08/03 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
python实现接口并发测试脚本
2019/06/25 Python
Numpy之reshape()使用详解
2019/12/26 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
详解Flask前后端分离项目案例
2020/07/24 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
科室工作个人总结的自我评价
2013/10/29 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
社区敬老月活动总结
2015/05/07 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis