KOA入门 - hello World 到 SSR(ppt+demo+讲稿)

前言

这是一个关于KOA的内部分享交流讲稿,简述了KOA的一些特点及逐步搭建一个简单的SSR架子的过程。
内容收集自度娘,希望阅读下文的兄dei有所收获。

前置知识

  • node
  • ES6

讲稿

part0 Koa简介及分享内容介绍

1.png

Koa -- 基于 Node.js 平台的下一代 web 开发框架,它是由 Express 原班人马打造的,特点:优雅、简洁、灵活、体积小。

Why Koa

2.png

为什么我们选择用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

3.png

这次的分享,会从以下几点开展

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)

4.png
  1. 第一步,我们首先检查node的版本。 Koa是node的一个web应用框架,首先要检查是否已经安装了node,因为Koa需要支持async方法,所以node版本要大于7.6
  2. 第二步,安装Koa。 先npm init 初始化包管理配置文件,再npm install koa 下载koa的资源包,
  3. 第三步,编写入口文件脚本。 先require引入koa,new一个实例,listen3000端口。
  4. 最后启动服务,打开网页。 就可以看页面请求localhost:3000,Koa接受到请求后,返回Hello World!的内容。

part2 上下文(context)

6.png

介绍

  • 我们接收到客户端的请求,需要根据请求的内容做相应的操作,增删改查数据、返回页面等等。
  • Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。

比如:

  • 获取、设置cookies
  • 获取request headers,设置respond headers
  • 获取请求源、请求协议
  • 设置响应状态、设置缓存字段等

这里Koa推荐ctx.state这个命名空间,可用于通过中间件传递信息和前端视图。

代码展示

7.png

每个向Koa发起的请求都将创建一个 Context 上下文对象,并在中间件中作为接收器引用,一般用 ctx 标识符,如以下代码片段所示:

这是在控制台打印出来的ctx信息,有各种请求的相关信息

part3 中间件(Middleware)

介绍

9.png
  • 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(),实现等待异步

中间件实现简易路由

10.png
  1. koa是个极简的web框架,简单到连路由模块都没有配备,我们先来可以根据ctx.request.url或者ctx.request.path获取用户请求的路径,来实现简单的路由。
  2. 但当项目庞大起来时,手写这种路由时就变得繁琐,我们一般用对应的路由中间件koa-router来对路由进行控制。

part4 请求处理(request)

  • 这里主要说一下KOA如何处理路由、数据解析、鉴权。

Koa-router

12.png

这里首先说一下路由

  • 刚刚说中间件的时候,我们手动实现了一个简单的路由功能,但实际项目中,我们会借助koa-router这个中间件
  • 一般在项目中,我们会这样组织代码
  1. app.js是项目的入口文件,在app.js中import路由文件,并注册路由信息;
  2. 路由文件写在routes文件夹下,用router实例下的get、post等方法,匹配请求;
  3. 根据匹配到的路径,调用到controller.js的不同方法,渲染页面或返回数据;
  4. 如果有复杂的异步业务操作,我们再抽离到service文件中。

koa-bodyparser

13.png
  1. koa.js并没有内置Request Body的解析器,当我们需要解析请求体时官方提供的koa-bodyparser是个很不错的选择,它支持form、json、text等格式的请求体。
  2. bodyparser比较简单,直接引入进来,use一下就可以。可选的配置有:允许的类型,编码方式,请求体大小等。一般配置一下enableTypes,其他默认就可以。

koa-session

介绍

14.png

HTTP是无状态协议,为了保持用户状态,我们一般使用Session会话,koa-session提供了这样的功能,既支持将会话信息存储在本地Cookie,也支持存储在如Redis, MongoDB这样的外部存储设备。

例子

15.png

这里是一个基于cookies的session设置例子,session的内容直接存放在cookies中。

  1. CONFIG的参数就是设置一个cookie的参数,设置键名、有效时间、HTTP Only、签名加密等等;
  2. 然后在中间件里就可以读写ctx.session对象,将需要的字段挂上去;
  3. 下图cookies里的FLB-SESSION就是在中间件中挂在ctx.session的信息;

在实际项目中,会话相关信息往往需要在服务端持久化,因此一般都会使用外部存储来记录session信息。
外部存储可以是任何的存储系统,可以是内存数据结构,也可以是本地的文件,也可以是远程的数据库。
但是这不意味着我们不需要cookie了,由于http协议的无状态特性,我们依然需要通过cookie来获取session的标识(这里叫externalKey)。

part5 静态资源(resource)

17.png

网站一般都提供静态资源(图片、字体、样式表、脚本……),我们可以自己实现一个静态资源服务器,但这没必要,因为koa-static模块封装了这部分功能,简单配置后,就可以正常访问静态资源了。

part6 模板引擎(template)

Koa-views

18.png
  • 在之前的deme中,页面都是通过ctx.body=‘string’的方式,将页面返回到前端。
  • 然而真实项目中,我们需要复用代码,就需要用到模板引擎,就如现在pc项目的jsp一样。
  • Koa给需要进行视图模板渲染的应用,提供koa-views这个中间件,这个中间件支持ejs, jade,nunjucks等众多模板引擎。
  • Koa-views的使用方法,use一下,指定模板所在的路径就可以了。
    渲染页面时,调用ctx的render方法,传入对应模板的路径及数据就可以了

Why EJS

19.png

为什么我们选用的模板语言是EJS呢
主要是因为,EJS 是一套简单的模板语言,具有以下优点:

  • 纯 JavaScript:利用普通的 JavaScript 代码生成 HTML 页面;
  • 语法简单: EJS 支持直接在标签内书写简单、直白的 JavaScript 代码。只需让 JavaScript 输出你所需要的 HTML ;
  • 执行迅速:基于V8引擎,EJS 能够缓存 JS 函数的中间代码,从而提升执行速度;
  • 易于调试:调试 EJS 错误(error)很容易:所有错误都是普通的 JavaScript 异常,并且还能输出异常发生的位置;
  • 社区活跃: EJS 背后是一个活跃用户组成的大规模社区,能够为 EJS 的演进提供大力支持。

当然,其他模板语言也有这样那样的有点,但最主要的是,因为ejs的语法与jsp类似,重构搬代码时比较便捷,可以在编辑器写正则替换,提高开发效率

part7 优化与安全(optimize&safety)

21.png

因为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

谢谢阅读!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容