比如loader
一个基于文件的todo工具
效果“yarn global add node-todo-1
创建Node.js 命令行项目
写第一行代码然后运行
console.log(‘hi i an Node.js’)
做命令行工具

安装commader.js
yarn add commander

命令行支持参数
打印出undefined

说明选项是开光, -x 对应的就有人
目前运行原理, node 运行了index.js 后面接受了 —xxx的选项
声明add是子命令
文档复制粘贴
子命令叫clone,作用打出log
program.command('clone <source> [destination]').description('clone a repository into a newly created directory').action((source, destination) => {console.log('clone command called');})

自定义 命令add
最后一个参数是个command对象
实现add功能
入口文件,从index.js 改名cli.js
添加额外文件表示api
数据库
home目录
~/.todo
获取home目录
const homedir = require('os').homedir()

运行打印
得到home环境变量
const home = process.env.HOME || homedir
打印home变量和home目录

在家目录里创建文件存储
- 读取之前的任务
fs.readFile(home+'.todo')
不同系统下路径表示方法不同,nodejs解决方法const p = require('path')
const dbPath = p.join(home, '.todo')

参数分析
encoding 默认utf8
读文件是为了之后写,操作是追加,用a
a+ 不存在还会创建
得到两个参数回调,error data
data有可能是字符串或者buffer
变成字符串,用函数
代码的作用就是读取home目录的todo,
fs.readFile(dbPath,{flag: 'a+'},(error,data)=>{console.log(data.toString())
const homedir = require('os').homedir();const home = process.env.HOME || homedirconst fs = require('fs')const p = require('path')const dbPath = p.join(home, '.todo')module.exports.add = (titile)=> {fs.readFile(dbPath,{flag: 'a+'},(error,data)=>{console.log(data.toString())}

可以确定通过readfile读取到之前的任务
- 往里面添加一个title任务
- 存储任务到文件
创建空的数组 
尝试把data
封装优化代码
面向接口编程
用new Promise 处理异步操作,不能return ,成功时候resolve,失败reject、

await async
read返回的是promise,使用await拿到成功的结果
当前函数必须标记文async
write写法
传数组,数组变字符串,写道路径里,路径也需要传
write也是异步的,外面如何知道成功失败?
等写结束才确保add成功
promise封装一下

argv的长度,说明用户直接运行了node cli.js

