Node.js从零开始-REPL

使用了Node.js有相当长的时间了。一直都是用到什么去看什么,零零散散的,毫无系统条理,碎片化的知识结构导致我的大脑存储也时常out fo memory。So, Let’s begin from Zero。

从零开始,自然是从从nodejs官方文档开始。但是官方文档的api是A-Z的,你背单词从A开始可以。

写程序可不是从A开始写的。

我们都是从零开始的。

第一步自然是让我们和Nodejs开始互动起来,有了交流,才能深入浅出嘛。

所以REPL是第一步。

REPL

意即Read-Eval-Print Loop

Demo 0:

1
2
3
4
5
6
7
8
$ node
> .editor
function welcome(name) {
return `Hello ${name}`
}
welcome('Mainto')
# ⌃D
'Hello Mainto'

Special keys

⌃D to finish

⌃C to cancel

Commonds

.exit exit REPL

.editor editor mdoe

.clear reset REPL context, will emit ‘reset’ event

.help show the commonds list

.save save the current REPL session to a file: > .save ./file/to/save.js

.load load a file into the current REPL session: > .load ./file/to/load.js

Default Evaluation

支持js表达式输入
global scope & local scope // 这里要有一个context的概念,通常译为执行上下文

创建一个repl_test.js的文件,写入下面的内容

1
2
3
const repl = require('repl')
const msg = 'hello world'
repl.start('> ').context.m = msg

然后在终端里运行

1
2
3
$ node repl_test.js
> m
'hello world'

成功在当前的REPL中获取到了变量m

通过这个demo,我们可以得知context的属性默认是可读写。可以通过Object.defineProperty()来限制只读。

访问Node.js核心模块, 例如fs
指定变量_, 这个_默认把最近一次的输入值赋给_,除非明确设置了_

Custom Evaluation Functions 自定义配置
prompt,translator配置
Recoverable Errors这点主要是为了支持多行输入。(略过)
在repl中回车的时候都是默认输入当前行的内容到eval函数,为了支持多行输入,返回的repl.Recoverable实例会提供回调

Customizing REPL Output 自定义输出(略过)

Class:REPLServer

repl类的服务有exit, reset两种事件。
都可以监听,并且在里面搞点事情。下面的例子是在.exit.clear时触发

1
2
3
4
5
6
7
8
9
10
11
12
// demo3
const repl = require('repl');
const r = repl.start({ prompt: '(●′ω`●) ', eval: myEval })
function myEval(cmd, context, filename, callback) {
callback(null, cmd);
}
r.on('exit', () => {
console.log('bye bye')
})
r.on('reset', () => {
console.log('welcome')
})

replServer.defineCommand(keyword, cmd) 自定义命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// demo4
const repl = require('repl')
const r = repl.start()
replServer.defineCommand('sayhello', {
help: 'Say hello',
action(name) {
this.bufferedCommand = ''
console.log(`Hello, ${name}!`)
this.displayPrompt()
}
})
replServer.defineCommand('saybye', function saybye() {
console.log('Goodbye!')
this.close()
})

通过.sayhello maintobest, .saybye可执行

replServer.displayPrompt([preserveCursor]) 主要用于自定义命令中,效果是打印出ouput里的内容,恢复input

REF

官方文档REPL

坚持原创技术分享,您的支持将鼓励我继续创作!