📔
饥人谷前端体系课程笔记
黑马程序员笔记前端面试押题前端精进
  • 课程大纲
  • Git入门
    • 3. 软件安装详解
    • 4. Mac环境搭建
    • 5. 命令行入门
    • 6. 本地仓库
    • 7. Git远程仓库-GitHub
  • HTML全解
    • 8. HTML概览
    • 9. HTML标签
    • 10. HTML重难点
    • 11. HTML实践 & 手机调试
  • CSS全解
    • 12. CSS基础
    • 13. CSS布局(上)
    • 14. CSS布局(下)
    • 15. CSS定位
    • 16. CSS动画
  • HTTP全解
    • 17. URL 是什么
    • 18. 请求和响应 & Node.js Server
  • JS全解
    • 19. JavaScript概览
    • 20. 内存图与JS世界(精品课)
    • 21. Canvas 实践—画图板
    • 22. JS语法
    • 23. JS数据类型
    • 24. JS 对象
    • 25. JS 对象分类
    • 26. JS 数组
    • 27. JS 函数
    • 28. JS 实战,会动的代码
    • 29. JS运算符
    • 30. JS总结
  • JS编程接口
    • 31. DOM编程
    • 32. 手写DOM库
    • 33. JQuery中的设计模式(上)
    • 34. JQuery中的设计模式(下)
    • 35. DOM事件与事件委托
  • 项目 前端导航站点
    • 前端导航项目笔记
  • 前后分离
    • 40. AJAX的原理
    • 41. 异步与Promise
    • 42. 跨域、CORS、JSONP
    • 43. 静态服务器
    • 44. AJAX实战:Cookie、Session
  • JS进阶MVC
    • 48. MVC(上)
    • 49. MVC(中)
    • 50. MVC(下)
  • 项目构建
    • 51. Webpack(上)
    • 52. Webpack(下)
  • 算法与数据结构
    • 62. 伪代码与流程图
  • React全解
    • 75. React起手式
    • 76. React类组件和函数组件
    • 77. Class组件详解
    • 78. 函数组件
    • 79. Hooks原理解析
    • 80. Hooks各个击破
    • 81. 精通Redux
  • Node.js
    • 84. Node.js技术架构
    • 85. 文件模块
    • 86. 单元测试之文件模块
    • 87. 调试 Node.js 程序
    • 88. 静态服务器
    • 89. 命令行翻译工具
    • 90. 操作数据库
    • 91. 数据库基础知识
    • 92. Stream 流
    • 93. child_process
    • 94. 总结
  • TypeScript
    • 112. 基础
    • 113. 泛型
  • Next.js全解
    • Next.js 上
    • Next.js 下
  • ES6精讲
    • Promise,async/await
  • 大屏可视化笔记
    • 大屏可视化项目
  • SCSS全解
    • SCSS全解
  • 拓展
    • 一次性弄懂性能优化
    • Web性能优化
由 GitBook 提供支持
在本页
  • 需求
  • 初始化项目
  • 安装commander.js
  • 作业:
  • 回顾
  • 发布到 npm
  • npm publish
  • 总结

这有帮助吗?

  1. Node.js

85. 文件模块

文件模块 fs Node.js 全解

本节课目标: 创建一个基于文件的todo工具

需求

功能

可以列出所有的 todo 可以新增 todo 可以编辑 todo 可以删除todo 可以标记todo为已完成/未完成

命令

t
t add 任务名
t clear

CRM 学习法

Copy 抄

Run运行

Modify改

这个项目会用到下面几个库

"commander"
"inquirer"
"winston"

devDependencies
"jest"

初始化项目

yarn init -y

init -y会创建一个package.json的文件

{
  "name": "node-todo-2",
  "version": "0.0.1",
  "main": "index.js",
  "license": "MIT"
}

这里把版本号改成0.0.1

创建一个index.js的文件,里面输入

console.log("Hi, I am Node.js")

如何运行这行代码呢?

在node.js中,只需要运行node index即可。

安装commander.js

yarn add commander  

把index.js的内容替换成

.option

const program = require("commander");
program
  .option("-d, --debug", "output extra debugging")
  .option("-s, --small", "small pizza size")
  .option("-p,  --pizza-type <type>", "flavour of pizza");
program.parse(process.argv);

console.log("pizza details:");//敲这一行为了确定indexjs是不是在运行

运行node index

运行node index -h, 就会看到下面的显示。

Usage: index [options]

Options:
  -d, --debug               output extra debugging
  -s, --small               small pizza size
  -p,  --pizza-type <type>  flavour of pizza
  -h, --help                display help for command

因此,.option就是用来声明有哪些选项的。-h是默认的。

.command

program
  .command("add <taskName>")
  .description("add a task")
  .action(() => {
    console.log("hi");
  });

以下是输出

Usage: index [options] [command]

Options:
  -x, --xxx,      output extra debugging
  -h, --help      display help for command

Commands:
  add <taskName>  add a task
  help [command]  display help for command

add

program
  .command("add")
  .description("add a task")
  .action((...args) => {
    const words = args.slice(0, -1).join(" ");
    console.log(words);
  });

a+

Open file for reading and appending. The file is created if it does not exist.

命令行

查看.todo文件里有什么

cat ~/.todo

删除文件

rm ~/.todo

优化代码

//***index.js

//获取home目录
const home = process.env.HOME || homedir;
const p = require("path");
const dbPath = p.join(home, ".todo");
const fs = require("fs");

module.exports.add = (title, done) => {
  //读取之前的任务
  fs.readFile(dbPath, { flag: "a+" }, (error, data) => {
    if (error) {
      console.log(error);
    } else {
      let list;
      try {
        list = JSON.parse(data.toString());
      } catch (error2) {
        list = [];
      }

      const task = {
        title: title,
        done: false,
      };
      list.push(task);
      const string = JSON.stringify(list);
      fs.writeFile(dbPath, string + "\n", (error3) => {
        if (error3) {
          console.log(error3);
        }
      });
    }
  });
};
console.log(process.argv);

node cli会打印出

'/opt/homebrew/Cellar/node/19.6.0/bin/node',//代表第一个参数node
'/Users/clair/github/jirengu-class/node-todo-2/cli'//代表第二个参数cli

安装inquirer

yarn add inquirer

这节课很多优化代码的技巧可以学一下

技巧:把一堆代码取一个名字,然后单独拆分成函数写

项目代码没敲完,特别是最后优化那一部分。

作业:

请按照视频制作一个 node-todo 项目,把源代码上传到 GitHub,并给出运行成功的截图~

回顾

如何使用 return new Promise

如何使用 async await

什么时候 reject(error)什么时候不 reject(error)

如何使用 fs.readFile/ fs.writeFile

如何使用 logger

如何使用 commander

如何使用 module.exports

如何引入jest 测试

如何 mock fs

如何使用WebStorm 调试

如何使用--inspect-brk 调试

发布到 npm

修改 package.json

"bin":{  "t":",/cli.js"
},
"files": [  "*.js"  ],

运行命令

yarn login 和 yarn publish
npm adduser
npm publish

注意要把淘宝源切换为原始源

如果提示出错,请自己把出错理解一下

npm publish

常见错误

你发布的包名跟线上包名重复,不允许发布,请改名

你用户名密码不匹配,请重置密码

你没有改版本号,不能重复发布同一版,请升级版本

其他问题自行Google

总结

不要看书学习

看了忘 没有留下任何痕迹 做笔记稍微好点)

动手学习

照着我的代码敲 (不允许复制粘贴)

学习调试方法

发现bug,学会自己debug

持续改进自己的作品 即使课堂上没讲)

下节课学习另一个模块

再见

上一页84. Node.js技术架构下一页86. 单元测试之文件模块

最后更新于2年前

这有帮助吗?

https://github.com/tj/commander.js
https://devdocs.io/node/fs#fsreadfilepath-options-callback
https://devdocs.io/node/fs#file-system-flags
https://devdocs.io/node/fs#fswritefilefile-data-options-callback