修改vm代码减少vm坑点

发布时间 2023-12-21 20:24:01作者: 守护式等待
/** 
 * vm2@3.9.3
 * 安装: nodejs
 * 然后: npm install vm2       npm install canvas        npm install jsdom
 * 提示: 建议每一个编写完事的js 建议用fd的js调试工具压缩一下,减少占用行数
 * 
 * 使用vm2之前,先修改vm2本地文件
 * 
 *  1、修改vm.js里的
 *      // Create a new context for this vm.
 *      //原本下面这句话 const _context = createContext(undefined, {
 *      //被修改成了这句话 const _context = createContext(options, {
 *      //外界在new VM的时候 把全局变量通过对象形式传递过来,全局的context就会继承这个全局变量!
 * 
 * 
 *  2、修改contextify.js里的 搜索Contextify.setGlobal =
 *      (1)、global[prop] = value;//Contextify.value(value); //这里是为了在调试代码里不显示proxy 已被代理
 *      (2)、去掉vm2特征global
 *      //下面这段屏蔽了
 *      Object.defineProperties(global, {
 *          global: {value: global},
 *          GLOBAL: {value: global},
 *          root: {value: global},
 *          isVM: {value: true}
 *      });
 * 
 * 
 *  3、修改main.js里的
 *      //如果想让vm2报错不是内部错误,修改890行
 *      throw e;//this._internal.Decontextify.value(e);  //原本是这句话throw this._internal.Decontextify.value(e);    改成了 throw e
 * 
 * 关于vm2报错本地文件,但是找不到那个报错的调试文件解决方法:
 *      const {VM,VMScript} = require("vm2");//这个是修改过的
 *      const CodeGenerate = require("./node_tools/CodeGenerate.js");
 *      //内存的概念,并非真正的内存,只是变量存储。
 *      let Vm2Cfg = {memory:{prototypes:{},examples:{}},DefPrototype(prototypeName,constructor,basePrototype){}};
 *      let savepath = `${__dirname}/vm_testScript/VM2_debug.js`;    //提前把文件路径保存到变量里。
 *      let code = CodeGenerate(path_,savepath);                     //把加载完事的文件code直接写到本地
 *      let vm = new VM();
 *      let catvm = Object.assign(Vm2Cfg,{vm:this});//内存配置导入
 *      vm.setGlobal("catvm",catvm);//导入到全局里,这里的名字随便改,整体形成代码形式的话。就不要随意修改了。
 *      vm.run(new VMScript(code,savepath)); //运行前 savepath 要保存到本地,那么调试报错时才能找到位置。
 * 
 * 
 * VScode 环境联调配置nodejs执行配置文件内容 launch.json
 *   //运行js时添加nodejs配置文件 launch.json ,测试代码路径如下:
 *   //C:\Users\AdministratorLr\Desktop\NewCode3_2022_10_15\.vscode\launch.json
 *   //配置文件内容入下:
 * 
 *{
 *    "version": "0.2.0",
 *    "configurations": [
 *        {
 *            "name": "v1 本地调试",
 *            "type": "node",
 *            "request": "launch",
 *            "program": "${workspaceFolder}/index.js", //它只是跟在可执行文件后面的 一个参数了,要调试的js代码,不管你想执行哪个配置文件,这里配置即可
 *            "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
 *        },
 *        {
 *            "name": "v2 浏览器无环境联调",
 *            "type": "node",
 *            "request": "launch",
 *            "program": "--inspect-brk", //它只是跟在可执行文件后面的 一个参数了
 *            "args": ["${workspaceFolder}/index.js"],//它只是跟在可执行文件后面的 一个参数了
 *            "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
 *        },
 *        {
 *            "name": "v3 cmd参数详解",  //演示所有参数的含义 , 控制台执行的结果是: D:\nodejs\node.exe args1 args2 args3 args4 args5  所以根据想要的功能自行设定和删减
 *            "type": "node",
 *            "request": "launch",
 *            "program": "args3", //它只是跟在可执行文件后面的 一个参数了
 *            "args": ["args4", "args5"],//它只是跟在可执行文件后面的 一个参数了
 *            "runtimeArgs": ["args1", "args2"],//它只是跟在可执行文件后面的 一个参数了
 *            "runtimeExecutable": "D:\\nodejs\\node.exe" // 这里是 v16 版本的node路径,不管你安装几个版本的node都可以指定全局配置。这里配置完就可以随意切换了
 *        }
 *    ]
 *}
 *
**/