猜你喜欢
狼书(卷3):Node.js高级技术

狼书(卷3):Node.js高级技术

书籍作者:狼叔 ISBN:9787121353871
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:7144
创建日期:2023-05-20 发布日期:2023-05-20
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

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

本书聚焦于Node.js高级技术。第1章介绍如何编写npm模块,其中涉及对许多常用模块的解析。第2章介绍如何编写企业级Web开发框架,主要剖析了开发框架的流程。第3章介绍如何构建具有Node.js特色的服务,着重讲解了页面即服务的概念。第4章介绍服务器部署与性能调优的相关知识。第5章介绍TDD和BDD理念,以及如何编写测试用例,同时分享了笔者关于开源和自学的看法。

基于Node.js不断进阶,实现高级应用开发是符合技术趋势的,也是全栈工程师必须掌握的技能。因此,各位大前端领域及后端领域的测试、运维、软件开发从业者都适合阅读本书。

作者简介

桑世龙,狼叔(网名i5ting),现为阿里巴巴前端技术专家,去哪儿网前前端架构师,Node.js 技术布道者,领域头部公众号“Node全栈”运营者。曾就职于多家知名IT企业,从事前端开发、后端开发、数据分析等工作,目前负责公司内的Node.js开发和基础框架开发工作。

编辑推荐

√ Node.js首席布道师+垂直公号“Node全栈”经营者+CNode技术社区活跃贡献者,Node全域导师,狼叔奋笔千日献狼书。

√ 《狼书(卷1):更了不起的Node.js》+《狼书(卷2):Node.js Web应用开发》+《狼书(卷3):Node.js高级技术》,鸿篇巨制,狼书3卷终成Node.js红宝书。

√ 底层代码+工程实践+高级技巧,全线解构,完整贯通从入门、实践到原理的学习要诀。


前言

推荐序1

提起国内的Node.js布道师,我脑海中出现的第一个名字就是狼叔(i5ting)。

狼叔从2015年开始活跃于CNode社区,累计发表文章200余篇,主题丰富多样——Node.js底层原理、npm目录结构改进、前后端分离实践、全栈工程师之路等。这几年间,狼叔同时运营着自己的微信公众号“Node全栈”,笔耕不辍,源源不断地将最新鲜、最“硬核”的资讯分享给国内的开发者们。不得不说,他的这种乐于分享的精神,实属难得。

我与狼叔也是在2015年相识的。2015年是Node.js的普及度呈爆发式增长的一年,但那一年的Node.js还远远谈不上被广泛使用。当时我在阿里巴巴数据平台任职,我们所做的部分项目的JavaScript压缩工具和测试覆盖率工具还是用Java实现的,这在现在看来可以说是非常匪夷所思的,JavaScript工作流中的工具竟然还有用Java而不是用Node.js实现的!

时过境迁,转眼多年过去,JavaScript在大前端领域遍地开花,Node.js也已经被广泛应用于Web开发的方方面面,成了Web开发流程中不可或缺的部分。大家不再怀疑Node.js能不能用,而是开始思考该如何用Node.js实现我们想要的功能。

技术的好与坏,不仅仅在于技术本身具有什么优势。布道如果做得不好,酒香也怕巷子深。技术的进步与受众群体的反馈是相互促进的。Node.js在国内逐渐生根发芽的这几年,狼叔无疑是推广该技术的中坚力量。

经过多年的积累和沉淀,狼叔带着他的新书与大家见面了。这本书内容循序渐进、概念清晰明了、技术描述有点有面,是一本理论架构完整且实战案例典型的好书!相信各位读者能够从中获益!

最后,衷心祝愿Node.js发展得越来越好,也祝愿狼叔的布道事业蒸蒸日上!

CNode社区管理员,alsotang


推荐序2

在狼叔邀请我为他的新书写推荐的时候,我的内心是忐忑的,因为我对Node.js并不熟悉,不是这方面的专家。但对于狼叔我是了解的,同为技术社区推动者和文字爱好者,我深知在国内要写一本严肃的技术图书是一件多么吃力不讨好的事情。正因如此,狼叔的这本书就更值得推荐给正在学习Node.js的工程师们。

2009年,Node.js刚刚诞生,那时我就接触到了它。后来,Node.js的迭代和进步之快完全超出了我的预期,它变得越来越好用,逐渐成为全栈工程师的首选。这样的结果离不开强大、活跃的Node.js社区和无私的Node.js贡献者们的付出,而狼叔就是国内Node.js贡献者的代表。

有了Node.js,前端工程师也可以编写后端程序,并成为手机应用的跨平台开发主力。客户端、前端和服务器端已呈现出大统一趋势。在我自己熟悉的Web服务器开发领域,可以说Nginx内置的njs就是冲着替代OpenResty这一目标迅速发展的。

在这种技术趋势下,学习JavaScript和Node.js无疑是一个性价比很高的选择。这样一来,我们便可以打通从移动应用、Web应用到服务器端接口的整条链路。而学习一门技术最好的方式,就是选择一本好书。

写一本好书对作者的要求很高——技术功底扎实只是基础,更要有丰富的项目经验、深厚的文字功底和洞察读者心理的能力。平日里像“诗人”一样的狼叔绝对是为数不多的具备上述能力的“牛人”,所以我相信他写的书也一定是一本好书。希望大家能通过这本好书提升自己的技术水平。

学习从来不是一件容易的事,但却是一件快乐的事,共勉。

支流科技创始人& CEO、Apache PPMC,温铭


推荐序3

1995年,Brendan Eich花了10天时间开发出了一门脚本语言,该语言可用于弥补Java Applets的不足,随后Marc Andreessen将这门语言命名为Mocha。Mocha的最初定位是,服务于测试脚本编写人员、业余编程爱好者、设计师。

同年5月,Mocha被集成到了Netscape浏览器中,不久后其被更名为LiveScript。同年年底,Netscape公司和Sun公司达成协议并获得了Java商标的使用权,于是LiveScript正式被更名为JavaScript。

有人觉得,正是因为更名为JavaScript才使这门语言成了浏览器执行的唯一语言。但时至今日,JavaScript已经不仅仅局限于实现网页特效了,而真正发展成了一门全功能的编程语言。

2009年,Joyent公司的一名软件工程师Ryan Dahl开发了Node.js,这是一个基于Chrome V8引擎的JavaScript运行时环境。Node.js使得JavaScript拥有了操作文件系统、I/O、网络,甚至数据库的能力。虽然Node.js不是第一个将JavaScript带离浏览器的工具,但它无疑是最成功的一个。

如今,Node.js社区已经成了最活跃的编程社区之一,其npm的包数量也已经超越了Java的Maven、Ruby的Gem、PHP的Composer。

狼叔是国内最早一批的Node.js使用者,也是Node.js社区最活跃的布道者之一。多年前狼叔来天津创业,我有缘与他结识。在那之前我就已经拜读过狼叔的文章,而当时狼叔就曾与我谈起要写一本关于Node.js的书。说来也巧,Node.js于2009年发布,而《金刚狼》系列电影也于2009年开始上映。《金刚狼》系列电影一共3部,而狼叔的《狼书》系列图书也有3卷,希望《狼书》系列图书能如《金刚狼》系列电影一样受到欢迎。

目前Node.js发展十分迅速,但很大一部分使用者是前端开发人员。和Java、Python、Ruby等后端语言对比,尤其在图书出版方面,Node.js还需要持续深入,而《狼书》系列图书的面世正好弥补了这一方面的不足——第1卷系统全面地介绍Node.js基础,第2卷着重介绍Node.js Web应用开发技能,第3卷则侧重于Node.js的高级应用。如果你想深入学习Node.js的核心原理并掌握使用Node.js开发大型系统的要诀,那么这套书非常值得你精读。

Flarum中文社区创始人,迷渡(justjavac)


推荐序4

俗话说,十年磨一剑,慢工出细活。狼叔撰写的《狼书》系列图书很好地诠释了这两句话。

众所周知,狼叔是Node.js布道者、“Node全栈”微信公众号的作者,他活跃于CNode社区,组织了不少线下Node.js沙龙,同时常作为讲师在各种技术交流会上进行分享,为Node.js在国内的推广做出了很大的贡献。我觉得这是一种情怀,也是一种责任。当你爱上一件事,你就会全情投入。

Node.js的出现在很大程度上满足了前端工程师想要探索更广阔的编程世界的愿望,为前端工程师提供了更好的了解后端工作的机会,对于前后端协同而言具有巨大价值。十几年时间,Node.js几经波折,但这并不妨碍它快速发展,如今它已经成为最流行的技术之一。

近些年,不少大型互联网公司都开始基于Node.js构建应用。我和狼叔在去哪儿网相识,平时和他对话或闲聊,最后总能聊到Node.js上,我能深切地感受到他对Node.js的热爱。那时候的狼叔正在努力为去哪儿网建设更完善的Node.js基础设施,他的努力为去哪儿网注入了新鲜活力,加快了Node.js在机票购买业务中的落地。

《狼书》系列图书正是狼叔Node.js情怀的最终寄托。这本第3卷聚焦于Node.js高级技术,几经雕琢终于面世,很好地承载了狼叔对Node.js的热爱,将开发npm模块、编写企业级Web开发框架、服务器部署、测试、开源等热门话题娓娓道来,就像一杯陈酒,越品越有味道。我相信每一位拿到此书的读者都会有不同的收获,无论你是初入前端领域的“小白”,还是深耕多年的“老手”。

美团研究员,杜瑶


自序

《狼书》系列从2015年10月开始撰写。

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

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

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

可是写书从来都不是一件容易的事。阅历浅,写不来;无恒心,写不来。从我萌生写书的想法至今,Node.js稳定、高效地发布了多个版本,国内外的Node.js使用率也渐渐达到了一个前所未有的高度。这些年里,很多朋友催书,以至于我经常在演讲中“自黑”:“我的书从Node.js 4.0版本写到Node.js 8.0版本,然而还没有写完。”出版社约稿时,Node.js才刚刚发布4.0版本;2019年年初《狼书(卷1):更了不起的Node.js》撰写完成时,Node.js发布了11.10版本;到2022年10月,Node.js版本已经来到18.10。

最终,本书确定以Node.js 8.0为核心版本。虽然后面Node.js的更新版本里又增加了新功能,但整体来看,Node.js的API设计得非常好,几乎都是向后兼容的,所以即使是18.10版本在使用上和8.0版本的差别也不大。

2019年7月,《狼书(卷1):更了不起的Node.js》和大家见面了。2019年12月,《狼书(卷2):Node.js Web应用开发》出版。原以为,《狼书(卷3):Node.js高级技术》也会在不久之后与大家见面,却未曾想2020年有很多突如其来的变化,影响了这本书的出版计划。经过我的深思熟虑,觉得不如趁此机会将书中原本的陈旧内容推翻,再加上一些新的感悟。于是,我又开始重新创作,删删改改,迭代了一轮又一轮……很抱歉,时隔三年,《狼书(卷3)》才与各位读者见面。

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

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

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

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

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

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

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

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


狼叔

2022年10月


前言

起初,《狼书》是一本书,而不是系列图书。我想将自己对Node.js知识体系的理解进行总结,融入书中。然而,Node.js领域涉及的知识非常广泛,以至于写着写着就写了1000页。于是,我和编辑商定,将《狼书》拆分成了3本书。其中,卷1重点讲Node.js应用场景和入门,卷2重点讲以下一代框架Koa为核心的Web开发,卷3重点讲与实操相关的Node.js高级技术。

在Node.js世界里,高级技术并不是很多人理解的线上问题解决方案。本书中定义的高级技术,是让更多Node.js新人更容易上手的技术,是由新手变成经验丰富的高级工程师这一过程中需要掌握的技术。本书聚焦于实用高级技术,让大家可以边阅读边动手实践。所谓“授人以鱼不如授人以渔”,这也是我撰写本书的目的。

本书内容

本书以Node.js高级技术为核心,主要讲解如何开发npm模块、如何编写企业级Web开发框架、如何构建具有Node.js特色的服务,还介绍了与服务器部署、性能调优、测试、开源等相关的内容。

本书共分5章,每章的内容简介如下。

第1章 自己动手写npm模块

本章将介绍编码中常用的基本技能,如Ack、Autojump等常用命令,如何编写Node.js模块,各种npm使用技巧等。本章精选3个实例,详细讲解模块编写方法及脚手架写法,同时推荐了多个实用模块,如debug、mkdirp、shelljs等。

第2章 自己动手编写企业级Web开发框架

本章将介绍在实际项目中更为常用的企业级Web开发框架的脚手架写法。首先介绍Node.js领域常用的特色Web开发框架,让读者对Web框架有一个大致了解,然后介绍自己动手实现企业级Web框架的流程和注意事项,涉及脚手架开发、目录设计、模板开发、静态API模拟等。

第3章 构建具有Node.js特色的服务

本章将介绍基于Node.js构建的服务,包括微服务、BFF、SFF、SSR等,细致介绍服务器端常用架构,并完整讲解Node.js服务的构建流程和注意事项。其中,使用Node.js开发RPC服务和API服务是比较有特色的内容,页面即服务概念是各位读者需要重点掌握的。

第4章 服务器部署与性能调优

本章将介绍如何在云环境中完成Node.js服务器部署并实现各种性能调优方法。性能调优是一个宏大的话题,涉及的知识点非常广泛。本章介绍性能调优基础知识、立体分析和深度调优,更对0x、Easy-Monitor、Clinic、AliNode等常用工具的用法和性能进行了对比。

第5章 测试、开源与自学

本章将介绍测试入门、测试进阶和开源带来的机会。测试可以最小化问题,聚焦解决难点,这和通过开源进行自主学习有一定的相似性。因此,笔者将测试、开源、自学结合在一起,希望读者阅读本章内容后能有新的感悟,成长为更好的开发者。

本书中的各章内容基本是相互独立的,因此各位读者可以挑选自己感兴趣的章节阅读。这本书是《狼书》系列图书的第3卷,第1卷主要介绍Node.js基础知识,第2卷主要介绍Node.js Web应用开发。三卷搭配阅读,效果更好。

目标读者

本书的目标读者有以下三类。

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

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

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

阅读准备

要想运行本书中的示例,需要安装以下系统及软件。

??操作系统:推荐Linux,以及macOS 10.9或以上版本,使用Windows操作系统可能会在运行示例时报错。

??浏览器:Google Chrome、Safari、Firefox、Internet Explorer 11、Windows Edge。

??运行环境:Node.js 8.x至Node.js 18.x均可。


目录

第1章 自己动手写npm模块 1
1.1 基础技能 1
1.1.1 环境变量 2
1.1.2 Zsh 2
1.1.3 Vim 3
1.1.4 Ack 4
1.1.5 Autojump 5
1.1.6 Git和GitHub 5
1.1.7 查询文档 6
1.2 编写Node.js模块 6
1.2.1 初始化模块 6
1.2.2 普通模块 7
1.2.3 二进制模块 9
1.3 npm技巧 13
1.3.1 npm run 13
1.3.2 配置 13
1.3.3 钩子 15
1.3.4 npm link 16
1.3.5 自定义安装 16
1.3.6 模块瘦身 17
1.3.7 postinstall 17
1.3.8 路径 18
1.3.9 模块依赖图 20
1.4 实例讲解 22
1.4.1 kp 22
1.4.2 je 27
1.4.3 lazyclone 30
1.5 编写脚手架 31
1.5.1 初始化模块 32
1.5.2 CLI二进制模块 32
1.5.3 使用模板引擎 34
1.5.4 解析CLI参数和路径 35
1.5.5 npm发布 40
1.6 开源周边 40
1.6.1 持续集成 40
1.6.2 测试覆盖率 45
1.6.3 徽章 45
1.6.4 反向学习 46
1.7 推荐模块 46
1.7.1 debug 47
1.7.2 GitBook 48
1.7.3 colors和chalk 49
1.7.4 mkdirp 50
1.7.5 shelljs 50
1.7.6 moment 51
1.7.7 LRU缓存 52
1.7.8 semver 53
1.7.9 xtend 55
1.7.10 require-directory 56
1.7.11 yargs 57
1.8 本章小结 59
第2章 自己动手编写企业级Web开发框架 60
2.1 特色Web框架 60
2.1.1 LoopBack 61
2.1.2 Nest 63
2.1.3 ThinkJS 66
2.1.4 Egg.js 69
2.1.5 Next.js 70
2.1.6 Redwood 72
2.1.7 strapi 76
2.2 自己动手写框架 78
2.2.1 基础知识 78
2.2.2 生成项目 81
2.2.3 添加Mongoose 91
2.2.4 添加MVC目录 96
2.2.5 庖丁解Views 103
2.2.6 脚手架 112
2.2.7 静态API模拟 114
2.2.8 更多实践 122
2.3 本章小结 127
第3章 构建具有Node.js特色的服务 128
3.1 服务概览 128
3.1.1 架构演变 128
3.1.2 从大而全到小而美 129
3.1.3 微服务应用 131
3.1.4 BFF中间层 134
3.1.5 SFF托管 137
3.2 使用Node.js优化页面渲染 140
3.2.1 BigPipe 140
3.2.2 服务器端渲染(SSR) 150
3.2.3 渐进式Web应用(PWA) 153
3.2.4 同构开发 158
3.3 页面即服务 162
3.3.1 页面独立 162
3.3.2 模块拆分 164
3.3.3 BigView 165
3.3.4 API Proxy 175
3.3.5 源码说明 176
3.4 使用Node.js开发RPC服务 178
3.4.1 RPC原理 178
3.4.2 通信层协议设计 179
3.4.3 如何实现RPC通信协议 180
3.4.4 DNode 181
3.4.5 Senaca 182
3.4.6 Moleculer 185
3.4.7 通用RPC 189
3.4.8 服务发现与治理 190
3.4.9 典型用法 192
3.5 使用Node.js开发独立的API层 193
3.5.1 GraphQL 193
3.5.2 Micro框架 197
3.5.3 API网关 197
3.5.4 在线服务 199
3.6 本章小结 199
第4章 服务器部署与性能调优 200
4.1 服务器部署 200
4.1.1 服务器选购 201
4.1.2 手动部署 204
4.1.3 通过Docker部署 211
4.1.4 自动部署 224
4.1.5 APM与监控 231
4.2 性能调优 239
4.2.1 基础知识 239
4.2.2 立体分析 246
4.2.3 深度性能调优 250
4.3 分析Easy-monitor 260
4.4 本章小结 262
第5章 测试、开源与自学 263
5.1 测试入门 264
5.1.1 什么是测试 264
5.1.2 TDD和BDD 265
5.1.3 最小化问题 268
5.1.4 Baretest 269
5.1.5 TAP和Tape 271
5.1.6 Mocha 274
5.1.7 Jest 278
5.2 测试进阶 283
5.2.1 测试的好处 283
5.2.2 红到绿工作流 284
5.2.3 Cucumber 285
5.2.4 Spy、Stub和Mock 288
5.2.5 持续集成 291
5.2.6 如何编写测试框架 292
5.2.7 如何打造开源项目 293
5.2.8 进一步学习TypeScript 294
5.3 开源带来的机会和思考 310
5.3.1 Clipanion 310
5.3.2 机会与挑战 312
5.3.3 敏感且会学 313
5.3.4 成就更好的自己 313
5.4 本章小结 314

产品特色