基于 Node.js 构建简单的 Web 开发框架 —— Libird

21 Feb 2017

Libird ? 这是什么鬼 ~

简单地说,是基于 Node.js 平台的 Web 开发框架。 主要是对 Node.js 的 http 模块进行封装,提供静态资源服务、自定义路由和缓存, 目前的功能还比较有限,还在持续完善中。

缘由

Q: 为什么要开发 Libird 呢?

A: 虽然接触 Node.js 有一小段时间了,不管是实习做项目还是平时练习做个人项目,但有时候总觉得懵懵懂懂理解不深。比如之前写的个人项目邮订阅,借助 了 Node.js 的express 框架,利用 express-generator 生成项目的整体骨架,再按照express 提供的各种 API 实现路由等需求。框架让开发变得方便快捷,虽然用起来快,但问题在于只知其然不知其所以然,有时候都不知道背后发生了什么,内心 OS 这里那里为什么要那样写。

所以,最初的想法就是试着自己开发一个简单的框架,重构邮订阅项目,摆脱项目中对 express 的依赖。

开发历程

Step1: 理解网络编程

  • Socket
    一般翻译为套接字,应用程序通常通过 Socket 向网络发出请求或者应答网络请求。常用的 Socket 类型有两种:流式 Socket 和数据报式 Socket。前者是一种面向连接的Socket,针对于面向连接的 TCP 服务应用;后者是一种无连接的 Socket,对应于无连接的UDP服务应用。
  • Tcp
    Transmission Control Protocol 传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议。建立连接时三次握手👋(即客户端发出 SYN 连接请求后,等待服务器端回答 SYN+ACK,并最终对服务器端的 SYN 执行 ACK 确认),终止连接时四次挥手✋。
  • Http
    超文本传输协议, 是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。

✨解读三者的关系

Socket 可以理解成通信管道,代表的是客户端和服务器端的一个通信进程,双方进程通过Socket 进行通信, 而通信的规则采用指定的协议。Tcp 是传输层的协议,通过 Socket 可以创建 Tcp 连接,但是 Tcp 只是实现了数据的传输,比如,浏览器接收到一连串数据的时候可能一脸懵心想这是什么鬼然后傲娇地断掉连接。所以,除了传输层协议,还需要像 Http 这样的应用层协议,为的是客户端收到数据时能够按照协议识别和解析数据,这样客户端和服务器端才能够继续友好地谈笑风生。

Step2: 静态资源服务器

在简单理解网络编程的一些基础知识后,接下来就是由易到难进行开发。首先要实现的是静态资源服务器,以前在本地开发时用过 python -m SimpleHTTPServerecstatic 来启动简单的 Web Server。

这一步需要实现能够通过本地IP 和指定端口号来访问邮订阅项目中的静态文件。

Step3: 路由

实现基本的静态资源服务后,下一步就是支持路由配置了。对于邮订阅项目而言,涉及到的接口不多,主要是和获取展示信息相关的接口以及和用户相关的接口(登录、注册等)。接口的请求方式是最常用的 GET 和 POST 。在重构前用的是 express 的路由配置,这一步就是要将其替换掉,实现前后端数据交互让页面可以正常显示。

Step4: 缓存

完成上面步骤后,还遗留一个问题,就是缓存。正如前面提到,Http 是一种无状态的协议,所以需要借助缓存来判断用户的登录状态。

以上,Libird 已支持 邮订阅 现有的功能。

Libird 用法

这一部分请戳 GitHub README

结语:收获和感悟

  • 网络编程的知识可以写成厚厚的几本书,目前我也只晓得其中的零零星星,以前觉得比较抽象,这次通过开发 Libird 加深了一些理解,对于个人而言算是一次里程碑式的进步吧。
  • Libird 是我发布的第一个 npm 模块。尚有许多不足,仍待持续改进,也希望今后能发布更多模块,加油💪。
  • 目前把邮订阅中的 express 换成 Libird了,邮订阅之前用的数据库是 Redis,最近在学习 MySQL,刚好可以实践演练把邮订阅的数据库换成MySQL,算是近期的一个学习任务。