You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在带依赖的隔离环境运行JavaScript代码?isolated-vm与vm2遇障求助

解决隔离环境运行带依赖代码的问题

优化vm2配置解决依赖加载问题

你当前的vm2代码已经尝试通过require.import指定依赖,但要让隔离环境正常加载第三方包,得注意这几个关键:

  • 必须先在宿主环境(不是隔离VM内部)执行npm install discord.js-selfbot-v13安装依赖,vm2是直接复用宿主的node_modules,没法在隔离环境里单独装包。
  • 调整NodeVM的配置,补充模块查找的根目录和内置模块权限,避免加载失败:
    import { NodeVM, VMScript } from "vm2";
    import { resolve } from "path";
    import fs from "fs";
    
    async function runScript(scriptPath, dependencies = []) {
      const scriptSource = fs.readFileSync(scriptPath, "utf8");
    
      const vm = new NodeVM({
        console: "inherit",
        sandbox: {},
        require: {
          external: true,
          import: dependencies,
          builtin: ["*"], // 允许使用Node内置模块,按需可指定具体模块
          root: resolve("./"), // 明确模块查找根目录,确保能定位到node_modules
        },
      });
      const script = new VMScript(scriptSource);
      const result = await vm.run(script);
      console.log(result);
    }
    
    runScript(resolve("./src/discordService.js"), ["discord.js-selfbot-v13"]);
    
  • 如果你的discordService.js用了ES模块的import语法,得在配置里开启esm支持:
    const vm = new NodeVM({
      console: "inherit",
      sandbox: {},
      esm: true, // 启用ES模块解析
      require: {
        external: true,
        import: dependencies,
        builtin: ["*"],
        root: resolve("./"),
      },
    });
    

isolated-vm的模块支持方案

isolated-vm对ES模块的原生支持确实有限,要在里面运行带依赖的代码,可以试试这两种方法:

  1. 打包依赖为单文件:用webpack、rollup等工具把discordService.js和它的依赖打包成单个CommonJS文件,再传入isolated-vm运行。
  2. 手动注入依赖:从宿主环境加载依赖,再注入到隔离上下文,脚本里直接用全局变量调用:
import ivm from 'isolated-vm';
import { resolve } from "path";
import fs from "fs";

async function runWithIsolatedVM(scriptPath) {
  const isolate = new ivm.Isolate();
  const context = await isolate.createContext();
  const global = context.global;

  // 从宿主加载依赖,注入到隔离环境的全局变量
  const discord = require("discord.js-selfbot-v13");
  await global.set('discord', ivm.Reference.from(discord));

  // 运行目标脚本
  const scriptSource = fs.readFileSync(scriptPath, 'utf8');
  const script = await isolate.compileScript(scriptSource);
  await script.run(context);
}

runWithIsolatedVM(resolve("./src/discordService.js"));

这种方式需要你把脚本里的require("discord.js-selfbot-v13")改成直接用全局的discord变量。

核心注意点

不管用vm2还是isolated-vm,隔离环境都无法独立安装依赖,所有第三方包必须提前在宿主环境装好,再通过配置或注入的方式让隔离环境访问。另外,包含原生C++模块的依赖可能会有兼容性问题,需要提前测试。

内容的提问来源于stack exchange,提问作者Lakhan gaikwad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:47:20