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
nodejs分页类代码分享
Jun 17 NodeJs
基于nodejs+express(4.x+)实现文件上传功能
Nov 23 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
nodejs连接mysql数据库简单封装示例-mysql模块
Apr 10 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 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 常用的系统函数
2017/02/07 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
pandas如何处理缺失值
2019/07/31 Python
python实现简单的购物程序代码实例
2020/03/03 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
档案接收函
2014/01/13 职场文书
投标承诺书怎么写
2014/05/24 职场文书
大四学生个人总结
2015/02/15 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL