狼书(卷1):更了不起的Node.js(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-04 18:02:26

点击下载

作者:狼叔

出版社:电子工业出版社

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

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

狼书(卷1):更了不起的Node.js试读:

前言

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

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

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

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

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

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

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

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

io.js的分裂最终促成了2015年Node.js基金会的成立,同年Node.js v4.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等多个版本,截止到本书完稿之时,最新版本已经是v11.14,最新的长期支持(LTS)版本是v10.15。

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

本书内容

从整体上来说,本书以Node.js为主,首先介绍了Node.js的发展历史,然后简要概括了Node.js的特点和使用场景,之后讲解了Node.js实现过程中的新增内容(如语法、模块、单进程等)的基本用法。读者入门Node.js之后,可以继续从本书中了解Node.js的执行原理,深入解读源码。最后,本书还讲解了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卷,还有第2卷和第3卷稍后会和各位读者见面,内容涉及Web应用和性能优化等,搭配阅读,效果更好。

目标读者

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

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

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

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

同时,本书也适合正使用其他编程语言(如Go、PHP、Python、Ruby、Java等)进行Web开发的工程师阅读、学习。

阅读准备

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

■ 操作系统:推荐Linux,以及macOS X 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

最后送给各位读者一句话,也是狼叔常说的——少抱怨,多思考,未来更美好!第1章 Node.js初识

Node.js从2009年诞生开始,到现在已有10岁,在这10年里,它的成长和成熟是大家有目共睹的。它因后端简化并发编程而被关注,因作为前端辅助开发工具而流行,因异步流程控制和回调地狱而被人诟病,因npm批量安装模块而被人敬仰。无论之前你是否接触过Node.js,它都值得你去了解,下面就跟我一起来认识一下Node.js吧!1.1 引子

我有一位好朋友有10余年的Java开发经验,对jQuery和Angular掌握得都还不错,其公司架构升级,需要将开发流程打通,当中重要的一环就是“API文档化”,他采用的技术选型是Swagger UI,一个API在线文档生成和测试利器。他遇到一个问题,当时的Swagger UI版本是3.1,是基于他不熟悉的Babel、React、Webpack技术栈开发的。面对前端组件化,以及更新频繁且十分复杂的技术栈,他不知道该如何下手,于是向我提出了一个极小的需求,希望通过修改UI里的头部信息来了解当前最“酷”的前端开发过程。

如果对Node.js项目熟悉,这个问题是非常容易解决的。首先打开项目根目录下的package.json,它是Node.js模块的核心配置文件;查看dependencies可以知道当前项目在产品环境下使用了哪些Node.js模块,便于我们对当前项目使用的技术栈有一定了解。下面的代码是Swagger UI中的核心模块,该模块将Less用作CSS预处理器,将React用作前端组件化框架。

查看devDependencies可以知道当前项目在开发环境下需要依赖的模块。为了使用最新的ECMAScript语法(后文中简称为ES6),需要使用Babel编译工具,同时使用ESLint来检查代码质量,使用Standard来统一编码风格,使用Webpack作为打包器。最后要说的是,autoprefixer模块为了兼容所有浏览器,需要通过CSS属性为不同的浏览器加上对应的前缀。在写代码的时候可以不加,但在最后编译的时候会由autoprefixer自动加上,这是提高前端开发效率的常见手段。

那么,为什么要区分开发环境和产品环境呢?让我们在前端的发展过程中求解吧!图1-1展示了前端技术的发展过程。自2014年Backbone框架中引入了MVC开始,前端领域中逐渐出现了各种概念,例如MVVM、Router、IoC、Virtual Dom等,再加上Angular、React、Vue等大量框架井喷式地出现,导致前端对于传统的HTML、CSS、JavaScript写法产生了“反叛”情绪,期望找到更好、更高效的开发方式。在这种情况下,Node.js无疑是前端开发的最佳搭档,它能编写大量辅助前端开发的模块,上面所列举的都是常用的模块。图1-1图片来源:https://twitter.com/sstephenson/status/730039913052176384

现在的前端开发方式早已不是将代码直接放在浏览器里运行了,而是采用更好的写法。经过转译处理,最终输出可在浏览器中运行的代码,如图1-2所示。比如将ES6语法降级为ES5,将Less编译为CSS,将React组件通过React引擎渲染为HTML等,这些还是你熟悉的前端开发方式吗?图1-2

下面让我们来看一下如何进行开发。一般开发以终端命令行CLI的方式来实现,最常用的就是使用npm scripts来实现,具体定义如下。

其中核心的两个命令如下。

■ npm run build:打包,生成最终可在浏览器中运行的代码。

■ npm run dev:利用Node.js编写的模块辅助开发命令,用于本地开发,不会产生最终文件。

这里我们以本地开发为例。在终端执行npm run dev命令后会在默认的浏览器中打开如图1-3所示的页面,我们的需求是将头部的swagger改为koa。图1-3

首先要找到入口,当然这并不容易,需要通过启动脚本一个一个进行推导。

npm run dev是通过npm-run-all来并行执行hot-server和open-localhost的。

npm-run-all是一个用于并行或串行执行npm scripts的命令行辅助工具,它本身也作为依赖模块被安装到了开发环境里。它执行的open-localhost很有意思,是通过node -e'require(\"open\")(\"http://localhost:3200\")'实现的,很少有这样的用法,但确实简单直接。

hot-server是通过webpack-dev-server实现的开发环境服务,其核心配置是webpack-hot-dev-server.config.js,另外还有一个非常重要的配置项--content-base dev-helpers/ ,表示指定静态服务器的托管目录,即http://localhost:3200/页面对应的就是dev-helpers/index.html。

以上代码中的要点如下。

■ 核心是SwaggerUIBundle。

■ SwaggerUIBundle的布局是StandaloneLayout。

■ SwaggerUIStandalonePreset只是SwaggerUIBundle的预置扩展。

webpack-hot-dev-server.config.js文件是Webpack配置,是我们需要掌握的最流行的Node.js模块。在Webpack配置文件里,entry是入口,具体的配置如下。

在dev-helpers/index.html中引用的swagger-ui-bundle.js文件和wagger-ui-standalone-preset.js文件就是这样来的,由入口配置多个文件,最终打包成一个可供浏览器使用的文件。该文件在开发阶段由webpack-dev-server提供,在产品阶段通过Webpack打包输出到dist目录中,进而提供给页面使用。

这里推断核心模块SwaggerUIBundle的入口为./src/core/index.js,原因很简单,模块配置的入口只有两个文件,利用常识判断,便知道polyfills是用于实现浏览器并不支持的原生API的代码,所谓的补丁肯定不会是入口。

其实完整阅读src目录下的代码才发现,最后代码存在于src/standalone/layout.jsx文件的StandaloneLayout布局中的Topbar组件内。

Topbar组件位于src/plugins/topbar目录下,我们要更改的是显示的内容,所以直接研究模板topbar.jsx,将其中的swagger改为koa即可实现需求,代码如下。

大家可以想一想,对于这样一个修改字符串的简单需求,为什么我们要占用如此大的篇幅来讲呢?在整个修改过程中,我们看到了前端开发颠覆性的变化,无论是开发方式,还是构建过程、组件写法,这种典型的多技术栈组合的开发方式难度是相当大的。从另外一个角度来看,开发过程中会大量应用Node.js模块,如果对Node.js开发足够熟悉,学习前端开发时基本上只需要付出学习“纯前端”技术的时间成本,如果不熟悉Node.js,那么学习前端开发还要同时学习Node.js开发。如果换一门开发语言,比如使用Go语言呢?那么你要学的便是3门技能:Node.js开发、前端技术和Go语言编程。前端技术尚且学不过来,你真的有精力学习其他知识吗?

当然,Node.js不只是前端辅助开发工具,它还可以实现更多功能,下面就跟我一起开启更了不起的Node.js之旅吧!1.2 JavaScript

基于万维网之父Tim Berners-Lee提出的最小功效原则——选择最合适的解决方案而不是最强的,语言的功效越弱,对于储存在该语言中的数据,我们能做的事情就越多,Jeff Atwood在2007年提出了下面这条著名的Atwood定律。

语言的语法结构越简单,进行数据提取和分析就越容易,用来开发互联网应用也越理想。如果对象创建和线程管理都不是必要的机制,那么作为一种基于原型而不是面向对象的语言,JavaScript就是完美的:它虽然没有类的概念,但所有内容都是对象,无须创建过程就能使用,而且它是单线程的。同时,JavaScript也面向后端,即Node.js,明显简化了并发编程,可以轻松访问各种数据库,构建Web应用、API与微服务,让Web开发者实现使用JavaScript开发前后端的全栈理想。

JavaScript诞生于1995年,其第一版仅10天就被编写完成,起初它的主要目的是处理以前由服务器端负责处理的一些表单验证。第一版JavaScript的名称是LiveScript,为了赶在发布日期前完成LiveScript的开发,当年Netscape公司与Sun公司还特意成立了一个开发联盟。Netscape公司为了搭上“媒体热炒Java”的顺风车,临时将LiveScript更名为JavaScript,所以从本质上来说,JavaScript和Java并没有什么关系。

图1-4展示了JavaScript语言的演进过程(本图作者为justjavac)。图1-4

JavaScript 1.0获得了巨大的成功,1997年,以JavaScript 1.1为蓝本的建议被提交给了欧洲计算机制造商协会(European Computer Manufactures Association,ECMA),该协会指定39号技术委员会(TC39)负责将其标准化,TC39由关注脚本语言发展的各大公司的程序员组成,他们的工作是定义ECMAScript语言的标准。第二年,国标标准化组织和国际电工委员会(ISO/IEC)也采用了ECMAScript作为标准,即ISO/IEC-16262。之后的几年又陆续发布了几个ECMAScript版本,但影响都不大,直至2009年ECMAScript 5(简称ES5)语言标准发布,该标准才逐渐被大家熟知。

同样在2009年,Node.js横空出世,开启了JavaScript用于后端领域编程的新时代!2015年,ECMAScript 6(简称 ES6)语言标准发布,Node.js也从4.x版本开始支持ES6特性,目前Node.js 6.x以上的版本几乎可以支持ES6中90%以上的特性。之后的每年,TC39都会发布一个新版本的ECMAScript语言标准,但标准发布与实现还要相隔很长时间,大家如果有精力就提前学习一下,掌握技术趋势。

下面展示一些对JavaScript有正面影响的其他统计数据,可以说,JavaScript实现了前后端语法统一,让全栈开发变得更容易。

■ 在GitHub上,JavaScript开源项目的数量最多,几乎是Java开源项目数量的1.5倍。

■ 在“StackOverflow 2017年开发者调查报告”中,Node.js被评为最受欢迎的开发平台。

■ JavaScript是StackOverflow中最流行的编程语言。1.3 什么是Node.js1.3.1 Node.js概述

Node.js官方网站中的描述如下。

在这段介绍中,需要解读的要点如下。

■ Node.js不是JavaScript应用,不是编程语言(JavaScript是编程语言),不是像 Rails(基于Ruby)、Laravel(基于PHP)或 Django(基于Python)一样的框架,也不是像Nginx一样的Web服务器。Node.js是 JavaScript的运行时环境。

■ Node.js构建在Chrome V8这个著名的JavaScript引擎之上,Chrome V8引擎是通过C或C++编写的,相当于要将JavaScript转换为底层的C或C++代码后再执行,通过JavaScript这层包装,大大降低了偏底层的编程语言的学习成本。

■ Node.js是轻量且高效的,每个函数都是同步的,而I/O操作是异步的。所有由JavaScript编写的函数的I/O操作最终都将由libuv(由C/C++ 编写)事件循环处理库来处理,隐藏了非阻塞I/O的具体细节,简化了并发编程模型,可以轻松编写高性能的Web应用。

■ Node.js使用npm作为包管理器,目前npm是开源库里最大的包管理生态,功能强大,截至2019年3月,模块数量已经超过了90万。

大多数人认为,Node.js只能用于编写网站后台或者前端工具,这其实是不全面的,Node.js的目标是让并发编程更简单,主要应用在以网络编程为主的I/O密集型应用中。它是开源的,跨平台的,并且是高效的(尤其是在I/O处理方面),IBM、Microsoft、Yahoo、SAP、PayPal、WalMart以及GoDaddy都是Node.js的用户。

图1-5源自Node.js之父Ryan Dahl的演讲稿,展示了Node.js早期的架构模式,但今天依然不过时。Node.js是基于Chrome V8引擎构建的,由事件循环(Event Loop)分发I/O任务,最终工作线程(Work Thread)会将任务放到线程池(Thread Pool)中执行,而事件循环只要等待执行结果就可以了。图1-5

下面带领大家梳理一下上面介绍的内容。

■ Chrome V8引擎:Google发布的开源JavaScript引擎,采用C/C++编写,在Google的Chrome浏览器中被使用。Chrome V8引擎可以独立运行,也可以嵌入C/C++应用程序中被执行。

■ Node.js内置Chrome V8引擎,所以使用的是JavaScript语法。

■ JavaScript语言的一大特点就是单线程,即同一时间只能做一件事。单线程就意味着所有的任务都需要排队,前一个任务结束才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等待。

■ 一般情况下,排队的时候CPU是闲着的。其实CPU完全可以不管I/O设备而直接挂起处于等待中的任务,先运行排在后面的任务。

■ 将等待中的I/O任务放到事件循环中,事件循环由libuv提供。

■ 事件循环负责将文件I/O任务放到线程池中,线程池由libuv提供。网络I/O任务不通过线程池完成。

■ 只要有CPU资源,就应尽力执行。

我们再换一个维度来看一下Node.js的原理,如图1-6所示。图1-6

在图1-6中,Chrome V8引擎解释并执行JavaScript代码(这就是浏览器能执行JavaScript的原因),libuv由事件循环和线程池组成,负责所有I/O任务的分发与执行。

在解决并发问题方面,异步是最好的方案,我们可以类比排队和叫号机制来理解。在排队的时候,除了等待我们什么都做不了。但如果有叫号机制,我们就可以先取号码,等轮到自己的时候,系统会发出通知,这中间,我们可以做任何想做的事。

Node.js其实就是帮我们构建了类似的机制。写代码的过程实际上就是取号的过程,由事件循环来接受处理,而真正执行操作的是具体的线程池中的I/O任务。之所以说Node.js是单线程的,是因为它在接受任务的时候是单线程的,无须切换进程/线程,非常高效,但它在执行具体任务的时候是多线程的。

Node.js 公开宣称的目标是“提供一种简单的构建可伸缩网络程序的方法”,毫无疑问,它确实做到了。这种做法将并发编程模型简化了,事件循环和具体线程池等细节被Node.js封装了,进而将异步调用 API 写法暴露给开发者。这种方式也是福祸相依的,一方面简化了并发编程,能让更多人轻而易举地写出高性能的程序,另一方面在写法上埋下了祸根。

Node.js Bindings层做的事就是将Chrome V8引擎暴露的C/C++接口转换成JavaScript API,并且结合这些API编写Node.js标准库,所有这些API被统称为Node.js SDK,后面关于模块的章节中会更详细地讨论。

Microsoft在2016年宣布在MIT许可协议下开放Chakra引擎,并以ChakraCore为名在GitHub上开放了源代码,ChakraCore是一个完整的JavaScript虚拟机,拥有着和Chakra几乎相同的功能与特性。Microsoft向Node.js主分支提交了代码合并请求,让Node.js用上了ChakraCore引擎。实际上Microsoft是通过创建名为Chakra Shim的库赋予了ChakraCore处理Google Chrome V8引擎指令的能力,其原理如图1-7所示。图1-7

目前,Node.js同时支持ChakraCore和Chrome V8这两种JavaScript引擎,二者在性能和特点上各有千秋,ChakraCore给人感觉更“潮”一些,曾是第一个支持async函数的引擎,但目前Node.js还是以Chrome V8引擎为主,ChakraCore版本需要单独安装,大家了解即可。1.3.2 Node.js的特点

上面的内容主要概括了Node.js的定位,总结成一句话——Node.js是可扩展的适合用于构建高性能Web应用的最简单的解决方案。

这句话中有4个要点:适合构建Web应用、高性能、简单、可扩展,这4点也是Node.js的特点,下面具体介绍。

↘ 适合构建Web应用

1.构建网站

此处是指构建传统网站,不进行前后端分离,将视图渲染和数据库访问都放在同一个项目中。用Node.js做入门开发,和传统的Java、PHP开发没有什么区别。构建成功的应用是典型的单体式应用,CNode社区就是基于Node.js编写的网站。

2.构建API

从2010年移动端开发变得十分火爆起,大前端领域便开始变得复杂,不再是单纯的PC端Web开发,也包含了iOS、Android、HTML5等多种客户端开发,这就导致了一个问题:为这些客户端提供可以复用的API接口变得更加困难。基于此,API接口开发被提升到了一个前所未有的重要程度。

移动端API与前端的Ajax调用、API调用一样,一般以返回JSON或XML结构数据为主。API的写法很多,最为推荐的写法是对返回的数据加壳,如下所示。

至于是选用GitHub V3式的纯RESTful API还是微博API式的自定义约定,按团队喜好即可。

对于用Node.js实现API接口开发,在技术选型上,无论是选择通用型的Express、Koa框架,还是选择专门为API开发编写的Restify、Hapi框架,都是极其简单的。一些大型工程的API相对复杂,因此在后端的API接口开发上封装一层专门供前端使用的API Proxy是非常有必要的。后端API接口开发用于数据库访问,将返回的数据进行包裹,以HTTP形式返回;API Proxy针对前端使用的API进行优化,使前端开发更人性化。这是一个相当不错的架构升级,后面的章节会详细讲解。

3.构建RPC服务

在微服务架构十分流行的今天,服务化已经是必经之路,其中使用最多的就是RPC(Remote Procedure Call,远程过程调用)协议服务,常见的做法是将数据库访问返回的数据,以TCP形式传输给调用方。相对于HTTP,RPC服务采用的是TCP,在协议和传输上有明显优势。著名的RPC服务有Java版本的Dubbo、Google出品的跨语言RPC库gRPC等。

前面讲过,Node.js是非常适合用于网络应用开发的,其中Socket编程就是一种典型的网络应用开发场景,也就是说,Node.js一样适合用于Socket编程,使用Node.js开发RPC服务是非常合适的。当然,Node.js实现的RPC服务有很多种,例如纯粹用Node.js实现的DNode、微服务工具集Seneca、跨语言的gRPC客户端,可以看出Node.js在微服务架构下的应用场景也是非常多的。

■ RPC服务:数据库访问,将返回的数据进行包裹,以TCP形式传输给调用方。

■ RPC组装服务:组装多个RPC服务,完成某项业务。

■ 将RPC服务包装成HTTP API,这也是Node.js擅长的。

4.前后端分离

自2014年以来,前端开发的受关注度爆增,React、Vue、Angular框架三足鼎力,每个月还会冒出新框架,可谓风光一时无二。但是这也导致了一个问题:对于大型项目而言,如果不进行前后端分离,很难满足当下的需求。

前后端分离的应用场景大致有如下4个。

■ 前端页面静态化(Page Static)

■ 前端页面服务化(PAAS,Page as Service)

■ 服务端渲染(SSR,Server Side Render)

■ 渐进式Web应用(PWA,Progressive Web App)

5.适用于Serverless

Node.js横空出世之后马上受到各个云计算厂商的青睐,Joyent本身也是云计算厂商,说Node.js是为云计算而生的,也未尝不可。

前端领域演进速度很快,Node.js的应用场景也越来越多,暴露出来的问题自然也非常多,涉及运维、API快速开发、服务端渲染等方面,这些问题其实都可以通过Serverless架构来解决。开发者不需要关心运维、流量处理和容器编排,通过一个函数(内置RPC、缓存、配置等API)就可以完成所有开发。可以简单理解为,Serverless是云计算的延伸,Node.js在这种应用层开发上有着得天独厚的优势。

有了Serverless,前端无须关心运维实现,写一个函数就可以搞定API、服务端渲染等,大幅优化了开发方式,可以想象得到,依靠“纯”前端方法实现所有业务也是可行的:无须关心运维(Serverless平台自带运维功能,一般集成Kubernetes这种容器编排管理系统),无须关心流量(Serverless平台自带服务网格功能,比如Istio,根据流量可以快速实例化容器),无须关心高并发(API层有缓存)。目前,Google开源的Knative正在逐渐走向成熟,是一个不错的技术选型。

↘ 高性能

Node.js的高性能具体是指以下几点。

■ 执行速度快:Node.js是构建在Chrome V8引擎之上的,执行速度可能是动态语言运行时环境里最快的。

■ 天生异步:事件驱动和非阻塞I/O特性决定了Node.js必须采用异步机制,每个I/O任务都是异步的,因此集成到libuv的事件循环里才能让开发者代码对并发操作无感知。

■ 适用于I/O密集的网络应用开发:网络应用开发(包括Web应用开发)的瓶颈在于I/O处理,而这恰恰是Node.js的强项。对于CPU密集型应用而言,能够使用其他语言开发最好使用其他语言,如果必须使用Node.js,可以通过C/C++扩展机制来实现。因为采用Node.js就认为所有功能都要使用Node.js实现,这是错误的,合理的采用其他技术栈,利用其优势部分,除了能够加快开发迭代的速度,对系统稳定性也是非常有帮助的。

狼叔常说:Node.js苦了自己却让更多人能够轻松实现并发编程,并以最小的成本获得更高的性能。

↘ 简单

总体来讲,Node.js使用起来非常简单,具体如下。

■ 语法简单:JavaScript语法简单易学,对新手非常友好,对于有前端开发经验或有其他方面JavaScript编程经验的开发者而言,更加简单。

■ 并发编程简单:有了事件驱动和非阻塞I/O机制,Node.js可以使用非常少的资源处理非常多的连接和任务,处理低延时请求,完美应对实时及I/O密集型应用等高并发场景。

■ 部署运维简单:无须使用额外的服务器软件,不像Java需要用到Tomcat之类的JavaEE容器,在分布式集群中,负载均衡、多核系统方面都有完善的配套设施,现有的各种自动化运维工具(如Ansible、SaltStack等)都可以直接使用。

■ 开发简单:目前Node.js内置模块和npm上的模块都遵守“小而美”的设计哲学,相对比较简单,对开发、迭代、上线有明显帮助,不像Java里的三大框架包含那么多内容。当然,现在Spring Boot也开始设计Java版本的小而美框架了。

↘ 可扩展

Node.js还具备可扩展的特性,具体如下。

■ 可以使用npm上的大量模块。

■ 可以通过编写C/C++扩展实现CPU密集型任务。

■ 可以轻松搭配Java、Rust等语言使用。

■ 架构互补:在架构上以业务边界来进行服务拆分,外加各种“组合拳”,可以让合适的轮子出现在合适的位置上,比如Java在基础平台建设及大数据等领域有非常深厚的基础,那么直接使用即可。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载