标签:
readline用于创建一个从stream读取数据的接口
VM提供了在应用中执行脚本的能力
vm+readline 实现各简单的js执行命令行工具
开发环境 : Node4.2.4 , 用了ES6 arrow function /let/const
调试cmder
‘use strict‘ const readline = require(‘readline‘); const vm = require(‘vm‘); //创建接口 let rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.setPrompt("V+>"); rl.prompt(); rl.on( ‘line‘, (data) => { let script = data.trim(); if( script === ‘exit‘){ rl.close(); return ; } //如果想在新的运行上下文执行脚本使用runInNewContext //使用runInThisContext意味脚本可以直接访问当前上下文全局变量global //这种内部执行脚本是极其不安全的 vm.runInThisContext(script); rl.prompt(); }); rl.on(‘close‘, () => { console.log(‘Bye, Bye !‘); process.exit(0); });
需要关注的vm提供的几个方法:
runInThisContext 在当前上下文执行,可以访问当前global但是无法访问本地变量
runInNewContext 在一个新的容器环境中执行,无法访问当前上下文任何数据
演示runInNewContext的应用
‘use strict‘ const readline = require(‘readline‘); const vm = require(‘vm‘); // 创建一个容器或者叫沙箱,可以提供一些变量或者方法 // 用于在脚本的范围 const contaner = {}; contaner.log = console.log; //创建接口 let rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.setPrompt("V+>"); rl.prompt(); rl.on( ‘line‘, (data) => { let script = data.trim(); if( script === ‘exit‘){ rl.close(); return ; } //如果想在新的运行上下文执行脚本使用runInNewContext //使用runInThisContext意味脚本可以直接访问当前上下文全局变量global //这种内部执行脚本是极其不安全的 //vm.runInThisContext(script); vm.runInNewContext(script, contaner);//例如script: log(‘visonme‘) =>输出visonme rl.prompt(); }); rl.on(‘close‘, () => { console.log(‘Bye, Bye !‘); process.exit(0); });
如果你想提供用于script访问的变量可以这样修改contaner
const container = { accessName : ‘visonme‘, //脚本可以直接访问accessName变量 console:{ log: console.log , //在脚本中提供类似console.log的输出 error: console.error } }; //假如你想提供自定义的方法用于脚本访问可以这样 let myFunction = () => { console.log("this is myFunction"); }; const container = { Fn : myFunction //提供Fn用于脚本访问myfunction }
标签:
原文地址:http://www.cnblogs.com/visonme/p/5114998.html