node vm模块,node vm
VM模块是NodeJS的核心模块,支持NodeJS的需求方法和运行机制。有时候,我们可能不得不使用VM模板来做一些特殊的事情。本文将带你详细了解Node中的VM模块,希望对你有所帮助!
node.js速度课程简介:进入学习
在上一篇文章中,我们提到了一个问题。
字符串如何成为JS执行?
我们详细介绍两种方法,即eval函数和new函数。
这里需要再次强调,函数构造器创建的函数不会创建当前环境的闭包,它们总是在全局环境中创建的,所以在运行时只能访问全局变量及其局部变量,而不能访问函数构造器创建它们所在作用域的变量。这不同于使用eval来执行创建函数的代码。
global.a=100//抓住全局对象global
var b=200//这个!==全球
新函数( console.log(a))() //100
new function( console . log(b))()//b没有定义函数可以获得全局变量,所以它可能仍然有变量污染。就是模块引擎的实现原理,后续我会给出一篇文章单独讲解。
还有一种解决方案,我们在上一篇文章中没有详细展开,那就是vm模块。
vm模块
在上面的文字中,我一直在强调一个概念,那就是变量的污染。
VM的特点是不受环境影响,或者可以说是一个沙箱环境(沙盒模式为模块提供了一个运行的环境,不影响其他模块及其私有沙盒)。
const vm=require(vm )
global.a=100
//在当前环境中运行[当前范围]
VM . runinthiscontext( console . log(a));//100
//在新环境中运行[其他范围]
VM . runinnewcontext( console . log(a));//未定义。这里要强调一下,因为在Node.js中全局变量是在多个模块下共享的,所以尽量不要在global中定义属性。Demo中的定义是为了便于理解。
假设我们在同一级目录下有一个文件1.js,定义了global.a=100。现在我们介绍这个文件。
requrie(。/1);
console . log(a);//100我们可以发现,在当前文件中,并没有定义变量A,只是将两个模块文件关联在一起。这就是我上面说的,Node中全局变量是在多个模块下共享的。。
他的原理是,在Node的环境下,整个世界都有一个执行上下文。
//模拟节点的全局环境
//在当前全局环境中执行vm.runInThisContext,但不会生成新的函数。
-函数(导出,模块,要求,_ _目录名,_ _文件名){ //.}
- vm.runInThisContext.
//vm.runInNewContext在全局环境之外执行。
Vm.runInNewContext.所以,vm.runInThisContext可以访问全局变量,但是不能访问自定义变量。但是vm.runInNewContext不能访问全局或自定义变量,它存在于一个全新的执行上下文中。
而我们的需求是通过vm.runInThisContext实现的。
require的实现可以分为以下四个步骤。
读取要导入的文件。
读取文件后,将代码封装到一个函数中。
通过vm.runInThisContext把它变成JS语法。
代码呼叫。
假设我们现在有以下两个文件。分别是a.js和b.js。
//文件A通过module.exports导出一个变量,并使用require在文件b中接收。
//a.js
module.exports=a
//b.js
设a=require(。/a’);
console . log(a);//a我们可以通过以上四个步骤来分析导入导出的实现逻辑。
阅读文件。
当要导入的文件内容引入到要接收的文件中时,就会变成这样。
设a=module.exports= a但是这种形式,Node根本解析不了,所以我们需要做第二步。
将读取的文件封装到函数中。
设a=(函数(导出,模块,要求,_ _目录名,_ _文件名){
module.exports= a
返回模块.导出
}) (.args)//exports,module,require,_ _ dirname,_ _ filename之所以传入五个参数并封装到一个函数中,我们可以参考下面的例子。
假设我们现在传入的不是字符串,而是函数。
//a.js
var a=100
Module.exports=function(){},这样当我们解析时,它将被解析为以下格式
设a=(函数(导出,模块,要求,_ _目录名,_ _文件名){
var a=100
module . exports=function(){ };
返回模块.导出
}) (.args)//exports,module,require,_ _ dirname,_ _ filename我们导出的是module.exports,所以模块文件中定义的变量A只属于当前执行上下文。
在解析过程中,变量A将被放入函数中。真正实现了作用域分离。
vm.runInThisContext被解析成可执行的Js代码。
我们处理过的代码将以字符串的形式存在,所以我们需要通过vm.runInThisContext解析字符串
进行代码调用。
在此之前,我们实际上需要调试代码。
更多关于node的信息,请访问:nodejs教程!那是为了了解Node.js中VM模块的更多细节请关注我们的其他相关文章了解更多!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。