Node Web开发(Node.js Web Development, 5th Edition)_第一章(1)

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
  • Node.js的体系结构
  • Node.js的性能、利用率和可扩展性
  • Node.js、微服务架构和测试
  • 使用Node.js实现12要素用程序模型

Node.js概述

Node.js是一个激动人心的新平台,可用于开发Web应用程序、应用程序服务器、任何类型的网络服务器或客户端以及通用编程。它通过巧妙地服务器端JavaScript、异步I/O和异步编程结合在一起,在Web应用程序中实现了极高的可扩展性。

虽然Node.js只有十年历史,但已经迅速崛起,并且在现在的项目开发中扮演着重要的角色。无论是大公司还是小公司,都在将Node.js用于大型和小型项目。例如,PayPal已经将许多服务器从Java平台迁移到Node.js平台。

Node.js体系架构与其他应用程序平台截然不同。当线程被广泛地用于扩展应用程序而导致所有CPU性能被占用时,Node.js因为线程固有的复杂性而避开线程。有人说是因为单线程事件驱动架构内存占用低,吞吐量高,负载下的延迟曲线更好,编程模型更简单。Node.js平台正处于快速发展阶段,许多人认为它是 Java、PHP、Python或RubyonRails等传统Web应用程序体系架构的有力替代品。

从本质上讲,Node.js是一个独立的JavaScript引擎,具有适合于通用编程的扩展,同时明确关注应用服务器开发。即使我们将Node.js与应用服务器平台进行比较,Node.js 也不是应用服务器。相反,Node.js是一个类似于Python、Go或Java SE的编程运行时。虽然Node.js能够编写Web应用程序框架和应用程序服务器,但Node.js只是一个执行JavaScript程序的系统。

Node.js的关键架构选择是事件驱动,而非多线程。Node.js体系结构依赖于将阻塞操作分派给单线程循环事件,将结果作为调用事件处理函数的事件返回给调用方。在大多数情况下,事件被转换为由异步函数处理的Promise。由于Node.js基于Chrome的V8 JavaScript引擎,因此在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等工具或AWS Lambda等功能在现代云基础设施上部署微型服务器。将大型应用程序划分为易于部署的大规模微服务时,Node.js运行非常良好。

让我们对Node.js进行更深入的了解。

Node.js的能力

Node.js是一个在Web浏览器之外编写JavaScript应用程序的平台。这不是我们在Web浏览器中熟悉的JavaScript环境!虽然Node.js执行的JavaScript语言与我们在浏览器中使用的JavaScript相同,但Node.js没有与浏览器相关的功能。例如,没有内置HTML DOM。

除了执行JavaScript的原生功能外,Node.js内置模块还提供以下功能:

  • 命令行工具(shell脚式)
  • 一种交互式终端风格的程序,即读-值-打印循环(REPL)
  • 优秀的进程控制功能,可监督子进程
  • 用于处理二进制数据的缓冲区对象
  • 具有全面的事件驱动回调的TCP或UDP套接字
  • DNS查找
  • 一个位于TCP库文件系统访问之上的HTTP、HTTPS和HTTP/2客户端服务器。
  • 通过断言内置的基本单元测试支持
    Node.js的网络层是低层级的,同时也非常简单易用。例如,你使用HTTP模块编写编写HTTP服务器或客户端只需几行代码。这是非常强大的,能让开发者非常容易地获得协议请求,并让你精确地实现那些应该在请求响应中返回的HTTP标头。

通常Web应用程序开发者不需要处理低级别的HTTP或其他协议;相反,我们倾向于更高效地使用更高级的接口,例如,对PHP开发者,由于Apache/Nginx/等已经提供了HTTP,所以他们不需要编写实现堆栈的HTTP服务器部分。相反,Node.js程序员则需要编写HTTP服务器,并在该服务器上运行应用程序代码。

为了简化HTTP服务器开发,Node.js社区有诞生了几个Web应用程序框架,如Express,提供了程序员常需的高级接口。你可以快速地使用内置功能(如sessions、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服务器的网站内容。
  • Web UI测试:Puppeter让你可以控制无标头Chrome Web浏览器实例。通过Puppeter,你可以使用功能齐全的现代Web浏览器开发Node.js脚本。一些典型的用法是Web抓取和Web应用程序测试。
  • 桌面应用程序:Electron和NodeWebKit(NW.js)都是用于开发Windows、macOS和Linux桌面应用程序的框架。这些框架利用Node.js库包装的大量的Chrome组件使用Web UI技术开发桌面应用程序。由于应用程序是使用HTML5、CSS3和JavaScript编写的,因此可以使用各种先进的Web框架,如Bootstrap、React、VueJS和AngularJS等。许多流行的应用程序都是使用Electron构建的,包括Slack桌面客户端应用程序,Atom、Microsoft Visual Code编辑器、Postman REST客户端、GitKraken GIT客户端和U盘系统镜像制作工具Etcher。
  • 移动应用程序:Node.js for Mobile Systems项目能够让你使用Node.js开发iOS和Android智能手机或平板电脑应用程序。苹果的App Store规则不允许接入具有JIT功能的JavaScript引擎,这意味着常规的 Node.js不能用于iOS应用程序开发。对于iOS应用程序开发,该项目使用Node.js-on-ChakraCore绕过App Store规则。对于Android应用程序开发,该项目在Android上使用常规Node.js。在撰写本文时,该项目正处于开发的早期阶段,但看起来很有希望。
  • 物联网(IoT):Node.js是物联网项目中非常流行的语言,Node.js运行在大多数基于ARM的单板计算机上。最最具代表性的例子是NodeRED项目。它提供了一个图形编程环境,允许你通过将区块连接在一起来绘制程序。它具有面向硬件的通用I/O(GPIO)机制,例如,与Raspberry Pi或Beaglebone单板计算机上的通用I/O(GPIO)引脚交互。

你可能已经在使用Node.js应用程序但是没有意识到这一点!JavaScript在Web浏览器之外有一席之地,这不仅仅归功于Node.js。

服务器端JavaScript

别再挠头了!当然,你可能正在这样做,并喃喃自语,“浏览器语言在服务器上能做什么呢?”事实上,JavaScript在浏览器之外有着漫长且基本未知的历史。JavaScript是一种编程语言,就像其他所有语言一样,最好的问题是“为什么JavaScript仍被困在Web浏览器中?”

早在Web混沌时代,编写Web应用程序的工具就处于初级阶段。在Java和PHP诞生的初期,一些开发人员使用Perl或TCL编写CGI脚本。即便如此,服务器端仍然有JavaScript的身影。最初使用JavaScript编写的Web应用服务器是Netscape的LiveWire服务器。微软ASP的一些版本使用JScript,这是微软自己开发的JavaScript版本。最近的一个JavaScript服务器器项目是Java的RingoJS应用程序框架。Java6和Java7都提供了RhinoJavaScript引擎。在Java8中,Rhino被抛弃,取而代之的是更新的Nashorn JavaScript引擎。

换句话说,浏览器之外的JavaScript并不是什么新鲜事,虽然并不常见。

你已经了解到Node.js是一个在Web浏览器之外编写JavaScript应用程序的平台。Node.js社区将该平台远用于大量的应用程序类型,远远超过最初为该平台设想的数量。这证明了Node.js的流行程度,但是我们仍然必须考虑使用Node.js的技术原因。

英文电子书推荐

Beginning iOS Game Center and GameKit: For iOS, tvOS, and MacOS, 2nd Edition

API Marketplace Engineering: Design, Build, and Run a Platform for External Developers

Azure Cloud Security for Absolute Beginners: Enabling Cloud Infrastructure Security with Multi-Level Security Options

More Java 17: An In-Depth Exploration of the Java Language and Its Features, 3rd Edition

Cognitive Behavior and Human Computer Interaction Based on Machine Learning Algorithms

NSX-T Logical Routing: Fortify Your Understanding to Amplify Your Success

Innovative SAP SuccessFactors Recruiting: A Guide to Creating Custom Integration and Automation

Simplifying Service Management with Consul: Overcome connectivity and security challenges within dynamic service architectures

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容