编辑推荐

√狼叔千日奋笔,狼书一啸横空:Node.js首席布道师+一手创办垂直公号“Node全栈”+CNode技术社区活跃贡献者,艳压群芳,名动八方。

√狼书三卷一出,Node再无遗册:《狼书(卷1):更了不起的Node.js》+《狼书(卷2):Node.jsWeb应用开发》+《狼书(卷3):Node.js高级技术》,百万宏篇,精华尽现。

√Node纵横全网,狼书更有良方:横跨前后端的深厚功底+阿里|优酷|去哪儿网高端项目练级+Web|移动|服务端架构担当,远非寻常,超出想象。

√狼书新老咸宜,Node进行到底:面向新人的超完整知识体系+面向进阶人群的超实用高级技巧+面向专家人群的超深邃原理剖析,遍布巧思,直指精髓。

内容简介

Node.js开发简单,性能极好,一经发布便成了明星级项目。随着大前端领域的蓬勃发展,跨平台开发、API构建、Web应用开发等场景愈加常见,Node.js也成为大前端开发的必备“神器”。

狼书(卷1):更了不起的Node.js》以Node.js为主,讲解了Node.js的基础知识、开发调试方法、源码原理和应用场景,旨在向读者展示如何通过新的Node.js和npm编写出更具前端特色、更具工程化优势的代码。《狼书(卷1):更了不起的Node.js》还讲解了Node.js中相当核心且复杂的异步流程控制,展望了未来异步流程的发展方向,非常适合大前端领域及后端领域的测试、运维及软件开发从业者阅读、学习。

作者简介

桑世龙狼叔(网名i5ting)现为阿里巴巴前端技术专家,前去哪儿网前端架构师,Node.js技术布道者,Node全栈公众号运营者。目前主要关注技术架构和团队梯队建设方向。即将出版《更了不起的Node.js:将下一代Web框架Koa进行到底》一书。

精彩书评

对所有优秀的程序员来说,写书都是一件辛苦的事,所以愿意在这方面投入精力的程序员基本上都是有情怀的。狼叔花了三年多的时间写成了这《狼书(卷1):更了不起的Node.js》,其中既包含Node.js基础知识,也包含宝贵的工程实践,为所有从业者提供了参考,期待狼叔能够一直写下去。

——极客时间《重学前端》专栏作者

程邵非(winter)

这《狼书(卷1):更了不起的Node.js》是狼叔多年技术心血的结晶,它很好地向读者介绍了Node.js的发展历程、基本特性、编程方法、应用场景和核心模块。无论你是想入门Node.js,还是想进行企业级深度实践,都可以参考这《狼书(卷1):更了不起的Node.js》。只要你热衷于Node.js,相信这《狼书(卷1):更了不起的Node.js》便值得你阅读!

——腾讯技术总监、腾讯IVWEB团队负责人

河伯

这不是一本简单的Node.js入门书,而是一本纵观Node.js发展历史、带你领略Node.js底层风采,并且能对你的Node.js知识体系进行查漏补缺的书。在如今各式各样的Node.js书籍中,这样的好书真的非常难得。

——《Node.js:来一打C++扩展》作者

死月

狼叔是国内比较知名的Node.js技术布道者,为Node.js在中国的发展做出了巨大的贡献。《狼书(卷1):更了不起的Node.js》中有既对Node.js知识点的详细介绍,也有对狼叔多年宝贵经验的深度总结,非常值得大家阅读、学习,建议各位持卷品读。

——ThinkJS框架作者

李成银

两年前曾和狼叔聊起过一个颇为枯燥的技术问题,当时他把那个问题解释得非常精彩,让我印象颇深。所以得知狼叔在写书时,我充满了期待。一方面,我相信狼叔一定能把严肃的技术问题讲得通俗易懂;另一方面,要想将Node.js生态讲得透彻,狼叔是优秀人选。

——ioredis作者、《Redis入门指南》作者

李子骅(luin)

目前Node.js发展十分迅速,《狼书》系列图书的面世无疑为Node.js世界又注入了新的活力。这本卷1比较系统全面地介绍了Node.js的核心体系,如果你想深入学习Node.js的核心原理并掌握使用Node.js开发大型系统的要诀,那么这《狼书(卷1):更了不起的Node.js》非常值得你精读。

——Flarum中文社区创始人

迷渡(justjavac)

目录

第1章Node.js初识1

1.1引子1

1.2JavaScript7

1.3什么是Node.js9

1.3.1Node.js概述9

1.3.2Node.js的特点12

1.3.3Node.js的应用场景16

1.4本章小结18

第2章Node.js安装与入门19

2.1安装Node.js19

2.1.13m安装法19

2.1.2nvm20

2.1.3npm26

2.1.4nrm32

2.1.5从源码进行编译35

2.1.6状态理论35

2.2HelloNode.js!36

2.2.1HelloWorld36

2.2.2HelloCommonJS37

2.2.3HelloHTTP38

2.3编辑器与调试41

2.3.1IDE/编辑器41

2.3.2VSCode42

2.3.3调试45

2.4本章小结52

第3章更了不起的Node.js53

3.1架构升级53

3.1.1从LAMP到MEAN54

3.1.2前后端分离55

3.1.3页面即服务58

3.1.4场景决定选型59

3.2贯穿开发全过程60

3.2.1静态API60

3.2.2现代Web开发63

3.2.3后端开发68

3.3更多乐趣78

3.3.1更多应用场景78

3.3.2C/C++扩展79

3.3.3团队优化80

3.3.4全栈之路81

3.4本章小结85

第4章更好的Node.js86

4.1选择86

4.1.1语法可难可易86

4.1.2开发大型软件90

4.1.3特定场景下的快速开发91

4.2单线程会“死”吗92

4.2.1uncaughtException93

4.2.2异常捕获94

4.2.3forever95

4.2.4小集群:单台服务器上多个实例95

4.2.5大集群:多台机器96

4.3为Node.js正名98

4.3.1版本帝?98

4.3.2已无性能优势?99

4.3.3异步和回调地狱?100

4.3.5技术栈演进101

4.4更好的实践102

4.4.1ES.next102

4.4.2类型系统110

4.4.3更好的npm替代品——Yarn111

4.4.4多模块管理器Lerna113

4.5本章小结114

第5章Node.js是如何执行的115

5.1准备115

5.1.1编辑器116

5.1.2编译117

5.1.3调试118

5.2编译步骤120

5.2.1configure120

5.2.2make130

5.2.3makeinstall132

5.3从入口开始135

5.3.1核心流程137

5.3.2构造process对象139

5.3.3LoadEnvironment147

5.3.4bootstrap_node.js148

5.3.5EventLoop启动方法160

5.4API调用过程162

5.4.1相关的引用163

5.4.2FSReqWrap163

5.4.3核心open方法164

5.4.4src/node_file.cc164

5.5事件循环机制167

5.5.1概览167

5.5.2生命周期169

5.5.3microtask和macrotask170

5.5.4process.nextTick(callback)173

5.6本章小结175

第6章模块与核心176

6.1CommonJS规范176

6.1.1简介176

6.1.2核心技术181

6.2Node.js模块189

6.2.1从源码分析实现原理189

6.2.2从Node.js代码执行开始191

6.2.3深入理解模块195

6.2.4全局对象205

6.2.5Node.js模块详解215

6.3未来展望:ES模块220

6.3.1ES模块入门221

6.3.2模块导入222

6.3.3模块导出222

6.3.4ES模块示例223

6.3.5兼容性更好的@std/esm224

6.4本章小结224

第7章异步写法与流程控制225

7.1异步调用226

7.1.1异步与同步226

7.1.2浏览器中的异步227

7.1.3Node.js异步原理227

7.1.4API和示例229

7.1.5代码优化231

7.2Node.js自带的异步写法236

7.2.1错误优先的回调方式236

7.2.2EventEmitter240

7.2.3该选择哪种风格的写法247

7.3更好的异步流程控制248

7.3.1回调地狱248

7.3.2Thunk252

7.3.3Promise254

7.3.4Generator276

7.3.5async函数282

7.4本章小结287

前言/序言

狼书(卷1):更了不起的Node.js》从2015年10月开始写作。

在那之前,我还在天津创业,顶着CTO的头衔干着各种最基础的编码工作。由于公司在天津的位置很偏僻,所以公司招人成了一个大问题。更要命的是,创始人没有工资可拿,现在想想只能说是情怀在支撑我吧。

公司招人不便,那就只能想办法把人才从北上广拉到天津,于是就动了扩大技术影响力的心思——我开始在CNode社区上发帖,后面慢慢尝试做“Node全栈”公众号,效果还不错。我还记得CNode社区管理员、知名Node.js开发者alsotang曾评论过我的一篇文章,说我是Node.js布道者。当时我臭美了很久,之后便自然而然地走上了布道之路。

2015年,我结婚了,财权上交,发觉生活窘迫,又不好意思向老婆要钱,于是便开始在网上教授VSCode,之后我又和极客邦旗下的StuQ合作课程,获得收入的同时又可以进一步扩大技术影响力。而技术影响力扩大的体现就是,我被出版社的编辑发现了。由于早有布道的心思,自然希望能够出一《狼书(卷1):更了不起的Node.js》,于是便开始了写书之旅。

可是写书从来都不是一件容易的事。阅历浅,写不来;无恒心,写不来。从2015年10月到2019年2月,历时三年多,很多朋友催书,以至于我经常在演讲中“自黑”:“我的书从Node.jsv4写到Node.jsv8,然而还没有写完。”与出版社约稿时,Node.js才刚刚发布4.0版本,而2019年年初,Node.js已经发布了11.10版本。《狼书(卷1):更了不起的Node.js》几经修改,最终确定以Node.js的8.0版本为核心版本。虽然后面Node.js更新的版本里又有新功能,但整体来看Node.js的API设计得非常好,几乎都是向后兼容的,所以即使是11.10版本,和8.0版本的差别也不大,而且在《狼书(卷1):更了不起的Node.js》的编辑过程中我又进行了一定的更新,因此不会影响读者阅读和学习。

在这三年多的时间里,Node.js稳定高效地发布了多个版本,国内外的Node.js使用率也渐渐达到了一个前所未有的高度。感谢前端领域的爆发式增长,这极大扩展了Node.js的应用场景,而且新语法、新特性的使用也开始成为大前端开发团队中的标配。

人生之美好就是在苦难之后能够获得成果。写书的过程是痛苦的,但也让我对于“成全别人,才能成就自己”这句话有了更深刻的认识。最开始写书是为了布道,希望更多人能从中受益,没想到最先受益的是自己,通过长时间的积累,我完善了自己的知识体系,受益匪浅。通过与CNode社区、出版社的编辑以及Node.js爱好者们之间的交流,我有了更好的学习机会。通过写书、演讲、组织社区活动,我有了更丰富的人生经历。

以前见到图书的前言中总有致谢话语,还以为只是出版“套路”。然而今时今日,历经三年多的写作,我确确实实要感谢很多人。

感谢我的家人,写书会牺牲很多陪伴家人的时间,感谢他们的理解和支持。最难过的是周一到周五,只能看老婆通过微信发来的宝宝的视频,一遍一遍地看,一遍一遍地想哭。

感谢所有推荐《狼书(卷1):更了不起的Node.js》以及为《狼书(卷1):更了不起的Node.js》进行技术审校的专家们,若没有他们的帮助,这《狼书(卷1):更了不起的Node.js》恐怕无法以最佳状态与各位读者见面。他们的宝贵建议使得《狼书(卷1):更了不起的Node.js》的内容不至于空洞,也让我受益良多。

感谢博文视点的张春雨编辑和孙奇俏编辑,他们一次次地叮嘱我、鼓励我,面对面指导我如何规范写作,这种耐心和包容是极其难得的。这《狼书(卷1):更了不起的Node.js》在审校初期,有6位出版社的编辑都参与其中,那时我是崩溃的——感觉自己数学不好,常常上面说3项下面列4项;语文也不好,连基本的语句都表达不清,很符合那句玩笑话:“你的语文是体育老师教的吧”。我能够想象编辑们在修改书稿之时是多么的“痛苦”,因此再次感谢各位编辑,感谢他们的辛苦付出,因为有他们,《狼书(卷1):更了不起的Node.js》才能够顺利出版。

回想这三年多的写作过程,其实几次都想放弃,想将Node.js系统地讲明白,真的不是一件容易的事。可是话都说出去了,不想让一直以来支持我的读者失望,更不能自己“打脸”,所以,这《狼书(卷1):更了不起的Node.js》最终还是跟大家见面了。感谢各位粉丝在各个技术群里“花式”催书,感谢他们对我的鞭策。

再次感谢所有的小伙伴们。

所有未见面的读者,但愿狼叔的“碎碎念”,能够带你们打开Node.js世界的大门,领略大前端领域璀璨的星光。

狼叔

2019年4月于北京

前言

Node.js诞生于2009年,是由Joyent公司的员工RyanDahl开发完成的,之后Joyent公司一直扮演着Node.js孵化者的角色。由于诸多原因,Ryan于2012年离开了Node.js社区,随后在2015年,由于Node.js的贡献者们在ES6新特性集成问题上产生意见分歧,因此分裂出io.js。

io.js的分裂最终促成了2015年Node.js基金会的成立,同年Node.jsv4.0顺利发布。Node.js基金会的创始成员包括Google、Joyent、IBM、Paypal、Microsoft、Fidelity和Linux基金会,创始成员将共同掌管过去由Joyent一家企业掌控的Node.js开源项目。此后,Node.js基金会发展得非常好,稳定地发布了5.x、6.x、7.x、8.x、9.x、10.x、11.x等多个版本,截止到《狼书(卷1):更了不起的Node.js》完稿之时,最新版本已经是v11.14,最新的长期支持(LTS)版本是v10.15。

Node.js不是一门语言也不是一个框架,它是基于ChromeV8引擎的JavaScript运行时环境,同时结合libuv扩展了JavaScript功能,使得JavaScript能够支持浏览器DOM操作,同时具有只有后端语言才有的I/O、文件读写于操作数据库等能力,是目前使用最简单的全栈式环境。

狼书(卷1):更了不起的Node.js》内容

从整体上来说,《狼书(卷1):更了不起的Node.js》以Node.js为主,首先介绍了Node.js的发展历史,然后简要概括了Node.js的特点和使用场景,之后讲解了Node.js实现过程中的新增内容(如语法、模块、单进程等)的基本用法。读者入门Node.js之后,可以继续从《狼书(卷1):更了不起的Node.js》中了解Node.js的执行原理,深入解读源码。最后,《狼书(卷1):更了不起的Node.js》还讲解了Node.js中非常核心且复杂的异步流程控制,对未来异步流程的发展方向进行了展望。

狼书(卷1):更了不起的Node.js》共分7章,每章的内容简介如下。

第1章Node.js初识

本章介绍了Node.js的一些基础知识,包括什么是Node.js、Node.js和JavaScript的关系、Node.js的特点和应用场景等。

第2章Node.js安装与入门

本章介绍了Node.js安装与使用的基本方法,包括3m(即nvm、nrm、npm)安装法、Node.js基础示例,以及编辑器和调试等内容。

第3章更了不起的Node.js

本章更加详细地介绍了Node.js的各类应用场景,对Node.js的核心作用进行了概括与总结,还对如何成为全栈工程师提供了宝贵建议。

第4章更好的Node.js

本章介绍了Node.js的各种写法,包括单线程与集群,以及各种优秀实践,包括ES语法、多模块管理器Lerna、npm的替代品Yarn等。

第5章Node.js是如何执行的

本章介绍了Node.js的源码构建和调试过程,阐述了Node.js是如何执行的,还介绍了API的调用过程,以及事件循环机制。

第6章模块与核心

本章介绍了Node.js中的CommonJS规范、SDK模块与核心技术,还对未来的ES6模块功能进行了预测与展望。

第7章异步写法与流程控制

本章介绍了异步流程控制的演进过程、Node.js的核心异步写法,以及更好的异步流程控制机制,如Thunk、Promise、async函数等。

狼书(卷1):更了不起的Node.js》中的各章在内容上基本是相互独立的,因此各位读者可以挑选自己感兴趣的章节阅读。这《狼书(卷1):更了不起的Node.js》是“狼书”系列的第1卷,还有第2卷和第3卷稍后会和各位读者见面,内容涉及Web应用和性能优化等,搭配阅读,效果更好。

目标读者

狼书(卷1):更了不起的Node.js》的目标读者有以下三类。

?正在学习JavaScript开发,对JavaScript语言有基本的了解和熟悉度,且希望能够了解JavaScript发展情况的人。

?正从事JavaScript开发相关工作,熟悉JavaScript的基本开发要领,在日常工作中经常接触Node.js,想要深入了解Web应用、BFF、API代理等内容,以进一步提升自我的Web工程师(此处不区分前端与后端)。

?具有极客精神,想要深入研究JavaScript语言及Node.js的全栈工程师。

同时,《狼书(卷1):更了不起的Node.js》也适合正使用其他编程语言(如Go、PHP、Python、Ruby、Java等)进行Web开发的工程师阅读、学习。

阅读准备

要想运行《狼书(卷1):更了不起的Node.js》中的示例,需要安装以下系统及软件。

操作系统:推荐Linux,以及macOSX10.9或以上版本,使用Windows操作系统可能会报错。

浏览器:GoogleChrome、Safari、Firefox、InternetExplorer11、WindowsEdge。

运行环境:以Node.js8.6为主。


其他推荐