前言
这是一个关于KOA的内部分享交流讲稿,简述了KOA的一些特点及逐步搭建一个简单的SSR架子的过程。
内容收集自度娘,希望阅读下文的兄dei有所收获。
前置知识
- node
- ES6
讲稿
part0 Koa简介及分享内容介绍
Koa -- 基于 Node.js 平台的下一代 web 开发框架,它是由 Express 原班人马打造的,特点:优雅、简洁、灵活、体积小。
Why Koa
为什么我们选择用Koa呢?这需要从两方面谈起
-
第一点,是我们需要SSR(服务器端渲染)所以需要node的web应用框架
现在我们的wap端用的是vue技术栈做的单页面应用,它的优点是:
1、页面跳转不需要刷新,用户体验流畅。
2、前后端只需要用API交互,实现前后端分离。
3、实现前端页面路由功能,页面的拼接、显示逻辑均在客户端完成,减轻服务器压力。
但是,单页面应用有个不能回避的问题,就是SEO(Search Engine Optimization):搜索引擎优化不友好。
PC端需要通过搜索引擎做入口,所以需用到SSR的项目架构。
-
第二点,是在web应用框架中,Koa比较符合我们项目的体量, 市面上主流框架有三种,hapi express koa ,还有一些是经过一些封装和定制的框架,例如:eggjs等。
eggjs的功能很强大,有很多功能,多到有些根本用不着,从而导致这个框架太重。
koa是express的原班人马打造,属于对express的升级。也是现在社区比较热门的web框架,因此我们选择了Koa。
What we talk about
这次的分享,会从以下几点开展
1.介绍基本用法。 首先,我们跑起一个最基本的Koa应用,实现在浏览器显示hello world。
2.介绍上下文对象。 Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。
3.介绍Koa的中间件(middleware) 这是 Koa 的最大特色,也是最重要的一个设计,Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的。
4.介绍Koa获取请求后的一些处理。 包括路由、解析数据、鉴权
5.介绍Koa对静态资源的处理
6.介绍Koa如何搭配模板引擎
7.最后,因为node是跑在服务器上,所以介绍一下性能优化与安全相关的内容
part1 基本用法(手把手教你写hello World)
- 第一步,我们首先检查node的版本。 Koa是node的一个web应用框架,首先要检查是否已经安装了node,因为Koa需要支持async方法,所以node版本要大于7.6
- 第二步,安装Koa。 先npm init 初始化包管理配置文件,再npm install koa 下载koa的资源包,
- 第三步,编写入口文件脚本。 先require引入koa,new一个实例,listen3000端口。
- 最后启动服务,打开网页。 就可以看页面请求localhost:3000,Koa接受到请求后,返回Hello World!的内容。
part2 上下文(context)
介绍
- 我们接收到客户端的请求,需要根据请求的内容做相应的操作,增删改查数据、返回页面等等。
- Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。
比如:
- 获取、设置cookies
- 获取request headers,设置respond headers
- 获取请求源、请求协议
- 设置响应状态、设置缓存字段等
这里Koa推荐ctx.state这个命名空间,可用于通过中间件传递信息和前端视图。
代码展示
每个向Koa发起的请求都将创建一个 Context 上下文对象,并在中间件中作为接收器引用,一般用 ctx 标识符,如以下代码片段所示:
这是在控制台打印出来的ctx信息,有各种请求的相关信息
part3 中间件(Middleware)
介绍
- Koa 的最大特色,也是最重要的一个设计,就是中间件(middleware),Koa 应用程序就是一个包含一组中间件函数的对象;
- 每个中间件默认接受两个参数,第一个参数是 Context 对象,第二个参数是next函数;
- 中间件是按照类似堆栈的方式组织和执行的。我们看这个中间件执行顺序GIF。程序由上到下执行,在中间件中遇到next(),就将执行权移交给下一个中间件。当最后一个中间件执行完成,这里一般是向页面返回数据后。中间件就往回继续执行,直到返回第一个中间件。
- 就像这个洋葱图一样,请求从左至右。所有的请求经过一个中间件的时候都会执行两次,对比 Express 形式的中间件,Koa 的模型可以非常方便的实现后置处理逻辑;
对比 Koa 和 Express 的 Compress 中间件就可以明显的感受到 Koa 中间件模型的优势。
koa-compress for Koa. https://github.com/koajs/compress/blob/master/index.js
compression for Express. https://github.com/expressjs/compression/blob/master/index.js
在demo中,我们利用这个特性可以写个统计请求处理时间的中间件
这里需要注意的是,node里面是充满异步的世界,因此,在中间件里,我们使用async 函数(generator函数的语法糖)并 await next(),实现等待异步
中间件实现简易路由
- koa是个极简的web框架,简单到连路由模块都没有配备,我们先来可以根据ctx.request.url或者ctx.request.path获取用户请求的路径,来实现简单的路由。
- 但当项目庞大起来时,手写这种路由时就变得繁琐,我们一般用对应的路由中间件koa-router来对路由进行控制。
part4 请求处理(request)
- 这里主要说一下KOA如何处理路由、数据解析、鉴权。
Koa-router
这里首先说一下路由
- 刚刚说中间件的时候,我们手动实现了一个简单的路由功能,但实际项目中,我们会借助koa-router这个中间件
- 一般在项目中,我们会这样组织代码
- app.js是项目的入口文件,在app.js中import路由文件,并注册路由信息;
- 路由文件写在routes文件夹下,用router实例下的get、post等方法,匹配请求;
- 根据匹配到的路径,调用到controller.js的不同方法,渲染页面或返回数据;
- 如果有复杂的异步业务操作,我们再抽离到service文件中。
koa-bodyparser
- koa.js并没有内置Request Body的解析器,当我们需要解析请求体时官方提供的koa-bodyparser是个很不错的选择,它支持form、json、text等格式的请求体。
- bodyparser比较简单,直接引入进来,use一下就可以。可选的配置有:允许的类型,编码方式,请求体大小等。一般配置一下enableTypes,其他默认就可以。
koa-session
介绍
HTTP是无状态协议,为了保持用户状态,我们一般使用Session会话,koa-session提供了这样的功能,既支持将会话信息存储在本地Cookie,也支持存储在如Redis, MongoDB这样的外部存储设备。
例子
这里是一个基于cookies的session设置例子,session的内容直接存放在cookies中。
- CONFIG的参数就是设置一个cookie的参数,设置键名、有效时间、HTTP Only、签名加密等等;
- 然后在中间件里就可以读写ctx.session对象,将需要的字段挂上去;
- 下图cookies里的FLB-SESSION就是在中间件中挂在ctx.session的信息;
在实际项目中,会话相关信息往往需要在服务端持久化,因此一般都会使用外部存储来记录session信息。
外部存储可以是任何的存储系统,可以是内存数据结构,也可以是本地的文件,也可以是远程的数据库。
但是这不意味着我们不需要cookie了,由于http协议的无状态特性,我们依然需要通过cookie来获取session的标识(这里叫externalKey)。
part5 静态资源(resource)
网站一般都提供静态资源(图片、字体、样式表、脚本……),我们可以自己实现一个静态资源服务器,但这没必要,因为koa-static模块封装了这部分功能,简单配置后,就可以正常访问静态资源了。
part6 模板引擎(template)
Koa-views
- 在之前的deme中,页面都是通过ctx.body=‘string’的方式,将页面返回到前端。
- 然而真实项目中,我们需要复用代码,就需要用到模板引擎,就如现在pc项目的jsp一样。
- Koa给需要进行视图模板渲染的应用,提供koa-views这个中间件,这个中间件支持ejs, jade,nunjucks等众多模板引擎。
- Koa-views的使用方法,use一下,指定模板所在的路径就可以了。
渲染页面时,调用ctx的render方法,传入对应模板的路径及数据就可以了
Why EJS
为什么我们选用的模板语言是EJS呢
主要是因为,EJS 是一套简单的模板语言,具有以下优点:
- 纯 JavaScript:利用普通的 JavaScript 代码生成 HTML 页面;
- 语法简单: EJS 支持直接在标签内书写简单、直白的 JavaScript 代码。只需让 JavaScript 输出你所需要的 HTML ;
- 执行迅速:基于V8引擎,EJS 能够缓存 JS 函数的中间代码,从而提升执行速度;
- 易于调试:调试 EJS 错误(error)很容易:所有错误都是普通的 JavaScript 异常,并且还能输出异常发生的位置;
- 社区活跃: EJS 背后是一个活跃用户组成的大规模社区,能够为 EJS 的演进提供大力支持。
当然,其他模板语言也有这样那样的有点,但最主要的是,因为ejs的语法与jsp类似,重构搬代码时比较便捷,可以在编辑器写正则替换,提高开发效率
part7 优化与安全(optimize&safety)
因为node跑在服务器上,最后介绍几个优化、安全的中间件
koa-helmet 中间件增加安全HTTP头字段。
koa-compress 压缩启用类似Gzip的压缩技术减少传输内容
koa-logger 提供了输出请求日志的功能,包括请求的url、状态码、响应时间、响应体大小等信息,对于调试和跟踪应用程序特别有帮助
相关资料
demo地址:https://github.com/yejiayuan163/koaDemo
ppt地址:链接:https://pan.baidu.com/s/1Vv_LkaN9kj3IP9rOlZjuMQ 提取码:zhxu
谢谢阅读!!!