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 URL模块操作URL相关方法介绍
Mar 03 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
nodejs基础应用
Feb 03 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
详解Nodejs之npm&package.json
Jun 15 NodeJs
Express+Nodejs 下的登录拦截实现代码
Jul 01 NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
Prototype Function对象 学习
2009/07/12 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
你应该知道的python列表去重方法
2017/01/17 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
英国工具中心:UK Tool Centre
2017/07/10 全球购物
初中语文教学反思
2014/02/02 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
心理健康日活动总结
2014/05/08 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
学生实习证明范文
2014/09/28 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS