node vm模块,node vm

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: