C/S架构是早期的软件架构,其特征是客户端运行在PC上,数据库运行在服务器上。但是随着互联网点兴起,人们发现C/S架构并不适合Web应用,因为Web应用的更新速度很快,迭代周期很短,而CS架构要求每次迭代都更新客户端,这太麻烦了,于是就有了B/S架构。
Web开发经历的阶段:
- 静态Web页面
- CGI(Common Gateway Interface,用C/C++编写的)
- ASP/JSP/PHP(脚本语言相比C/C++开发效率高)
- MVC(解决了直接用脚本嵌入HTML导致的可维护性差的问题)
- 异步开发、MVVM…
Node.js的优势:
- 前端开发者也可以写后端
- 不用切换语言了
- 速度快,非常快!
目前,在npm上已发布的开源Node.js模块数量超过了47.5万个了!有着数不清的Web框架、ORM框架、模版引擎、测试框架、自动化构建工具。
Web框架 - koa
一开始看到koa有点莫名其妙,但是,其实它就是大名鼎鼎的express框架的下一代框架,为什么express这么成功了,还要有下一代呢?因为express是基于ES5标准的,它要实现异步操作就只有一种方法,就是回调(callback),这种方法在一两个嵌套的时候显得还比较得体,但是多了之后,代码就会很难看了。
koa 1.0
Express团队基于ES6使用了generator编写了koa,但是generator本意不是用来写异步的,Promise才是,但是用Promise来写的话会十分复杂,所以ES7就要诞生了…会有async关键字来完成异步,这样就有了koa 2.0
koa 2.0
koa2完全使用了Promise并且配合async关键字来实现异步。
koa2入门 - 理解middleware
由于koa2是基于ES7,所以Node.js官网的v6.11.3 LTS版本并不支持,只有大于7的Node.js才支持koa2,所以需要下载最新的v8.5.0版本才可以正确使用koa2,否则会因为版本过低而报错。
先来看一个最简单的app.js:
|
|
这里有几个与以往不同的关键词值得关注:
- ctx: 这个其实是context(上下文)的简写,用来存放request和response对象的
- next: 这是koa传入的将要处理的下一个异步函数,这个是由koa控制的
- await: ES7的关键字,这里await next()表示先处理下一个异步函数,然后再干点别的
- async: 也是ES7的关键字,
async是用来将函数标记为异步函数的,而await是用来调用一个异步函数的。
Q: await next()的作用是?
A: koa把很多async函数组成一个任务链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。我们把每个async函数成为middleware,通过middleware的组合,我们可以完成很多有用的功能。
PS: middleware的顺序十分重要,调用app.use()的顺序决定了middleware的顺序。
Q: app.use()的用法是?
A: app.use()加载用于处理http请求的中间件(middleware),当一个请求来的时候,会依次被这些middlewares处理,而处理的顺序就是定义的顺序。官方的文档中有一句话是这样说的:
Since path defaults to “/”, middleware mounted without a path will be executed for every request to the app.
由于路径默认为“/”,没有加载路径的中间件会在app每次被请求的时候执行。
据说理解了middleware,我们就会用koa了!(really?)
ctx还有一些简写的方法:
- ctx.url = ctx.request.url
- ctx.type = ctx.response.type