【Node】认识一下Node.js 中的 VM 模块

作者:你的人类朋友日期:2025/10/10

前言

今天介绍 Node.js 中的 VM(Virtual Machine)模块的基本概念和使用方法。

很多人不太了解他,比如在下

所以本文也不会过于深入,会偏向入门!

小目标:看完之后向自己解释一下:啥是 VM 模块?它有什么作用?

什么是 VM 模块

VM 模块是 Node.js 内置的模块,用于在 V8 虚拟机上下文中编译和执行 JavaScript 代码。

说人话就是,VM 模块允许你在隔离的环境中运行 JavaScript 代码。

核心功能

这边用代码进行举例子,后面会介绍具体的使用场景

1. vm.runInThisContext(code)

在当前的全局上下文中执行代码,但【无法访问局部作用域】。

1const vm = require('vm')
2
3const localVar = '本地变量'
4const code = 'console.log(typeof localVar);' // 输出 "undefined"
5
6vm.runInThisContext(code)
7

🤔 疑问:无法访问局部变量,那这个方法有啥意义???? 回答:公共的 API 可访问,比如 console, setTimeout, Buffer, JSON 等等。

2. vm.runInNewContext(code, sandbox)

在新的沙箱环境中执行代码,完全隔离。

1const vm = require('vm')
2
3const sandbox = {
4    animal: '猫',
5    count: 2
6}
7const code = 'count += 1; console.log(animal + "有" + count + "只");'
8
9vm.runInNewContext(code, sandbox)
10console.log(sandbox.count) // 输出 3
11

补充:那公共 API 可以用吗?

回答:默认不能用公共 API,因为它创建了一个全新的、空白的沙箱环境,连全局对象都没有。

解决办法:手动把需要的全局对象传进去。

参考下面的代码:

1const sandbox = {
2   x: 1,
3   console: console, // 手动传入
4   JSON: JSON, // 手动传入
5   setTimeout: setTimeout // 手动传入
6}
7
8const code = `
9 console.log('现在可以用了'); // 正常执行
10 JSON.parse('{}');           // 正常执行
11`
12
13vm.runInNewContext(code, sandbox) // 正常工作
14

3. vm.runInContext(code, contextifiedSandbox)

在特定的上下文对象中执行代码。

1const vm = require('vm')
2
3const sandbox = {x: 1}
4vm.createContext(sandbox) // 上下文化沙箱
5
6const code = 'x += 1; y = 2;'
7vm.runInContext(code, sandbox)
8
9console.log(sandbox) // 输出 { x: 2, y: 2 }
10

老问题:公共 API 可以用吗? 回答:取决于你怎么创建上下文。下面这样创建就可以!

1const vm = require('vm')
2
3// 方式1:从空对象创建 - 不能用公共API
4const emptySandbox = {}
5vm.createContext(emptySandbox) // 空的上下文
6
7// 方式2:传入全局对象 - 能用公共API
8const globalSandbox = {console, JSON, setTimeout}
9vm.createContext(globalSandbox) // 带全局能力的上下文
10

主要应用场景

  1. 代码沙箱:安全地执行不受信任的代码
  2. 模板引擎:动态执行模板逻辑,啥意思呢?其实就是说,你可以在运行时根据用户输入动态生成 HTML 或其他文本。
  3. 测试环境:创建隔离的测试上下文
  4. 插件系统:安全地运行第三方代码

⚠️ 注意事项

  • VM 不是绝对安全的,不能完全替代容器化技术。为啥都这样隔离了,还是不安全呢?因为 JavaScript 本身太灵活,总有办法通过原型链、异步回调等漏洞“逃”出沙箱,访问到主机的敏感信息或执行恶意代码。它防不住语言层面的漏洞攻击。这边暂时不展开。
  • 小贴士:使用 runInNewContext()eval() 更安全
  • 谨慎处理异步操作和无限循环。啥意思?其实简单举个例子就是,你在沙箱中执行的代码不能包含无限循环,否则会导致 Node.js 进程挂起。

总结

Node.js 的 VM 模块提供了在隔离上下文中执行 JavaScript 代码的能力。通过不同的方法,你可以控制代码的执行环境和访问权限,实现安全的代码执行沙箱。

最后

回答开头的问题:啥是 VM 模块?它有什么作用?

Node.js 的 VM 模块就是个代码隔离箱——把不可信的代码关在笼子里运行,让它既能干活,又不会搞坏你的主程序。


【Node】认识一下Node.js 中的 VM 模块》 是转载文章,点击查看原文


相关推荐


OSI 七层模型
日更嵌入式的打工靓仔2025/10/9

一、OSI 七层模型的核心定位与价值​ OSI 七层模型(Open Systems Interconnection Reference Model)是国际标准化组织(ISO)于 1984 年制定的网络通信体系结构标准,其核心目标是打破不同厂商设备的通信壁垒,通过分层化设计实现 “功能解耦、接口标准化”。该模型将网络通信的复杂流程拆解为七个逻辑层次,每层通过定义明确的 “服务原语”(Service Primitive)为上层提供服务,并通过 “协议数据单元(PDU)” 与下层交互,确保不同系统间


【前端工程化】脚手架篇 - 模板引擎 & 动态依赖管理脚手架
ObjectX不知名程序员2025/10/7

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 在日常工作中,我们经常为会遇到需要创建新项目的需求,为了统计代码风格,项目配置,提升效率,我们可以创建一个cli工具,帮助我们实现这样的功能。你也可以搭建一个自己用,毕竟省下来的时间都是自己的 🥑 你能学到什么? 希望在你阅读本篇文章之后,不会觉得浪费了时间。如果你跟着读下来,你将会学到: cli工具的基本搭建流程 如何通过模板引擎实现可选依赖 模板系统如何设计 如何根据模板引擎生成所需项目 熟悉一个组件库的基本结构 熟悉一


在AI技术快速实现创意的时代,挖掘游戏开发框架新需求成为关键
qife1222025/10/6

内容描述 核心功能定位:该项目是一个专为经典游戏主机设计的增强型JavaScript运行环境,旨在为用户提供完整的自制软件开发工具包。它通过简化开发流程,让开发者能够使用JavaScript这一简单语言创建游戏和应用程序,无需编译过程,只需编写脚本即可快速测试。 关键应用场景:主要应用于经典游戏主机的自制软件开发,包括游戏创作、应用程序开发、图形渲染、音频处理、网络通信等多个领域。开发者可以利用该环境快速原型设计和开发各类交互式内容。 功能特性 多模块支持:系统提供丰富的功能模块,


【Matlab】matlab代码实现最小凸包
智慧浩海2025/10/4

实现最小凸包的算法有多种方法,其中一种常见的方法是使用Graham扫描算法。下面是用Matlab实现Graham扫描算法找到最小凸包的示例代码: function [convexHull] = grahamScan(points) % 找到包含所有点的最小凸包 n = length(points); % 找到y坐标最小的点作为起始点 [~,idx] = min(points(:,2)); startPoint = points(idx,:);


【深入浅出PyTorch】--3.1.PyTorch组成模块1
西柚小萌新吖(●ˇ∀ˇ●)2025/10/3

通过本节学习,你将掌握: 机器学习/深度学习任务的整体流程。各个阶段在任务中的作用与实现方式。深度学习与传统机器学习在实现上的关键差异。PyTorch 如何支持深度学习任务的模块化实现。 二、机器学习任务的标准流程 步骤内容说明1. 数据预处理- 统一数据格式 - 清除异常值 - 进行必要的数据变换(如归一化、标准化) - 划分数据集:训练集、验证集、测试集 - 常见方法:按比例随机划分、KFold 交叉验证 - 工具支持:sklearn.model_selection.train_t


PlantUML 完整教程:从入门到精通
对不起初见2025/10/2

什么是 PlantUML PlantUML 是一个开源工具,允许用户使用简单直观的文本描述来快速创建 UML 图表。它基于纯文本语法,能够生成多种类型的图表,包括时序图、用例图、类图、活动图、组件图、状态图等。 PlantUML 的核心理念是:用代码画图,让图表版本可控。 核心特点 • 文本驱动:使用简单的文本语法描述图表 • 版本控制友好:纯文本格式可轻松集成到 Git 等版本控制系统 • 多格式输出:支持 PNG、SVG、PDF、LaTeX 等多种输出格式 • 跨平台:基于 Java,可在


第6篇、Flask 表单处理与用户认证完全指南:从零到实战
何双新2025/10/2

标签:Python Flask Web开发 表单验证 Session Cookie 用户认证 安全编程 🎯 为什么选择这篇文章? 在Web开发的世界里,表单处理和用户认证是每个开发者必须掌握的核心技能。无论是构建电商网站、社交平台还是企业管理系统,都离不开用户登录、数据提交、状态保持这些基础功能。 Flask作为Python最轻量级的Web框架,以其简洁优雅的设计理念,让开发者能够快速构建功能完整的Web应用。本文将带你从零开始,深入理解Flask的表单处理机制,掌握Session和


微服务架构:从单机到分布式的革命性升级
chengooooooo10/2/2025

本文探讨了传统单机服务的缺陷及微服务架构的解决方案。单机模式存在单点故障、扩展性差、强耦合、技术栈受限等问题。微服务通过将系统拆分为独立服务,实现解耦、独立部署、技术多样性,并提供了分布式架构下的解决方案。SpringCloud提供了服务熔断、限流、服务注册与发现、配置中心、API网关等核心组件,同时介绍了分布式追踪、消息队列和分布式事务的实现方式。相比单机部署,微服务利用云计算实现动态资源分配和自动化管理,提高了系统的可用性和扩展性。


Excel文件瘦身指南:快速瘦身,告别卡顿-Excel易用宝
Excel_easy10/1/2025

明明工作簿文件中没有几行数据,打开表格的时候要等好一会儿,写个VLOOKUP函数公式鼠标指针都要转半天。其实这是由于文件中积累着各种冗余的信息导致的表格体积变大,计算卡顿等现象。单击【易用宝】→【工作簿】→【Excel文件瘦身】。表格文件超大,打开卡顿,闪烁,这种慢慢慢,烦人!我们只需给表格文件瘦个身就ok了。你有没有遇到过这种情况呢?


AI大模型学习(14)AI 小白入门!用 OpenCV+Python 打造人体姿态识别系统,超详细教程来了
icoder8889/30/2025

这篇教程介绍了如何使用Python+OpenCV+MediaPipe搭建入门级人体姿态识别系统。主要内容包括:人体姿态识别的应用场景(如健身APP、体感游戏)、开发环境搭建(安装Python、OpenCV和MediaPipe库)、核心代码实现(通过30行代码完成摄像头姿态检测),以及进阶功能开发(深蹲动作纠正算法和PPT体感控制器)。教程详细解析了MediaPipe的BlazePose模型架构和33个关键点的生理学意义,并提供了多线程优化等性能提升方案。该项目适合AI初学者实践,无需复杂算法即可实现实时人体

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0