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利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 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
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
vue.js中created方法作用
2018/03/30 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
六个窍门助你提高Python运行效率
2015/06/09 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Python正则捕获操作示例
2017/08/19 Python
python对execl 处理操作代码
2020/06/22 Python
Python类型转换的魔术方法详解
2020/12/23 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
经典c++面试题四
2015/05/14 面试题
应届生法律顾问求职信
2013/11/19 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
给校长的建议书200字
2014/05/16 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
React自定义hook的方法
2022/06/25 Javascript
MySQL池化框架学习接池自定义
2022/07/23 MySQL