JavaScript是每个Web前端开发者触手可及的工具,因此成为了一种非常流行的编程语言,以至于它最终定型为专门为Web开发的编程语言。在阅读本书之前,您可能听说过Node.js,这是一个在Web浏览器之外运行JavaScript程序的平台。迄今为止,Node.js已经有十年的发展历史,已经成为一个成熟的编程平台,被广泛应用于各种大大小小的项目中。这本书介绍了Node.js。读完本书,您将了解使用Node.js开发服务器端Web应用程序的完整生命周期,从概念到部署再到安全防御。在编写本书时,我们假设:你已经知道如何编写软件你熟悉JavaScript你有一些用其他语言开发Web应用程序的知识并选择它?也许我们中的一些人会这样做,但行之有效的方法是对不同的工具进行权衡比较,然后选择适合您的工具。这就是本章的内容,介绍使用Node.js的技术原理。在我们编写代码之前,我们必须考虑一下Node.js是什么以及为什么Node.js适合整个软件开发工具市场。然后,我们将深入研究应用程序开发工作,认识到最好的学习方式通常是自己动手。本章涵盖以下主题:Node.js简介使用Node.js可以做什么为什么使用Node.js.js概述Node.js是一个令人兴奋的新平台,用于开发Web应用程序、应用程序服务器、任何类型的Web服务器或客户端以及通用编程。它通过服务器端JavaScript、异步I/O和异步编程的巧妙结合,在Web应用程序中实现了极大的可扩展性。Node.js虽然只有十年的历史,但是却迅速崛起,在当前的项目发展中扮演着重要的角色。大公司和小公司都在将Node.js用于大项目和小项目。例如,PayPal已经将许多服务器从Java平台迁移到Node.js平台。Node.js架构与其他应用程序平台有很大不同。Node.js由于其固有的复杂性而避开线程,而线程被广泛用于扩展应用程序,从而占用所有CPU性能。有人说这是因为单线程事件驱动架构具有低内存占用、高吞吐量、负载下更好的延迟曲线以及更简单的编程模型。Node.js平台正处于快速发展时期,许多人认为它是传统Web应用程序架构(如Java、PHP、Python或RubyonRails)的强大替代方案。本质上,Node.js是一个自包含的JavaScript引擎,具有适用于通用编程的扩展,明确侧重于应用程序服务器开发。即使我们将Node.js比作应用服务器平台,Node.js也不是应用服务器。相反,Node.js是一种类似于Python、Go或JavaSE的编程运行时。虽然Node.js能够编写Web应用程序框架和应用程序服务器,但Node.js只是一个用于执行JavaScript程序的系统。Node.js的关键架构选择是事件驱动的,而不是多线程的。Node.js架构依赖于将阻塞操作分派到单线程事件循环,将结果作为调用事件处理程序的事件返回给调用者。在大多数情况下,事件会转换为由异步函数处理的Promise。由于Node.js基于Chrome的V8JavaScript引擎,因此在Chrome中实现的性能和功能可以快速同步到Node.js平台。Node.js核心模块足够通用,可以支持基于任何TCP或UDP协议的所有类型的服务器,无论是域名系统(DNS)、HTTP、Internet中继聊天(IRC)还是FTP。虽然Node.js能够开发Internet服务器或客户端,但它的主要用途是用于常规网站开发,取代Apache/PHP或Rails等堆栈技术,或改进现有网站。例如,您可以通过Node.js的Socket.IO库轻松地为现有网站添加实时聊天功能或监控现有网站。由于Node.js的轻量级和高性能的特点,Node.js通常被用作胶水服务器。一个特别有趣的组合是使用Docker和Kubernetes等工具或AWSLambda等功能在现代云基础设施上部署微服务器。将大型应用程序划分为易于部署的大规模微服务时,Node.js工作得很好。让我们更深入地了解Node.js。Node.js功能Node.js是一个用于在Web浏览器之外编写JavaScript应用程序的平台。这不是我们在网络浏览器中熟悉的JavaScript环境!虽然Node.js执行我们在浏览器中使用的相同JavaScript语言,但Node.js没有与浏览器相关的功能。例如,没有内置的HTMLDOM。除了执行JavaScript的原生功能外,Node.js内置模块还提供以下功能:命令行工具(shell风格)交互式终端风格的程序,Read-Value-PrintLoop(REPL)出色的过程控制能力,它可以监督子进程用于处理二进制数据的缓冲区对象具有全面的事件驱动回调的TCP或UDP套接字DNS查找用于文件系统访问的TCP库之上的HTTP、HTTPS和HTTP/2客户端服务器。通过断言支持带有内置基本单元测试的Node.js的网络层是低级的,但非常简单易用。例如,您可以使用HTTP模块仅用几行代码就可以编写一个HTTP服务器或客户端。这非常强大,使开发人员可以非常轻松地获取协议请求,并让您准确实现在请求响应中应返回哪些HTTP标头。通常Web应用程序开发人员不需要处理低级HTTP或其他协议;相反,我们倾向于更有效地使用更高级别的接口,例如,对于PHP开发人员,由于Apache/Nginx/etc已经提供了HTTP,因此他们不需要编写实现堆栈的HTTP服务器部分。相反,Node.js程序员编写一个HTTP服务器并在该服务器上运行应用程序代码。为了简化HTTP服务器开发,Node.js社区催生了几个Web应用程序框架,例如Express,它们提供程序员经常需要的高级接口。您可以使用会话、cookie、服务静态文件和日志记录等内置功能快速配置HTTP服务器,让您专注于业务逻辑。其他框架提供OAuth2支持或专注于RESTAPI等。使用Node.js的社区在此基础上创建了各种工具。Node.js可以做什么Node.js不仅限于Web服务器应用程序开发,Node.js社区已经将Node.js带到了其他方向:构建工具:Node.js已成为软件开发或开发服务的首选基础设施通信命令行工具的流行选择。Grunt、Gulp、Webpack被前端开发者广泛用于打包建站资料。Babel被广泛用于转换现代ES2016代码以在旧浏览器上运行。流行的CSS优化器和处理器(例如POSTSS)是用Node.js编写的。Metalsmith、Punch和AkashaCMS等静态网站生成系统使用Node.js命令行运行并生成上传到Web服务器的网站内容。WebUI测试:Puppeter可让您控制无头Chrome网络浏览器实例。借助Puppeter,您可以使用功能齐全的现代Web浏览器开发Node.js脚本。一些典型的用途是网络抓取和网络应用程序测试。桌面应用程序:Electron和NodeWebKit(NW.js)都是为Windows、macOS和Linux开发桌面应用程序的框架。这些框架使用WebUI技术开发桌面应用程序,使用由Node.js库封装的大量Chrome组件。由于该应用程序是使用HTML5、CSS3和JavaScript编写的,因此它可以使用各种高级Web框架,例如Bootstrap、React、VueJS和AngularJS等。许多流行的应用程序都是使用Electron构建的,包括Slack桌面客户端应用程序、Atom、MicrosoftVisualCode编辑器、PostmanREST客户端、GitKrakenGIT客户端、U盘系统镜像工具Etcher。移动应用程序:用于移动系统的Node.js项目可让您使用Node.js开发iOS和Android智能手机或平板电脑应用程序。Apple的AppStore规则不允许访问支持JIT的JavaScript引擎,这意味着常规的Node.js不能用于iOS应用程序开发。对于iOS应用程序开发,该项目使用Node.js-on-ChakraCore来绕过AppStore规则。对于Android应用程序开发,该项目在Android上使用常规的Node.js。在撰写本文时,该项目处于开发的早期阶段,但看起来很有希望。物联网(IoT):Node.js是物联网项目非常流行的语言,Node.js运行在大多数基于ARM的单板计算机上。最具代表性的例子就是NodeRED项目。它提供了一个图形化的编程环境,允许您通过将块连接在一起来绘制程序。它具有面向硬件的通用I/O(GPIO)机制,例如,与RaspberryPi或Beaglebone单板计算机上的通用I/O(GPIO)引脚进行交互。您可能已经在使用Node.js应用程序但没有意识到!JavaScript在Web浏览器之外占有一席之地,这不仅仅归功于Node.js。别再为服务器端JavaScript挠头了!当然,您可能正在这样做,并自言自语,“浏览器语言可以在服务器上做什么?”事实上,JavaScript在浏览器之外有着悠久且鲜为人知的历史。JavaScript是一种编程语言,就像其他所有语言一样,最好的问题是“为什么JavaScript仍然停留在网络浏览器中?”回到混乱的网络时代,用于编写网络应用程序的工具还处于起步阶段。在Java和PHP出现的早期,一些开发人员使用Perl或TCL编写CGI脚本。即便如此,服务器端仍然存在JavaScript。第一个用JavaScript编写的Web应用程序服务器是Netscape的LiveWire服务器。MicrosoftASP的某些版本使用JScript,这是Microsoft自己的JavaScript版本。最近的一个JavaScript服务器项目是Java的RingoJS应用程序框架。Java6和Java7都提供了RhinoJavaScript引擎。在Java8中,Rhino被更新的NashornJavaScript引擎取代。换句话说,浏览器之外的JavaScript并不是什么新鲜事物,尽管不是很常见。您已经了解到Node.js是一个用于在Web浏览器之外编写JavaScript应用程序的平台。Node.js社区已经将该平台用于大量应用程序类型,远远超出了最初为该平台设想的范围。这证明了Node.js的流行,但我们仍然要考虑使用Node.js的技术原因。中文电子书推荐BeginningiOSGameCenterandGameKit:ForiOS,tvOS,andMacOS,2ndEditionAPIMarketplaceEngineering:Design,Build,andRunaplatformforExternalDevelopersAzureCloudSecurityforAbsoluteBeginners:EnablingCloudInfrastructureSecuritywithMulti-LevelSecurityOptionsMoreJava17:深入探索Java语言及其特性,第3版基于机器学习算法的认知行为和人机交互NSX-T逻辑路由:强化您的理解以扩大您的成功InnovativeSAPSuccessFactorsRecruiting:创建自定义的指南集成和自动化使用Consul简化服务管理:克服动态服务架构中的连接性和安全性挑战
