狼书(卷2):Node.js Web应用开发(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-14 10:19:45

点击下载

作者:狼叔

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

狼书(卷2):Node.js Web应用开发

狼书(卷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目录结构如下所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载