node.js文件模块的学习:制作一个基于文件的todo工具

225 阅读7分钟

CRM介绍:

  • 通过copy大量的实例,
  • 然后run,得到输出结果,
  • 最后全方位modify后更改输入看对应的输出会如何更改
  • 以达到快速学习的目的。
  • 重点是得到输出和输入的关系,然后实现自己的设计。

一、学习目标说明

  • CRM去制作出一个todo工具,以完成对node.js的文件模块的基本学习。
  • 所以目的就是做出一个todo工具,并且发布到npm

需求分析

  • 功能

    • 可以列出所有的todo(查)
    • 可以新增todo(增)
    • 可以删除todo(删)
    • 可以编辑todo(改)
    • 可以标记todo为已完成和未完成(状态管理)
  • 命令 t | t add 任务名 | t clear

二、开始CRM学习

1.文件创建

建立一个目录,然后对文件初始化进行package.json配置

//初始化
yarn init -y

将package.json文件中的version改为0.0.1

2.js文件创建

创建一个index.js,然后随便写几句可以输出的代码

//查看是否正常输出
node index.js

3.库引用

yarn add commander

4.quick start

1. 第一个copy 关于option
2. 第二个copy 关于子命令

image.png

3.error
  • 不同的commander版本对应不同的语法,在package.json中要设置好对应的版本,然后install
  • 在GitHub上,可以通过tags查看已经发布的过往的版本
  • 出现报错信息,除非明显的代码语法问题,剩余的大部分都是版本对应问题
4.导出一个文件和导入一个文件

index.js中提供API,cli.js中引用API。

  • 导出:module.exports.<函数名>
  • 导入:const <文件名> = require('./')
  • 使用导入文件:<文件名>.<函数名>()
5.创建数据库文件并写入数据

file提供的操作中有readFile,可以直接创建文件,所以没有必要额外通过指令去创建。

  • 创建数据存放路径和文件,考虑到所有人的使用,建议把数据放到home目录下,
const homedir=  require('os').homedir() // System Home Diro Home Dir
const Home = process.env.home || homedir 
  • 在home下创建.todo文件
const dbPath = require('path').join(Home,'.todo')
  • 然后是读取数据库文件,和将数据写入文件
const fs = require('fs')
module.exports.add = (taskName)=>{
  fs.readFile(dbPath,{encoding:'utf-8',flag:'a+'},(error,data)=>{
    if(error){
      console.log(error)
    }else{
      let list = []
      try {
        list = JSON.parse(data.toString())
      } catch(error2){
        list = []
      }
      console.log(list)
      const task = {
        title:taskName,
        done:false
      }
      list.push(task)
      const string = JSON.stringify(list)
      console.log('fuck',list,'fuck')
      fs.writeFile(dbPath,string,{encoding:'utf-8',flag:'w+'},(err) => {
        if (err) throw err;
        console.log('The file has been saved!');
      })
    }
  })
}

readFileNode.js / fs.readFil…和writeFileNode.js / fs.writeFi…

6.将代码优化为面向接口编程
  • 将原文件的代码注释后,写好需要的接口。
  • 新建文件,分批复制代码,然后导出。
  • 需要注意的是异步需要Promise然后返回给最上层的函数。
  • 调用的时候使用async和await

image.png

image.png

5.开始完成todo的功能

现在的功能是已经可以通过 命令行 添加一项任务,对整体的数据的增删改查有待完善,对单项数据的编辑完全没有做。

根据现有知识:

  • 对整体数据的增删改查,可以通过在db中写接口,cli文件中调用接口,直接做到。
  • 对单项数据的增删改查,需要新的知识提供和用户的交互界面,使用的工具是SBoudrias/Inquirer.js at v4.0.0 (github.com)

不选择最新的版本是,写着写着会出一些问题,就随便选了一个旧的版本。

1.对整体数据API的提供
  • 增 create 增加单项数据,其实也可以在单项数据中调用
  • 删 clear 清空整个数据文件
  • 改 update 这个直接放到单项数据的操作中会好一些
  • 查 showAll 打印出整个数据列表

因此,设计的思路是,在showAll打印出整个的数据列表后,提供对单项数据的操作。

2.写啥都不如直接看代码

因为inquiries的crm特别简单,整个的设计逻辑也很清楚。 唯一需要解释下的就是封装代码,封装就是写注释,然后把一坨代码拷贝出一个函数,对函数进行引用和参数的传入。用地少一点的就是哈希表的映射,把函数放到对象中再判断。

因此,直接看,代码吧。 YuyuanW/to-do-yuyuan: 一个基于node命令行的日常任务管理器,用来写todolist,然后一项一项打勾,成就感max~ (github.com)

三、发布到npm上

实话说,第一次发布这种东西,创建npm账号都不知道咋创建,去官网创建,半天都搞不定。废话不多说,直接上流程,mark住吧~总有一天会再发布npm,然后又不知道咋发布了。

分为三个流程。

1.修改package.json

这也是为什么我们创建文件的最初需要yarn init -y 了。

  • name: 不能与别个的重复
  • main:"index.js",你的api放在哪个文件
  • bin:{"y":"cli.js"},能让命令行的 y直接代替语句 node cli.js
    • bin还要继续设置,shebang,搜索node js shebang然后放到cli文件中
    • 提供权限: chmod +x cli.js
  • files:["*.js"],放有用的文件

2.发布到npm

  • 源的问题,切换到原始源。
    • nrm ls查看当前使用的源,带星号的就是
    • nrm use npm 切换到npm源
  • 登陆
    • npm adduser
    • 然后就是输入用户名,密码,邮箱
  • 发布
    • npm publish
    • 同一个版本不能publish两次,再次发布,需要package中修改版本,并且在cli中读到版本。
      • const pkg = require('./package.json')
      • programe .version(pkg.version)
  • 用户使用
    • install:yarn global add < name >@lasted (同样需要npm源)
    • uninstall:yarn global remove < name >
    • use:node < name > -h

结语

CRM

与在校的被推着走的学习不同,自学的过程中,更注重于CRM方法的使用。

  • 前者是直接告诉你结论,因为这就是考点,然后你去赶下一个点。这些都是确定的。
  • 实际情况之中,你根本就不知道什么是正确的方法,什么是你需要学的对的知识,什么是正确的使用情况,因此,后者在实际的生产环境中,十分受用。
  • 因为一切都是从经验中来,总结到什么样的输入能得到什么样的输出,然后去运用去发散,再到经验中去。

error

  • 第三方库的使用时候,忽略版本问题,导致引用的时候运行不了,引用的时候最好还是不要使用最新版吧,debugger很耗费时间的,我只是想正常使用这个工具而已。
  • GitHub的push失败,原因是,因为第一个问题,我需要别人给我调试代码,我就上传到了一个随时准备删的GitHub仓库,然后删掉后,重新创建,发现半天push不上去,我以前从来没有遇到过这种情况啊,报错提示是ssh密匙的问题,我就重新生成了密匙,然后保存到GitHub上,还是push不上去,最后发现是原密匙文件中生成的是空白。是因为我存放数据库,是放到家目录下的.todo文件中,我就直接去环境变量中指定了home目录为具体的冗长的一个目录,导致了密匙的一系列问题。
  • 其余比较困扰的问题倒是没什么。除开crm需要观察总结一系列的结论之外,都做的比较顺利,成就感max的一个小项目。

五星推荐

作为卷王必备工具——todolist,大家快去yarn add我的包吧~ 源码和使用再次上链接:YuyuanW/to-do-yuyuan: 一个基于node命令行的日常任务管理器,用来写todolist,然后一项一项打勾,成就感max~ (github.com)