比如loader

一个基于文件的todo工具
效果“
yarn global add node-todo-1
image.png

创建Node.js 命令行项目

新建文件夹
yarn init -y

写第一行代码然后运行

console.log(‘hi i an Node.js’)

node index终端运行
image.png

做命令行工具

image.png

安装commader.js

yarn add commander

image.png
命令行支持参数
打印出undefined
image.png
image.png
说明选项是开光, -x 对应的就有人
image.png

目前运行原理, node 运行了index.js 后面接受了 —xxx的选项

声明add是子命令
文档复制粘贴
子命令叫clone,作用打出log

  1. program
  2. .command('clone <source> [destination]')
  3. .description('clone a repository into a newly created directory')
  4. .action((source, destination) => {
  5. console.log('clone command called');
  6. })

image.png

自定义 命令add
image.png

最后一个参数是个command对象
image.png

实现add功能

入口文件,从index.js 改名cli.js
添加额外文件表示api

数据库
home目录
~/.todo

获取home目录

const homedir = require('os').homedir()

image.png
运行打印
image.png

得到home环境变量

const home = process.env.HOME || homedir

打印home变量和home目录
image.pngimage.png

在家目录里创建文件存储

  1. 读取之前的任务

fs.readFile(home+'.todo')
不同系统下路径表示方法不同,nodejs解决方法
const p = require('path')
const dbPath = p.join(home, '.todo')
image.pngimage.png
参数分析
encoding 默认utf8

读文件是为了之后写,操作是追加,用aimage.png
a+ 不存在还会创建image.png
得到两个参数回调,error data
data有可能是字符串或者buffer
变成字符串,用函数

代码的作用就是读取home目录的todo,

  1. fs.readFile(dbPath,{flag: 'a+'},(error,data)=>{
  2. console.log(data.toString())
  1. const homedir = require('os').homedir();
  2. const home = process.env.HOME || homedir
  3. const fs = require('fs')
  4. const p = require('path')
  5. const dbPath = p.join(home, '.todo')
  6. module.exports.add = (titile)=> {
  7. fs.readFile(dbPath,{flag: 'a+'},(error,data)=>{
  8. console.log(data.toString())
  9. }

image.png
可以确定通过readfile读取到之前的任务

  1. 往里面添加一个title任务
  2. 存储任务到文件
    创建空的数组
  3. image.png
    尝试把data

封装优化代码
面向接口编程
image.png

用new Promise 处理异步操作,不能return ,成功时候resolve,失败reject、

image.png

await async

read返回的是promise,使用await拿到成功的结果
当前函数必须标记文async
image.png

write写法

传数组,数组变字符串,写道路径里,路径也需要传
image.png
write也是异步的,外面如何知道成功失败?
等写结束才确保add成功
promise封装一下
image.png

image.png

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

image.png