Node.js 中的 vm.SourceTextModule(code[,options]) 函数

2025 年 5 月 1 日 | 阅读 4 分钟

在本文中,我们将讨论 Node.js 中 vm.SourceTextModule() 函数。在讨论该函数之前,我们必须了解 Node.js 中的 Vm 模块。

什么是 Vm 模块?

  1. vm 模块方便在 V8 虚拟机上下文中进行代码编译和执行。虚拟机模块没有安全功能。请勿使用它来启动不受信任的应用程序。
  2. JavaScript 代码可以立即构建和执行,或者可以进行编译、保存并在稍后执行。
  3. 许多时候,代码是在单独的 V8 上下文中使用的。这意味着调用代码的全局对象与调用代码的全局对象不同。

Node.js 中的 vm.SourceTextModule(code[, options]) 函数是什么?

Node.js 中的 vm.SourceTextModule(code[, options]) 函数从 JavaScript 代码字符串创建 ECMAScript 模块 (ESM),以允许动态且受控地执行基于模块的脚本。它是虚拟机模块中用于沙盒环境和特定脚本需求的一个有用部分。options 参数允许我们指定标识符、处理动态导入以及自定义 import.meta。在模块可以执行之前,必须对其进行求值和链接(以修复依赖项)。之后,可以通过 module.namespace 访问导出的属性。Node.js 12.16.0 是第一个包含它的版本,而 16.0.0 是稳定版。它以安全且灵活的方式实现了在隔离或可调上下文中执行模块。

语法

它具有以下语法:

参数

代码 (字符串,必需)

  • 模块的 JavaScript 源代码。
  • ECMAScript 模块的代码(例如 import 和 export 语句)必须是真实的。

选项 (对象,可选)

这是一个用于改变模块行为的对象,其中一些属性包括:

  • 标识符:一个唯一的字符串,用作模块的标识符;这对于调试或报告错误很有用。
  • 上下文:后台的虚拟机。当模块运行时,上下文对象。
  • initializeImportMeta:这是一个自定义 imports.meta 对象的选项。
  • importModuleDynamically:此模块钩子用于处理动态 import() 表达式。

要点

求值过程

  • 在使用 module.evaluate() 之前,必须先使用 module.link() 链接模块。链接阶段会修复所有依赖项(导入的模块)。
  • 审核后,可以通过 Module.namespace 访问模块的导出。

修复错误:如果代码存在任何语法错误或在链接或求值过程中出现问题,将会抛出异常。

自定义能力

  • 通过 importModuleDynamically 选项,可以动态地管理 import() 调用。
  • 通过 initializeImportMeta 选项导入的自定义属性,可以设置 import.meta。

使用示例

  • vm.SourceTextModule 是在受控环境中安全运行 ECMAScript 模块的理想选择。

示例代码

过程

  • 代码应在 ESM 环境中执行。
  • 对于 package.json 文件,添加 "type": "module" 或将文件扩展名更改为 .mjs。
  • 使用 import 引入 VM 模块。

输出

 
"Hello, world!"
"Hello, Alice!"   

将文件保存为 index.mjs。

要运行上述代码,请使用命令:

  • node index.mjs

说明

  • 代码理解:在 JavaScript 代码中使用 export 语句定义模块的导出。
  • module.SourceTextModule 使用代码创建模块实例。
  • 链接模块:module.link() 函数用于解析模块的导入。此示例不包含任何导入;但是,您可以根据需要修改处理程序。
  • 求值模块:此步骤涉及运行代码,使其导出可访问。
  • 访问导出:求值后,namespace 访问导出。

结论

总之,Node.js 中的 vm.SourceTextModule 提供了一种强大的方式,可以在受控环境中动态创建和执行 ECMAScript 模块。它允许开发人员将 JavaScript 模块描述为字符串,从而为测试、沙盒执行和自定义脚本等任务提供了灵活性。通过使用链接和求值以编程方式访问模块的导出,代码可以被模块化和可重用。它提供了安全运行代码的高级可能性,并能精确控制导入和上下文,即使其正确执行需要 ESM 环境。此功能增强了 Node.js 在灵活和动态环境中构建现代 JavaScript 应用程序的能力。