/** * [email protected] * 安装: 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都可以指定全局配置。这里配置完就可以随意切换了 * } * ] *} * **/
标签:node,坑点,代码,global,vm,value,js,vm2 From: https://www.cnblogs.com/yoyo1216/p/17920049.html