Node全解02_02node命令行程序

继续完善代码

001 如果用户输入 node cli.js 就显示所有任务

cli.js

1
2
3
4
5
6
7
// 用户实际输入的 命令参数
// console.log(process.argv)

if(process.argv.length === 2){
// 说明用户直接运行 node cli.js
api.showAll()
}

index.js

1
2
3
4
5
6
module.exports.showAll = async (title) =>{
const list = await db.read();
list.forEach((task, index)=>{
console.log(`${task.done ? '[x]' : '[_]'}${index} - ${task.title}`)
})
}

002 在用户输入 node cli.js 时候 假如有很多任务 如何通过上下按钮 切换呢?

003 完成所有功能

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
const inquirer = require('inquirer');
const db = require('./db.js');

module.exports.add = async (title) =>{
// 读取之前的任务
const list = await db.read();
// 往里面添加一个任务
list.push({title,done:false});
// 存储任务到文件
console.log('read~~~~')
console.log(list)
await db.write(list);
}

module.exports.clear = async (title) =>{
await db.write([]);
}

module.exports.showAll = async (title) =>{
const list = await db.read();
inquirer
.prompt([
{
type: 'list',
name: 'index',
message: '请选择你想操作的任务',
choices: [
{name:'退出',value:'-1'},

...list.map((task, index)=>{
return {name: `${task.done ? '[x]' : '[_]'}${index} - ${task.title}`, value: index.toString()}
}),
{name:'创建任务',value:'-2'}
]
},
])
.then(answers => {
const index = parseInt(answers.index);
if(index >= 0){
inquirer
.prompt([
{
type: 'list',
name: 'action',
message: '请选择操作',
choices: [
{name:'退出',value:'quit'},
{name:'已完成',value:'makeAsDone'},
{name:'未完成',value:'maksAsUndone'},
{name:'改标题',value:'updateTitle'},
{name:'删除',value:'remove'},
]
},
])
.then(answers2 => {
switch(answers2.action){
case 'makeAsDone':
list[index].done = true;
db.write(list);
break;
case 'maksAsUndone':
list[index].done = false;
db.write(list);
break;
case 'updateTitle':
inquirer.prompt([
{type: 'input',
name: 'title',
message:'新的标题',
default: list[index].title
}]).then(answer => {
list[index].title = answer.title
db.write(list)
});
break;
case 'remove':
list.splice(index,1);
db.write(list);
break;
}
});
}else if( index === -2){
// 创建任务
inquirer.prompt([
{type: 'input',
name: 'title',
message:'输入任务标题'
}]).then(answer => {
list.push({
title: answer.title,
done: false
})
db.write(list);
});
}
});
}

004 优化代码

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const inquirer = require('inquirer');
const db = require('./db.js');

module.exports.add = async (title) =>{
// 读取之前的任务
const list = await db.read();
// 往里面添加一个任务
list.push({title,done:false});
// 存储任务到文件
console.log('read~~~~')
console.log(list)
await db.write(list);
}

module.exports.clear = async () =>{
await db.write([]);
}

function askForCreateTask(list){
inquirer.prompt([
{type: 'input',
name: 'title',
message:'输入任务标题'
}]).then(answer => {
list.push({
title: answer.title,
done: false
})
db.write(list);
});
}

function makeAsDone(list,index){
list[index].done = true;
db.write(list);
}

function maksAsUndone(list,index){
list[index].done = false;
db.write(list);
}

function updateTitle(list,index){
inquirer.prompt([
{type: 'input',
name: 'title',
message:'新的标题',
default: list[index].title
}]).then(answer => {
list[index].title = answer.title
db.write(list)
});
}

function remove(list,index){
list.splice(index,1);
db.write(list);
}

function askForAction(list, index){
const actions = {
makeAsDone,
maksAsUndone,
updateTitle,
remove
};

inquirer
.prompt([
{
type: 'list',
name: 'action',
message: '请选择操作',
choices: [
{name:'退出',value:'quit'},
{name:'已完成',value:'makeAsDone'},
{name:'未完成',value:'maksAsUndone'},
{name:'改标题',value:'updateTitle'},
{name:'删除',value:'remove'},
]
},
])
.then(answers2 => {
const action = actions[answers2.action];
console.log(action);
action && action(list, index);
});
}

function printTasks(list){
inquirer
.prompt([
{
type: 'list',
name: 'index',
message: '请选择你想操作的任务',
choices: [
{name:'退出',value:'-1'},

...list.map((task, index)=>{
return {name: `${task.done ? '[x]' : '[_]'}${index} - ${task.title}`, value: index.toString()}
}),
{name:'创建任务',value:'-2'}
]
},
])
.then(answers => {
const index = parseInt(answers.index);
if(index >= 0){
askForAction(list,index);
}else if( index === -2){
// 创建任务
askForCreateTask(list);
}
});
}

module.exports.showAll = async (title) =>{
const list = await db.read();
printTasks(list);
}

优化技巧,给一坨代码起个名字法

005 发布代码

  • 修改 package.json
1
2
3
4
"bin":{
"t": "cli.js"
},
"files":["*.js"]
  • 添加 node shebang 在 cli.js 第一行
1
#!/usr/bin/env node
  • 如果你是 mac 添加文件可执行权限
    • chmod +x cli.js
  • nrm 安装

    1
    2
    3
    npm install -g nrm

    // 如果你是别的源 你就 nrm use npm
  • 发布你的代码

    • 如果是 yarn 你就yarn login 和 yarn publish
    • 如果是npm 你就npm adduser 和 npm puhlish
    • 注意把淘宝源切换为原始源

代码仓库