轶哥

📚 Having fun with AI Agent. Always learning.

    Node.js在VM环境使用ECMAScript modules
    •   更新:2021-03-04 15:28:35
    •   首发:2021-03-04 13:25:32
    •   教程
    •   4154

    vm模块允许在V8虚拟机上下文中编译和运行代码。但是不是安全机制,如果有沙箱(sandbox)需求,可以考虑https://github.com/patriksimek/vm2

    在VM环境中使用ECMAScript modules,即在VM环境中可以用import代替require引入某个模块,避免Cannot use import statement outside a module错误,也可以用export代替module.exports

    我的使用场景:

    通过Node.js在VM环境使用ECMAScript modules之目的,是为了构建一个虚拟环境(可控的上下文内容)动态执行一些代码,方便在复杂系统中构建小型脚本动态的快速验证一些想法。

    https://github.com/yi-ge/api-proxy这个小项目中也有用到vm模块。

    实现方法

    vm.png

    const vm = require('vm')
    
    require = require("esm")(module)
    
    vm.runInNewContext(`require("./main.js")`, {
      console,
      module,
      require
    });
    

    借助了esm开源模块(https://github.com/standard-things/esm),此时就可以在main.js中运行类似下面这样的代码了:

    import fs from 'fs'
    
    const a = fs.readFileSync('./main.ts', 'utf-8')
    console.log(a)
    

    其它

    使用ems本质上还是转换为CommonJS,和使用babel进行转换本质上是一样的。

    可以通过vm.Module实现更低级的ECMAScript modules接口运行在VM环境。

    如果在package.json中定义了"type": "module",上述方法是无效的。因为requiremodule是未定义的。需要采用其它方法。

    打赏
    交流区

    暂无内容

    尚未登陆
    发布
      上一篇 (云服务器Linux磁盘扩容)
    下一篇 (ESXi + Frp 内网穿透)  

    评论回复提醒