作者:狼叔
出版社:电子工业出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
狼书(卷2):Node.js Web应用开发试读:
前言
中总有致谢话语,还以为只是出版“套路”。然而今时今日,历经多年的写作,我确确实实要感谢很多人。感谢我的家人,写书会牺牲很多陪伴家人的时间,感谢他们的理解和支持。最难过的是周一到周五,只能看老婆通过微信发来的宝宝的视频,一遍一遍地看,一遍一遍地想哭。
感谢所有推荐本书以及为本书进行技术审校的专家们,若没有他们的帮助,这本书恐怕无法以最佳状态与各位读者见面。他们的宝贵建议使得本书的内容不至于空洞,也让我受益良多。
感谢博文视点的张春雨编辑和孙奇俏编辑,他们一次次地叮嘱我、鼓励我,面对面指导我如何规范写作,这种耐心和包容是极其难得的。这本书在审校初期,有6位出版社的编辑都参与其中。那时我是崩溃的——感觉自己数学不好,常常上面说3项下面列4项;语文也不好,连基本的语句都表达不清,很符合那句玩笑话“你的语文是体育老师教的吧”。我能够想象编辑们在修改书稿之时是多么“痛苦”,因此再次感谢各位编辑,感谢他们的辛苦付出,因为有他们,本书才能够顺利出版。
回想这几年的写作过程,其实几次都想放弃,想将Node.js系统地讲明白,真的不是一件容易的事。可是话都说出去了,不想让一直以来支持我的读者失望,更不能自己“打脸”,所以,这本书最终还是跟大家见面了。感谢各位粉丝在各个技术群里“花式”催书,感谢他们对我的鞭策。
再次感谢所有的小伙伴们。
致所有未见面的读者,但愿狼叔的“碎碎念”,能够带你们打开Node.js世界的大门,领略大前端领域璀璨的星光。
狼叔前言
Koa是下一代Node.js Web框架。所谓的“下一代”是相对于Express而言的。Koa立身于最“潮”的异步流程控制特性,主要用于改进Node.js开发中的回调地狱痛点,可以说Koa是异步流程控制不断演进的必然产物。在所有的Node.js Web框架中,Koa无疑是最耀眼的一个。
Koa的生态是非常健全的,基于Koa编写Web应用可以应对多种场景。如果用得极致,甚至可以基于Koa在前端领域开发各种工具。
本书内容
本书以Node.js下一代Web框架Koa为核心,主要讲解Koa的基础知识、中间件原理和应用场景,旨在向读者展示如何基于Koa编写出更简单、更具工程化优势的Web应用。
本书共分8章,每章的内容简介如下。
第1章 下一代Web框架Koa
本章将介绍Koa框架的入门知识、优势、应用场景,Koa脚手架的编写方式,以及Node.js Web框架的演进过程。基于最新的AVA测试框架编写测试用例也是本章非常有特色的一节。
第2章 Koa核心扩展机制:中间件
本章将介绍Koa的核心中间件原理,以及Koa中常用的中间件:路由、视图、静态服务模块等。中间件机制是Koa的核心内容,因此本章内容非常重要。
第3章 HTTP必知必会
本章将介绍请求响应模型,也将对HTTP和HTTPS进行讲解,同时以mini-proxy和hiproxy为核心对前端最常用的代理进行讲解。
第4章 Koa练习
本章将结合第3章的HTTP相关知识进行Koa框架内置方法的练习,比如地址解析、参数获取、body解析、API开发,还将介绍各种测试模块和工具软件的用法。
第5章 数据库基础
本章将介绍 Node.js 数据库选型和 MVC 模型层的用法,以及使用 Mongoose 模块操作MongoDB的方法,其中涉及Mongoose中的一些进阶技巧:模型扩展、虚拟属性、回调钩子和插件机制。
第6章 数据库进阶
本章将在第5章的基础上介绍数据库中的进阶技巧:分页、关联查询、事务、性能调优等。通过本章大家能够对Node.js数据库选型掌握得更好。
第7章 前端视图模板
本章将从public目录讲起,介绍前端相关知识,主要涉及模板编译原理、Webpack进阶知识。本章还将介绍前后端分离和服务器端渲染的演进,并提出对未来Serverless环境下前端渲染层的见解。
第8章 项目实战
本章将以CNode项目为核心,介绍基于Egg.js框架的项目代码,还会介绍基于Docker快速开发Node.js Web应用的方法。
本书中的各章内容基本是相互独立的,因此各位读者可以挑选自己感兴趣的章节阅读。这本书是《狼书》系列图书的第2卷,第1卷主要介绍Node.js基础知识,第3卷主要介绍Node.js高级应用。3卷搭配阅读,效果更好。
目标读者
本书的目标读者有以下3类。
○ 正在学习JavaScript开发,对JavaScript语言有基本的了解和熟悉度,且希望能够了解JavaScript发展情况的人。
○ 正从事JavaScript开发相关工作,熟悉JavaScript的基本开发要领,在日常工作中经常接触Node.js,想要深入了解Web应用、BFF、API代理等内容,以进一步提升自我的Web工程师(此处不区分前端与后端)。
○ 具有极客精神,想要深入研究JavaScript语言及Node.js的全栈工程师。
同时,本书也适合正使用其他编程语言(如Go、PHP、Python、Ruby、Java等)进行Web开发的工程师阅读、学习。
阅读准备
要想运行本书中的示例,需要安装以下系统及软件。
○ 操作系统:推荐Linux,以及macOS 10.9或以上版本,使用Windows操作系统可能会在运行示例时报错。
○ 浏览器:Google Chrome、Safari、Firefox、Internet Explorer 11、Windows Edge。
○ 运行环境:以Node.js 8.6版本为主。
联系作者
由衷地感谢你购买此书,希望你会喜欢它,也希望它能够为你带来你希望获得的知识。虽然我已经非常细心地检查了书中的所有内容,但仍有可能存在疏漏。若你在阅读过程中发现错误,在此我先表示歉意。同时欢迎你对本书的内容和相关源码发表意见和评论。你可以通过我的私人邮箱i5ting@126.com与我取得联系,我会一一解答你的疑惑。
我的更多联系方式如下,大家可通过任意方式与我联系。
○ 个人主页:http://i5ting.com
○ GitHub:https://github.com/i5ting
○ Twitter:https://twitter.com/i5ting
最后送给各位读者一句话,也是狼叔常说的——少抱怨,多思考,未来更美好!
读者服务
微信扫码回复:35906
● 获取博文视点学院20元优惠券
● 获取免费增值资源
● 加入读者交流群,与更多读者互动
● 获取精选书单推荐第1章 下一代Web框架Koa
Koa是Node.js社区公认的下一代Web框架,那么它究竟是一个怎样的Web框架,有哪些优点?与老牌的Express相比,优势有哪些呢?本章是Koa框架的入门部分,希望能够带你走进丰富多彩的Koa世界。
本章的主要内容如下。
○ 了解Koa框架。
○ 学会koa-generator的用法。
○ 掌握Node.js Web框架的演进过程。
市面上的教程和图书以讲解Express框架的为多,如果你有Express开发经验将会很好,因为本书会对比Express用法进行讲解;如果你没有Express开发经验也没关系,Koa足够简单,相信你很快就可以掌握。1.1 Koa简介
Koa是Node.js的下一代Web框架。所谓的“下一代”是相对于Express而言的。Koa立身于最“潮”的异步流程控制特性,主要用于改进 Node.js 开发中的回调地狱痛点,可以说 Koa是异步流程控制不断演进的必然产物。在所有的Node.js Web框架中,Koa无疑是最耀眼的一个。
Koa是由Express原班人马打造的,他们的初衷是使Koa成为一个更小、更健壮、更富有表现力的Web“微”框架,进而实现使用Koa编写Web应用,通过组合各种更高级的异步流程控制中间件,来免除重复烦琐的回调函数嵌套,并极大提升常见错误的处理效率。
Koa的代码量非常少,大约600行,是一个极轻量的优雅框架,这使得编写Web应用(尤其是开发基于Koa的Web应用)变得更得心应手。我们可以把它理解成一个基于http模块进行封装的、提供中间件写法的微内核模块。Koa约定了中间件写法,能够完成Web应用里的所有需求。由于Koa本身没有内置任何中间件,所以称之为Web框架并不完全准确,用“微”框架或者“内核”模块来描述它更合适。
目前Koa主要有两个版本:v1.x(统称为v1)和v2.x(统称为v2)。两个版本的核心API基本无差异,其他方面的差别如下。
○ Koa v1是基于ES6 Generator的。
○ Koa v2正式版本发布前,可通过koa-convert支持3种中间件写法,更现代、更时尚。
○ Koa v2正式版本发布后,主打async函数,要求使用Node.js v7.6以上版本。
○ Koa v1使用隐式的this作为上下文,而Koa v2则使用显式的ctx作为上下文,语义更清晰。
在2017年3月,Koa v2.0正式发布,可以说Koa v2.0和async函数的结合开启了Node.js Web开发的新时代。1.1.1 应用场景
Koa是Web开发微框架,其应用场景如表1-1所示。表1-1续表
基本上,我们见到的所有Web应用场景都可以使用Koa框架来实现。这里要强调一下,只通过Node.js也是可以完成所有开发的,从数据库操作到RPC服务,再到HTTP和API服务,尽管这些都是Node.js擅长做的事情,但在基础设施完备度、功能成熟度等方面不见得有绝对优势,所以合理地使用各种技术并发挥其优势是极其重要的。笔者一直相信Node.js在后端领域必有一席之地,原因很简单,其成熟度在提高,普及度也越来越高,而且通过前端和API代理层的渗透,在微服务架构下所有语言的机会都是一样的,尤其是快速高效的开发体验和Koa这样优秀的Web框架,一定会让Node.js脱颖而出!1.1.2 开发要点
Koa本身比较简单,但要想使用好Koa,我们需要掌握以下开发要点,如图1-1所示。
○ Koa中间件。
○ ES6语法:Koa是基于Node.js v4以上版本进行开发的,所以对ES6语法支持得非常好。
○ HTTP基础。
○ 异步流程控制:推荐顺序是,async函数→Promise→Generator。
○ 数据库操作:几乎所有的Web应用都涉及操作数据库,所以掌握数据库知识非常重要。数据库一般分为关系型数据库和非关系型数据库。
○ API接口开发。图1-11.1.3 Koa入门
Koa v2的核心是使用面向更新特性的async函数的中间件,其正式版本发布前后性能略有不同。
○ 正式版本发布前:支持3种中间件写法(Promise、Generator、async函数)。
○ 正式版本发布后:推荐使用ES2017的async函数作为中间件。
从发布前支持3种中间件写法,我们可以看到Koa v2对通用性的思考是非常深刻的。在正式版本发布之后,Koa小组直接将GitHub上的说明改为“Expressive middleware for Node.js using ES2017 async functions”,这是一个非常明确的态度,表明Koa的定位为下一代Web开发框架,将一如既往地支持新特性。我们在《狼叔(卷1):更了不起的Node.js》中介绍过异步流程控制的演进过程,可以说 async 函数确实是目前最好的异步流程控制解决方案,所以 Koa 和 async函数的结合近乎完美。
➘ 你好,Koa
让我们来看看最“潮”的Koa v2(基于async函数的中间件)的基本写法,代码如下。
接着,在app.js里键入如下代码。
执行前一定要确保你的Node.js是v7.6以上的,否则无法直接执行带有async函数的代码。
下面对Koa代码中的要点进行说明。
○ 从表面上看,中间件有变化,之前支持ES6 Generator,现在支持async函数+箭头函数,即async (ctx,next)=>{},这样能使语义更清晰。
○ 参数有变化,之前只有 next 参数,现在又多了一个上下文 ctx 参数。在之前的 ES6 Generator中间件里只能使用隐式的this作为上下文,而在async函数中可以使用显式的ctx作为上下文,更加友好。
访问http://127.0.0.1:3000/,控制台中日志输出如下。
从日志中我们可以看出代码执行规律,具体如下。
○ 先经过logger中间件:[logger middleware] before await...。
○ 然后跳转到[response middleware] response...。
○ 最后执行[logger middleware] after await...。
这3处日志输出很明显是在logger中间件的await next()代码前后进行处理的,通过await next()将执行权转交给下一个中间件,即response中间件,于是代码就借助async函数变成顺序执行了,这就是Koa v2带给我们的最直观的变化。
➘ 为什么Koa v2中要新增一个ctx参数
Koa v2中新增一个ctx参数的最主要原因是,在编写Koa App 时使用了async箭头函数,示例如下。
在这种情况下,使用 this 是万万不能的。因为箭头函数是定义时绑定的,this 指向箭头函数外部,而不是运行时的对象。
➘ Koa v1和Koa v2的用法差异
在Koa v1里,初始化app对象的方式和Express是一样的,具体如下。
在Koa v2里,我们使用面向对象的写法,需要对Koa类进行实例化后才能获得app对象,具体如下。
下面我们从源码层面进行对比,找出Koa v1和Koa v2在用法上的差异。
1.Koa v1示例代码
2.Koa v2示例代码
通过上面的源码对比,很明显可以看出,Koa v1对外导出的是函数,而Koa v2对外导出的是类,需要通过new这个关键字来进行实例化。另外,值得注意的是,在Koa v2源码里,只有Application进行了类化,其他的仍保持之前的风格,这大概是因为还没有必须修改的必要。1.1.4 为什么选择Koa
我们为什么在众多框架中选择Koa呢?理由大概如下。
○ 用async函数做异步流程控制时,代码更容易理解。
○ 错误处理干干净净。无论是async函数还是Promise规范都能非常好地处理异常,另外Koa是继承自Event的,结合ctx里的一些API能够更简单地处理错误。
○ 具有优雅的回形针中间件机制。通过更少的代码可以完成更多的工作,尤其是能对响应部分进行拦截,这是Express等框架无法做到的。
○ 性能非常好,比Express要好。
○ Koa 核心代码量比较少,易于定制,易于在其上开发各种 Web 框架。比如,ThinkJS和Egg.js都是以Koa v2作为内核模块开发的著名Web框架。
○ 社区生态逐渐完善。在2015年其中间件数量还不多,但现在已经非常多了。
○ 国内外很多公司都已经大量应用Koa了,目前Node.js的首选Web框架是Koa。
○ 拥有Egg.js(基于Koa的成熟的企业级Web开发框架),拥有庞大的插件生态。
○ 拥有MidwayJS。它基于Egg.js生态,使用TypeScript编写,提供IoC容器,是面向未来的框架。1.2 Koa脚手架
koa-generator是用于生成Koa项目骨架的生成器,虽然这个生成器比较精简,但它结构十分清晰,足以满足一般的开发需求。
很多读者非常熟悉 Express 框架(以前很多图书、开源项目都是基于 Express 的,Express曾是Node.js里使用最多的Web框架),它和Koa用法一致,因此习惯Express的人一般都能接受Koa。当然,新手也不用怕,Koa非常简单。express-generator和koa-generator功能一样,适合初学者,有基本的目录结构和中间件,可以满足一般性的开发需求。
express-generator提供的功能如下。
○ 生成项目骨架,集成必要的中间件。
○ 约定目录结构。
○ 支持CSS预处理器。
koa-generator提供的功能如下。
○ 生成项目骨架,集成必要的中间件。
○ 约定目录结构(和express-generator约定的结构一模一样)。
两个生成器共同支持的项目骨架结构描述如下。
○ app.js为入口。
○ bin/www为启动入口。
○ 支持静态服务器,即public目录。
○ 支持routes路由目录。
○ 支持views视图目录。
○ 默认将Pug(之前名字是Jade)作为模板引擎。
koa-generator支持Koa v1和Koa v2,安装后,可以分别使用koa和koa2两个命令提供脚手架功能,具体实现如下。1.2.1 安装Koa生成器
koa-generator支持Koa v1和Koa v2,安装后,可以分别使用koa和koa2命令创建Koa项目模板,以koa2为例,代码如下。1.2.2 创建Hello world
在Koa v2中,如果想创建Koa v1项目,只需要把koa2命令换成koa命令即可,示例代码如下。
上面的命令行所产生的代码结构和express-generator生成的代码结构是一模一样的,这对于熟悉express-generator的读者而言会更加容易接受。本身这种结构也非常经典,对于理解和学习koa-generator是非常好的方式。
接下来切换到helloworld目录下并安装依赖模块,命令如下。
启动命令如下。
此时,我们即可访问浏览器。1.2.3 目录解析
使用koa-generator生成的目录结构如下。
对上面的目录结构说明如下。
○ app.js为入口。
○ bin/www为启动入口。
○ 支持静态服务器,即public目录。
○ 支持routes路由目录。
○ 支持views视图目录,Pug为模板引擎。
➘ package.json
package.json是Node.js模块定义的核心配置文件。接触新项目的第一件事情就是打开该文件,了解模块的各个属性,比如名称、版本、依赖模块、开发方式等,文件内容如下。
package.json文件里包含了4个npm scripts脚本,分别介绍如下。
○ npm start是开发阶段使用的脚本,使用时代码会发生变动,需要重启Node.js进程。
○ npm run dev也是开发阶段使用的脚本,使用时代码会发生变动,nodemon会自动重启Node.js进程。
○ npm run prd是产品环境使用的脚本,通过pm2来启动工程,默认按照CUP核数来启动对应的进程数,是目前最流行的方式。
○ test只会打印出未实现日志,和Express里的用法是一样的。
关于依赖模块的说明,如表1-2所示。表1-2
➘ 入口文件bin/www
我们先来看一下入口文件的核心代码,具体如下。
bin/www文件中的内容和Express的bin/www文件中的内容是一样的,唯一不同的是Express里的app实例返回的是function(req,res){},而Koa里的app.callback()返回的是function (req,res){},所以想在http.createServer里启动Koa,就必须将app修改为app.callback()。
除在http.createServer启动时需要进行以上修改外,对于Express里测试API的supertest测试库,也要求进行一样的修改,一定要注意Express和Koa之间的差异。
➘ 核心文件app.js
app.js是Koa的核心文件,主要包含4个部分,分别如下。
○ 中间件
○ 路由
○ 静态服务器
○ 视图
app.js文件的代码如下。
在以上代码中,中间件的名称、用途和加载顺序如表1-3所示。表1-3
➘ 路由位于routes目录下
路由本身也是中间件,应位于独立目录routes下面,这样可以使路由的职责更清晰。这里以routes/index.js为例,给出路由样板结构,具体如下。
以上路由提供了3个示例,分别是视图渲染、JSON API和字符串。
1.视图渲染
2.JSON API
3.字符串
你一定已经发现,赋予ctx.body不同类型的值时会返回不同的结果,比如,为ctx.body赋值JSON对象时,服务器会返回JSON接口,为ctx.body赋值字符串时,服务器会返回HTML文本。另一个要点就是,ctx.render 是因为添加了koa-views 中间件而绑定到ctx上的,原本的ctx上是没有render函数的,也就是说,我们可以通过中间件在ctx上绑定我们要使用的功能。
➘ 静态服务器位于public目录下
静态服务器主要用于存放静态资源,比如HTML、CSS、JavaScript、图片等,功能和Nginx、Apache等软件是一样的。这里的koa-static是一个用于文件托管的中间件,是基于koa-send模块的高级封装。public目录结构如下所示。
试读结束[说明:试读内容隐藏了图片]