粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • wheel

    • 个人作品
    • 时间管理CLI工具
      • 做一个CLI版的时间管理工具(一)
      • 做一个CLI版的时间管理工具(十)
      • 做一个CLI版的时间管理工具(11)
      • 做一个CLI版的时间管理工具(12)
      • 做一个CLI版的时间管理工具(13)
      • 做一个CLI版的时间管理工具(14)
      • 做一个CLI版的时间管理工具(15)
      • 做一个CLI版的时间管理工具(二)
      • 做一个CLI版的时间管理工具(三)
      • 做一个CLI版的时间管理工具(四)
      • 做一个CLI版的时间管理工具(五)
      • 做一个CLI版的时间管理工具(六)
      • 做一个CLI版的时间管理工具(七)
      • 做一个CLI版的时间管理工具(八)
      • 做一个CLI版的时间管理工具(九)
    • 组装个支持记笔记的CodePen
    • ESCheck工具原理解析及增强实现
    • 一款检测代码中TODO的eslint插件
    • 实现一个Web UI检测(视觉走查)工具ing
    • 从0-1实现文件下载CLI工具
    • 内联JS处理(ES语法降级&内容压缩)
    • Node CLI工具原理解析
    • 我打造的在线简历生成应用
    • 助你轻松编写与分享snippet的VsCode插件
    • SourceMap解析CLI工具实现
    • 一个通过NPM包共(分)享代码块的解决方案
    • 实践:给女朋友个性化定制应用-体重记录(一)
    • 实践:给女朋友个性化定制应用-体重记录(二)
    • 实践:给女朋友个性化定制应用-体重记录(三)

做一个CL版的时间管理工具(13)

vuePress-theme-reco 粥里有勺糖    2018 - 2023

做一个CL版的时间管理工具(13)

粥里有勺糖 2021-08-16 技术笔记个人作品CLI工具

# 做一个CLI版的时间管理工具(13)

# 前言

在前一篇文章中加入了一个启动Web服务的指令timec page

本期就继续完善这个指令的效果

# 本期效果预览

# 功能开发

# Web侧

拟采用Vue3开发页面

安装项目依赖

yarn add vue@next @vue/compiler-sfc @vitejs/plugin-vue
1

快速创建一个基于Vite+Vue3的模板项目

npm init vite@latest my-vue-app --template vue
1

完成后的目录结构如下

my-vue-app
├── index.html
├── package.json
├── public
|  └── favicon.ico
├── src
|  ├── App.vue
|  ├── assets
|  ├── components
|  └── main.js
└── vite.config.js
1
2
3
4
5
6
7
8
9
10
11

我们将vite.config.js,main.js,components,App.vue,index.html这五部分的内容拷贝到我们项目的src/page目录下

拷贝完后的目录如下

├── App.vue
├── assets
|  └── logo.png
├── components
|  └── HelloWorld.vue
├── index.html
├── main.js
└── vite.config.js
1
2
3
4
5
6
7
8

接着改造一下timec page指令中的逻辑:

  • 定位到vite.config.js文件的位置
  • 使用--config指定配置文件的位置
  • 在spawn调用的方法中传入设置配置文件的参数
const cwd = path.resolve(__dirname, '../');
const viteConfigPath = path.join(cwd, 'src/page/vite.config.js');
const serveService = spawn('node_modules/.bin/vite', ['src/page', '--host', '--config', viteConfigPath], {
  cwd,
  stdio: 'inherit',
});
// 。。。code
1
2
3
4
5
6
7

到这一步前端工程的基本内容算搭好了,页面展示需要的数据,需通过Node相关的API才能获取,这里有两种方案:

  1. 页面使用SSR(服务端渲染)方案
  2. 添加一个后端服务,通过接口调用传递所需要的数据

项目采用第二种方案,下面展开介绍一下简单后端服务的搭建

# 服务端

这里使用自己DIY的玩具框架flash-wolves

安装依赖

yarn add flash-wolves
1

编写基本调用逻辑,在src/page下创建一个文件server.js

  • 使用Node执行这3行代码,这样一个简单的后端服务就在3001端口启动了
const { Fw } = require('flash-wolves');
const app = new Fw();
app.listen(3001);
1
2
3

编写2个接口:

  1. 获取配置文件
  2. 获取所有的数据(按天区分)
app.get('/json', (req, res) => {
  const config = getConfig();
  const { recordFilepath } = config;
  if (fs.existsSync(recordFilepath)) {
    res.success(getJSON(getFileContent(recordFilepath)));
    return;
  }
  res.fail(500, 'not set default recordFilepath');
});

app.get('/config', (req, res) => {
  const config = getConfig();
  res.success(config);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在什么时候启动这个服务?

当然是和启动Web服务的时候一起启动

这就需要我们在timec page指令中添加启动后端服务的逻辑:

  1. 同样使用spawn创建子进程启动后端服务
  2. 在客户端服务关闭的时候,杀死这个后端服务的子进程
const server = spawn('node', ['src/page/server.js'], {
  cwd,
  stdio: 'inherit',
});
serveService.on('close', (code) => {
  server.kill('SIGSTOP');
  process.exit(code);
});
1
2
3
4
5
6
7
8

客户端如何访问这些接口?:

  1. 为了降低项目复杂性,这里直接调用fetch方法获取后端接口的数据
  2. 单独建立一个文件src/page/api.js存放这些逻辑
export function getConfig() {
  return fetch('http://localhost:3000/config');
}

export function getEveryDayData() {
  return fetch('http://localhost:3001/json').then((res) => res.json());
}
1
2
3
4
5
6
7

由于Web会受同源策略限制,这里在Fw实例化函数里加入以下逻辑开启CORS,解决跨域问题

const app = new Fw((req, res) => {
  // 开启CORS
  const { method } = req;
  // 允许跨域
  res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
  // 跨域允许的header类型
  res.setHeader('Access-Control-Allow-Headers', '*');
  // 允许跨域携带cookie
  res.setHeader('Access-Control-Allow-Credentials', 'true');
  // 允许的方法
  res.setHeader('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  // 设置响应头
  res.setHeader('Content-Type', 'application/json;charset=utf-8');
  // 对预检请求放行
  if (method === 'OPTIONS') {
    res.statusCode = 204;
    res.end();
  }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

这样简单的前后端逻辑就都写好了,下面就是一键启动

timec page
1

# 最后

由于每天空闲时间有限,本文就先到这,下一期将继续完善timec page指令

如果读者还感觉意犹未尽,敬请期待后续更新,或持续关注一下仓库 (opens new window)的状态

欢迎评论区提需求,交流探讨

本系列会不断的更新迭代,直至产品初代完成

  • 仓库地址 (opens new window)
Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34