MEAN Web开发(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-04 09:31:50

点击下载

作者:哈维夫(Amos Q. Haviv)

出版社:人民邮电出版社

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

MEAN Web开发

MEAN Web开发试读:

前言

回首1995年春天,那时的浏览器与现在大不一样。万维网面世已有4年(标志是Tim Berners-Lee编写的第一个浏览器),距离Mosaic浏览器的首次发布已有两年,而Internet Explorer 1.0过几个月也要发布了。万维网开始显露出流行的迹象,虽然一些大公司对这一领域也表现出兴趣,但当时真正有所作为的却是一家名为Netscape的小公司。

Netscape当时广受欢迎的浏览器Netscape Navigator正在进行第2版的开发,而此时客户端工程师团队和联合创始人Marc Anderseen决定在Navigator 2.0中嵌入一种编程语言。这一任务分配给了软件工程师Branden Eich,从1995年5月6日至5月15日,他用了10天时间就完成了。这一语言被命名为Mocha ,后来改名为LiveScript,并最终定名为JavaScript。

1995年9月,Netscape Navigator 2.0发布,它改变了大家对浏览器的看法。至1996年8月,Internet Explorer 3.0实现了对JavaScript的支持。同年11月,Netscape宣布他们已经将JavaScript提交到ECMA进行标准化。1997年6月,ECMA-262规范公布,使得JavaScript成为事实上的Web标准编程语言。

多年来,JavaScript被很多人贬低为业余爱好者使用的编程语言。JavaScript的架构、碎片化的实现以及最初的“业余”受众,使得专业程序员都把它忽视了。直到AJAX的出现,以及2005年左右Google发布了Gmail和Google Maps,此时AJAX技术可以将Web网站转换成Web应用的形势才突然明朗起来。这鼓舞着新一代Web开发人员推动JavaScript的开发,使它更上一层楼。

首先是第一代工具库问世了,比如jQuery和Prototype。不久,Google在2008年年底又发布了Google Chrome和它使用的V8 JavaScript引擎。V8的即时编译器极大提升了JavaScript的性能。这开启了JavaScript开发的新纪元。

2009年是JavaScript发生翻天覆地变化的一年:Node.js等平台使开发人员可以在服务器上运行JavaScript;MongoDB等数据库普及并简化了JSON存储;AngularJS等框架开始使用强大的新一代浏览器。JavaScript从面世到无所不在,用了将近20年时间。曾经被“门外汉”用来执行小脚本的编程语言,如今已经成为世界上最流行的编程语言之一。不断丰富的开源协作工具,连同乐于奉献的天才工程师们,创造出了世界上最有价值的社区之一。而这些贡献者们种下的种子,如今正以涌泉般的创造力蓬勃生长。

这一变革的影响是巨大的。过去的开发团队是分立的,每个人都是各自领域的专家,现在全部都使用同一种语言进行更加精益、更加敏捷的软件开发,成为了一个统一的团队。

如今已经有许多的JavaScript全栈开发框架,有些由伟大的团队所开发,有些解决了很重要的问题,但没有一个像MEAN这样开放而又兼具模块化。MEAN的理念很简单,用MongoDB作为数据库,Express作为Web框架,AngularJS作为前端框架,Node.js作为平台,并运用模块化的方法将它们整合在一起,以保证其符合现代软件开发的灵活性。MEAN方法依赖于其各开源模块的社区,这保持了它的更新和稳定,并确保即使某一模块无法使用,也可以用更适合的模块无缝替换。

欢迎你参与到JavaScript的变革中,我保证将尽全力帮助你成为一个JavaScript全栈工程师。

在本书里,我们将帮你配置开发环境,说明怎样用最合适的模块来连接MEAN的各个组件。我们会介绍保持代码简单、清晰以及避免常见问题的最佳实践。我们还会讲解如何创建你的身份验证层,并添加首个实体。你会学到如何在创建服务器端和客户端应用程序之间的实时通信时,利用JavaScript的非阻塞架构。最后,我们还会向你展示如何用适当的测试来测试代码,以及使用哪些工具来使开发过程自动化。本书主要内容

第1章“MEAN简介”,让你初识MEAN,并学会在不同的操作系统上安装MEAN。

第2章“Node.js入门”,介绍Node.js的基础知识,以及如何用它进行Web应用开发。

第3章“使用Express开发Web应用”,说明如何创建和构造一个遵循MVC模式的Express应用。

第4章“MongoDB入门”,解释MongoDB的基本理论,以及如何用它来存储你的应用程序数据。

第5章“Mongoose入门”,演示如何在Express应用中使用Mongoose来连接MongoDB数据库。

第6章“使用Passport模块管理用户权限”,介绍如何管理用户身份验证和提供多种不同的登录选项。

第7章“AngularJS入门”,阐述如何实现一个与Express应用协同的AngularJS应用。

第8章“创建MEAN的CURD模块”,解释如何编写和使用MEAN应用中的各种实体。

第9章“基于Socket.io的实时通信”,展示如何在客户端与服务器间创建和使用实时通信。

第10章“MEAN应用的测试”,介绍如何针对MEAN应用的不同部分进行自动化测试。

第11章“MEAN应用的调试与自动化”,解释如何让你的MEAN应用更发更加高效。阅读本书的前提

本书适合对HTML、CSS和现代JavaScript开发有一定了解的初级和中级Web开发人员。本书读者

对使用MongoDB、Express、AngularJS和Node.js开发现代Web应用有兴趣的Web开发人员。排版约定

在本书中,你会发现一些不同的文本样式,用以区别不同种类的信息。下面是这些样式的一些例子和解释。● 楷体表示新术语。● 等宽字体表示程序中使用的变量名、关键字。

代码段格式如下所示:var message = 'Hello';exports.sayHello = function(){ console.log(message);}

当我们希望你注意代码块中的某些部分时,相关的行或者文字会被加粗:var connect = require('connect');var app = connect();app.listen(3000);console.log('Server running at http://localhost:3000/');

命令行输入或输出如下所示:$ node server这个图标表示警告或需要特别注意的内容。这个图标表示提示或者技巧。读者反馈

欢迎提出反馈。如果你对本书有任何想法,喜欢它什么,不喜欢它什么,请让我们知道。要写出真正对大家有帮助的图书,读者的反馈很重要。

一般的反馈,请发送电子邮件至feedback@packtpub.com,并在邮件主题中包含书名。

如果你有某个主题的专业知识,并且有兴趣写成或帮助促成一本书,请参考我们的作者指南http://www.packtpub.com/authors。客户支持

现在,你是一位令我们自豪的Packt图书的拥有者,我们会尽全力帮你充分利用你手中的书。下载示例代码

你可以用你的账户从http://www.packtpub.com下载所有已购买Packt图书的示例代码文件。如果你从其他地方购买本书,可以访问http://www.packtpub.com/support并注册,我们将通过电子邮件把文件发送给你。勘误表

虽然我们已尽力确保本书内容正确,但出错仍旧在所难免。如果你在我们的书中发现错误,不管是文本还是代码,希望能告知我们,我们不胜感激。这样做,你可以使其他读者免受挫败,帮助我们改进本书的后续版本。如果你发现任何错误,请访问http://www.packtpub.com/submit-errata提交,选择你的书,点击勘误表提交表单的链接,并输入详细说明。勘误一经核实,你的提交将被接受,此勘误将上传到本公司网站或添加到现有勘误表。从http://www.packtpub.com/support选择书名就可以查看现有的勘误表。侵权行为

版权材料在互联网上的盗版是所有媒体都要面对的问题。Packt非常重视保护版权和许可证。如果你发现我们的作品在互联网上被非法复制,不管以什么形式,都请立即为我们提供位置地址或网站名称,以便我们可以寻求补救。

请把可疑盗版材料的链接发到copyright@packtpub.com。

非常感谢你帮助我们保护作者,以及保护我们给你带来有价值内容的能力。问题

如果你对本书内容存有疑问,不管是哪个方面,都可以通过questions@packtpub.com联系我们,我们将尽最大努力来解决。第1章MEAN简介

MEAN是一个强大的JavaScript全栈解决方案,它由四大组件组成:数据库MongoDB、Web服务器框架Express、Web客户端框架AngularJS,以及服务器平台Node.js。这些组件由不同的团队开发,由开发人员和倡导者组成的社区推动各个模块的开发,并为其创建相关文档。MEAN的主要优势在于其以JavaScript为主要的编程语言。但是,将这些组件结合起来会导致扩展和架构问题,这会极大影响开发过程。

本书将介绍搭建MEAN应用的最佳实践以及搭建过程中存在的一些已知问题。在真正开始MEAN开发前,首先需要配置环境。本章仅涉及一点编程概述,主要介绍如何正确搭建MEAN应用基本环境。学完本章,你将知晓如何在常见的操作系统上安装和配置MongoDB及Node.js,以及如何使用Node.js的包管理器。本章主要包含如下内容:● MEAN的架构介绍;● 在Windows、Linux及Mac OS X上安装和运行MongoDB;● 在Windows、Linux及Mac OS X上安装和运行Node.js;● Node.js包管理器(NPM)介绍,以及如何使用它来安装Node模

块。1.1 三层Web应用开发

大多数Web应用都采用了三层架构,包括数据层、逻辑层和展现层。Web应用的应用结构通常分为数据库、服务器和客户端,而在现代Web开发中,它还可以分为数据库、服务器逻辑、客户端逻辑和客户端UI。

MVC架构是实现三层架构的一种比较流行的范式。在MVC范式中,逻辑、数据与显示分别被转化为三种对象,每个对象都有其独特的功能。视图(View)控制显示部分,处理用户交互。控制器(Controller)响应系统和用户事件,支配模型和视图作出相应的变化。模型(Model)负责数据操作,根据控制器的指令对数据请求和状态修改作出响应。下图简单地描述了MVC。

常规MVC架构的通信

在过去25年的Web开发中,很多创建三层Web应用的技术流行起来,在这些已经普遍存在的技术中,你可能听说过LAMP、.NET,以及其他很多框架或工具。但这些技术最大的问题是每层都有各自的知识基础要求,而这些要求往往又超出了单个开发人员的能力所及,这一点会迫使团队规模超出实际所需,效率也会相应降低,并且会带来各种未知的风险。1.2 JavaScript的演进

JavaScript是一个专为Web创造的解释型编程语言。在最早被Netscape Navigator浏览器支持之后,JavaScript成为浏览器执行客户端逻辑的编程语言。在21世纪的第一个十年中期,网站到Web应用的转换,以及高速浏览器的发布,促使使用JavaScript编写更为复杂的应用程序的开发人员社区逐步形成。这些开发人员开始编写一些库和工具来缩短开发周期,并创造出了新一代更为高端的Web应用,同时也带来了对更高速浏览器的持续需求。这一循环持续了很多年,浏览器厂商不断改进他们的浏览器,JavaScript程序员又不断地提出新的需求。真正的革命始于2008年,当时Google发布了Chrome浏览器,还带来了更迅速的即时编译器——JavaScript V8引擎。Google的V8引擎大大提升了JavaScript的执行效率,进而彻底改变了Web应用的开发过程。更重要的是,V8引擎是开源的,允许开发人员在浏览器之外重新塑造JavaScript。Node.js是这次革命的第一批产物之一。

在尝试了很多其他选择后,程序员Ryan Dahl发现V8引擎刚好适合他的非阻塞I/O试验品Node.js。该试验品的理念很简单,为开发人员创建一个非阻塞的程序,让他们更好地利用系统资源并编写出更具响应性的应用程序。最终通过利用JavaScript的非阻塞特性,一个极小但是功能强大,且独立于浏览器的平台被搭建出来。Node简炼的模块系统使得开发人员能够通过利用第三方模块自由地扩展平台,从而使几乎所有功能得以实现。在线社区的反作用促进了多种工具的创建,从现代Web框架到机器人服务平台等。然而,服务器端JavaScript仅仅是一个开始。

2007年,已经在Web应用开发中积累了大量经验的Dwight Merriman和Eliot Horowitz,开始联手打造一个可扩展的虚拟主机解决方案。但是结果不尽人意,因此在2009年,他们决定将平台切分后开源,其中包括基于V8的数据库——MongoDB。MongoDB的名字来源于humongous,它是一个使用类JSON动态模式数据模型的可扩展NoSQL数据库。通过使开发人员能够灵活处理复杂数据,以及提供关系数据库的一些特性,如高级查询和易扩展性,MongoDB备受瞩目。而其所提供的特性最终使MongoDB成为NoSQL数据库主导解决方案之一。JavaScript又一次打破了边界。然而JavaScript的革命者们没有忘记他们的初衷,事实上,现代浏览器的流行创造了JavaScript前端框架开发的新浪潮。

2009年,Miško Hevery和Adam Abrons在搭建一个以JSON提供服务的平台时发现,仅靠JavaScript通用类库已经远远无法满足需求。这个平台的富Web应用特性需要一个可以减少枯燥工作,并能维护现有代码库的结构化框架。在放弃了最开始的打算后,他们决定开发一个满足这一需求的前端框架——AngularJS,并将其开源。想法是将HTML和JavaScript更好地融合在一起,并支持推广单页应用开发。最终一个富Web框架诞生了,它将双向数据绑定、跨组件依赖注入、基于MVC的组件等概念带到了Web前端开发人员面前。AngularJS和其他MVC框架彻底改变了Web前端开发,将一度难以维护的前端代码转化为支持测试驱动开发(TDD)等高级开发模式的有组织的代码库。

借助不断丰富的开源协作工具,乐于奉献的天才工程师们创造了世界上最有价值的社区之一。更重要的是,这些主要变革使得在三层Web应用开发中,所有层的编程语言全部统一到JavaScript上来——这一理念被称之为全栈JavaScript,MEAN是这一理念的硕果之一。1.3 MEAN简介

MEAN是MongoDB、Express、AngularJS和Node.js的缩写。其理念是仅使用JavaScript一种语言来驱动整个应用。其最鲜明的特点有以下几个:● 整个应用只使用一种语言;● 整个应用的所有部分都支持MVC架构,而且都必须使用MVC架

构;● 不再需要对数据结构进行串行化和并行化操作,只需使用JSON

对象来进行数据封装即可。

但是,依然有一些很重要的问题等待我们去探索答案。● 怎样将所有组件连接在一起?● Node.js是一个由众多模块组成的庞大生态系统,那么我们该选

择哪些模块使用呢?● JavaScript是范式不可知的,那么怎样维护应用的MVC结构?● JSON是一个不需要定义模型的数据结构,那么应该在何时以怎

样的方式对数据进行建模?● 怎样处理用户的身份验证?● 怎样用Node.js的非阻塞架构来进行实时交互?● 怎样测试MEAN的代码库?● 有哪些JavaScrip开发工具可以用来加速MEAN应用的开发?

本书要解决的问题远不止这些,但在开始之前,首先需要安装一些必备的工具。1.4 安装MongoDB

如果想要安装MongoDB的稳定版,最简单的办法是去MongoDB的官方网站上下载二进制安装文件,该网站分别提供了与Linux、Mac OS X和Windows相应的版本。务必注意,你下载的版本必须与你的操作系统架构相对应。如果你的操作系统是Windows或者Linux,请根据你的系统架构下载32位或者64位版本,如果是Mac OS X则最好下载64位版本。注意MongoDB的版本号规则是,偶数标明的是稳定版,因

此2.2.x和2.4.x都是稳定版,而2.1.x和2.3.x则是非稳定版,

不能用于生产环境。目前最新的稳定版是2.6.x。

在MongoDB的下载页面(http://mongodb.org/downloads),下载包含有二进制安装文件的压缩包。下载完成之后,将压缩包解压。mongod文件通常位于bin目录下。mongod进程运行的是MongoDB服务器的主进程,它可以作为一个独立的服务器,也可以作为MongoDB主从复制集中的从结点。在这里,我们将MongoDB作为一个独立服务器。mongod进程需要一个存储数据库文件的文件夹,其文件夹默认为/data/db,还需要一个监听服务器端口,其默认端口为27017。在接下来的几个小节中,我们将从最常用的Windows开始,来逐步了解MongoDB在不同操作系统中的安装过程。注意与MongoDB相关的更多信息,请参见MongoDB的官方

文档库(https://mongodb.org)。1.4.1 在Windows上安装MongoDB

从MongoDB官网上下载与你的操作系统相对应的安装文件后,将其解压,并移动到c:\mongodb路径下。在Windows系统中,MongoDB默认的数据文件存储目录为C:\data\db 。在命令提示符窗口中,进入到c:\下,输入如下的命令:> md data\db提示你也可以在启动mongod时,通过--dbpath这个命令行参

数来指定数据文件存储目录。

将MongoDB的文件放在正确的位置,并且创建好数据存储目录后,安装即完成。有以下两种方式来运行MongoDB的主服务。

1. 手动运行MongoDB服务

想要手动运行MongoDB,只需要运行二进制文件mongod即可。打开命令提示符窗口,运行如下命令:> C:\mongodb\bin\mongod.exe

上面的命令可以启动MongoDB服务,监听27017端口。如果一切正常,你将会看到与下图类似的命令行输出。

在Windows上启动MongoDB服务

当Windows安全级别较高时,将会弹出提示你禁止相关服务功能的安全警告。在遇到这种情况时,请选择一个私有网络并点击允许访问(Allow Access)。注意你应该了解的是,作为一个独立的服务,MongoDB在

任何当选目录下都能正常运行。

2. 以Windows系统服务方式运行MongoDB

运行MongoDB,更常规的做法是在每次系统启动后自动运行该服务。设置以系统服务启动MongoDB,需要为MongoDB的日志和配置文件指定一个存储路径,运行以下命令创建该路径:> md C:mongodb\log

接下来,可以通过运行--logpath命令来创建MongoDB的配置文件。在命令提示符窗口中,输入如下命令:> echo logpath=C:\mongodb\log\mongo.log > C:\mongodb\mongod.cfg

配置文件创建完成后,以管理员权限打开一个新的命令提示符窗口。方法是在开始菜单或者资源管理器中找到命令提示符的图标,单击右键并选择以管理员身份运行(Run as administrator)。在新的命令提示符窗口中,运行如下命令安装MongoDB服务:> sc.exe create MongoDB binPath= "\"C:\mongodb\bin\mongod.exe\" --service --config=\"C:\mongodb\mongod.cfg\"" DisplayName= "MongoDB 2.6" start= "auto"

服务创建成功后,将会输出如下所示的日志信息:[SC] CreateService SUCCESS

注意,要想系统服务成功安装,包含logpath参数的配置文件必须正确创建。安装完MongoDB服务后,以管理员权限打开命令提示符窗口,你可以通过运行如下命令来启动该服务:> net start MongoDB提示下载示例代码如果是通过Packt账号购买的Packt图书,可以在http://

www.packtpub.com上下载相关的示例代码文件。如果是其

他方式,可以访问http://www.packtpub.com/support,然后注

册申请,以邮件方式获取其示例代码文件。

注意,如有需要,可以对MongoDB的配置文件进行修改。详情请参见http://docs.mongodb.org/manual/reference/configuration-options/。1.4.2 在Mac OS X和Linux上安装MongoDB

这部分将介绍在Unix系统上安装MongoDB的几种方法。下面从最简单的方法开始讲述——使用下载的MongoDB已预编译二进制文件。

1. 使用二进制文件安装MongoDB

除了从http://www.mongodb.org/downloads上下载与操作系统相应的二进制文件外,也可以用下面的命令使用CURL来下载:$ curl -O http://downloads.mongodb.org/osx/mongodb-osx-x86_64-2.6.4.tgz

上述命令下载的是Mac OS X 64位版。根据操作系统的不同,需要对这个命令中的下载地址进行相应的修改。文件下载完成后,可以通过下面的命令来解压:$ tar -zxvf mongodb-osx-x86_64-2.6.4.tgz

使用下面的命令简化解压后的文件夹名:$ mv mongodb-osx-x86_64-2.6.4 mongodb

MongoDB的数据文件存储在其默认文件夹下,在Mac OS X和Linux系统中,该默认文件夹的路径为/data/db。在命令行工具中运行如下的命令:$ mkdir -p /data/db注意创建文件夹时可能会出现一些权限问题,使用sudo或

者超级用户来运行上述的命令即可。

上述命令的-p参数会逐级创建目录,因此该命令会创建文件夹data和db。需要注意的是,所创建的文件夹并不处于home目录下。运行如下命令,确保设置了该文件夹的权限:$ chown -R $USER /data/db

一切就绪之后,在命令行工具中,进入到MongoDB所在目录的bin文件夹,启动mongod服务:$ cd mongodb/bin$ mongod

这就启动了MongoDB服务,并开始监听27017端口。如果一切正常,将显示类似于下图的命令行输出:

在Mac OS X上启动MongoDB服务

2. 使用包管理器安装MongoDB

某些情况下,使用包管理器安装MongoDB是最简便的方法。不过缺点是有些包管理器并没有提供对最新版本的支持。好在MongoDB团队维护着针对RedHat、Debian和Ubuntu的官方包,并支持Mac OS X的Hombrew包管理器。请注意,为下载MongoDB服务器官方软件包,必须对配置包管理器库进行配置。

要在Red Hat Enterprise、CentOS和Fedora上使用Yum安装,请参阅http://docs.mongodb.org/manual/tutorial/installmongodb-on-red-hat-centos-or-fedora-linux/。

要在Ubuntu上使用APT安装MongoDB,请参阅http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/。

要在Debian上使用APT安装MongoDB,请参阅http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/。

要在Mac OS X上使用Homebrew安装MongoDB,请参阅http://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/。1.4.3 使用MongoDB命令行工具

MongoDB压缩包里包含一个MongoDB命令行工具,可以用它来使用命令行与运行中的服务实例进行交互。进入MongoDB的bin目录,运行mongo服务即可启动。$ cd mongodb/bin$ mongo

只要MongoDB安装无误,命令行工具将自动使用test数据库连接本地服务实例。命令行将会有类似于下图的输出:

}在Mac OS X上运行MongoDB命令行工具

运行如下命令进行数据库测试:> db.articles.insert({title: "Hello World"})

上述命令将创建一个名为article的集合,并插入一个包含title属性的JSON对象。执行如下命令检索article集合中的对象:> db.articles.find()

命令行将会有如下的输出:{ _id : ObjectId("52d02240e4b01d67d71ad577"), title: "Hello World " }

大功告成!这表明MongoDB实例已经正常运行,并且成功地通过MongoDB命令行工具与之交互。在后面的章节中,将会进一步介绍MongoDB及MongoDB命令行工具的使用。1.5 安装Node.js

安装Node.js稳定版本最简单的办法也是使用二进制文件,Node.js官方网站上提供了下载地址,可用于Linux、Mac OS X和Windows系统。同样要注意下载与目标操作系统架构一致的文件。如果你使用的是Windows和Linux,则要注意对32位和64位版本的选择。基于安全的考虑,Mac用户应选择64位版为宜。注意Node.js的版本号模式与MongoDB一致,版本号为偶数

的是稳定版,如0.8.x和0.10.x都是稳定的,而0.9.x和0.11.x

则不应用于生产环境。目前最新的稳定版是0.10.x。1.5.1 在Windows上安装Node.js

在Windows上安装Node.js是项很简单的任务,使用一个单独的安装程序即可完成。第一步,在http://nodejs.org/download/上下载正确的.msi文件,注意有32位和64位版本的区分,下载时选择与操作系统架构相应的版本。

运行下载的安装程序,如果弹出了安全警告窗口,点击运行(Run)即可启动安装向导,接着与下图类似的安装界面将会出现:

Windows中的Node.js安装向导

点击Next即可开始安装。片刻之后,与下图类似的安装成功提示将会出现。

Windows中的Node.js安装成功确认1.5.2 在Mac OS X上安装Node.js

在Mac OS X上使用一个单独的安装程序即可简便完成Node.js的安装。用于安装的.pkg文件可在http://nodejs.org/download/上下载。

下载完成后,运行安装程序即可看到与下图类似的安装界面:

Mac OS X上Node.js安装向导

点击Continue即可开始安装。安装程序需要你确认许可证协议和选择目标文件夹。选择最佳选项之后再次点击Continue按钮,安装程序需要你确认安装信息,并要求你输入系统用户密码。片刻之后,与下图类似的界面将会出现,提示你Node.js安装成功。

Mac OS X上Node.js安装成功确认1.5.3 在Linux上安装Node.js

在Linux上安装Node.js,需要在官网上下载tarball包文件。最好的办法是下载最新的源代码,然后编译并生成安装文件再安装。先到http://nodejs.org/download/下载.tar.gz文件,使用如下命令对文件进行解压并安装:$ tar -zxf node-v0.10.31.tar.gz$ cd node-v0.10.31$ ./configure && make && sudo make install

如果一切正常,Node.js即安装完成。注意上述命令是用于0.10.31这个版本的。请注意在运行该命令之前将此数字替换为你所下载的版本的版本号。对于安装中遇到的任何问题,可以查阅Node.js团队创建的安装选项文档,地址是:https://github.com/joyent/node/wiki/installation。注意你可以通过访问https://nodejs.org上的官方文档了解更

多关于Node.js的信息。1.5.4 运行Node.js

安装完成后,可以通过Node.js提供的命令行界面(Commond-Line Interface,CLI)使用Node.js。在命令行工具中执行如下命令:$ node

这便可启动Node.js的命令行界面,它可以接收JavaScript语句的输入。测试安装是否成功,运行如下命令:> console.log('Node is up and running!');Node is up and running!undefined

执行成功!不过最好再试试JavaScript文件的执行。创建一个名为application.js的文件,然后在文件中输入如下代码:console.log('Node is up and running!');

执行如下命令将上述文件名设置为Node命令行界面的第一个参数,即可运行该文件:$ node application.jsNode is up and running!

执行完成!你的第一个Node.js应用创建成功。使用CTRL+D或者CTRL+C退出Node命令行界面。1.6 NPM简介

Node只是一个平台,它的功能和API将只是一个最小集。想获得更多的功能,可以使用模块系统来扩展平台。安装、更新和删除Node.js模块最好的方法是使用NPM工具。NPM有如下两个主要特性:● 作为包注册登记中心,用于第三方模块的查阅、下载和安装;● 作为命令行界面,用于管理项目或系统全局的包。

通常情况下,安装Node.js时即一并安装了NPM,我们就直接开始用它吧。NPM使用

为了理解NPM是如何工作的,可以先试着安装一下后面的章节将会用到的Express这个Web框架。NPM是一个稳健的包管理器,它集中注册了公开的模块。你可以通过访问官方网站https://npmjs.org/浏览所有可用的公开包。

大多数注册到登记中心的包都是开源的,由Node.js社区开发人员提供。在开发一个开源的模块时,包的作者可以决定是否将其发布到集中注册登记中心,以便让其他开发人员下载并用于各自的项目中。在包配置文件中,包作者会选择一个唯一标示符作为包的名字,以用于包的下载。注意你可以通过访问https://npmjs.org上的官方文档了解更多

关于Node.js的信息。

1. NPM的安装过程

务必注意,NPM有两种安装模式:本地和全局。常规的做法是将第三方包以本地模式安装到应用目录下的node_modules文件夹中,这也是NPM默认的安装模式。它不会影响到系统全局,更不会增加一些不必要的全局文件而污染系统。

全局模式用来安装需要作为全局使用的Node.js的安装包。通常这些包都是一些命令行工具,比如后面的章节将会涉及的Grunt。通常情况下,这些包的作者会给出明确提示,这些包需要全局安装。因此,当无法确认使用哪种安装模式时,就选择本地模式。全局模式安装的模块可以用于本系统中所有Node.js应用,类Unix系统中的安装路径一般为/usr/local/lib/node_modules,Windows中的一般为C:\Users\%USERNAME%\AppData\Roaming\npm\node_modules。

(1) 使用NPM安装包

找到需要安装的安装包之后,可以使用如下命令来安装:$ npm install

全局安装模式与本地安装模式类似,只需要加一个-g参数:$ npm install -g 注意如果当前用户没有权限进行全局模式安装,使用root用

户或者sudo进行安装即可。

例如,我们想在本地安装Express,首先进入应用所在目录,然后执行如下命令:$ npm install express

上述命令将在本地的node_modules目录中安装Express的最新稳定版。此外,NPM还支持多种语义的版本号,在安装某一指定版本时,如下所示运行npm命令进行安装:$ npm install @

例如,要安装Express的第二个大版本,可以使用如下命令:$ npm install express@2.x

这样便可安装Express 2的最新稳定版。上述命令格式支持NPM下载并安装Express 2的任意次要版本。想要了解更多关于所支持的语义版本语法的信息,请访问https://github.com/isaacs/node-semver。

如果需要安装的包存在依赖软件包,NPM会自动安装其所依赖的包,并在包的文件夹内创建node_modules,用以存储依赖包。在上述例子中,Express的依赖包将会安装到node_modules/express/node_modules中。

(2) 使用NPM删除包

要删除所安装的包,首先进入应用所在文件夹,并执行如下命令即可:$ npm uninstall < Package Unique Name>

NPM会根据指定的安装包名称查找包,找到之后可以从本地的node_nodules目录中删除它。要想删除一个全局包,增加一个-g参数即可,如下所示:$ npm uninstall –g < Package Unique Name>(3) 使用NPM更新包

想要将包更新到最新版,执行如下命令:$ npm update < Package Unique Name>

不管本地是否存在这个包,NPM都会去下载和安装该指定包的最新版。要想更新一个全局包,执行如下命令:$ npm update –g < Package Unique Name>

2. 使用package.json管理依赖

安装一个包很简单,但很快,你的应用会需要用到一些依赖包,这时就需要一个更好的方法管理这些依赖包。基于这一目的,NPM支持通过使用配置文件来定义应用的各个元数据属性,如应用的名称、版本、作者名字等。该配置文件名为package.json,存储于应用根目录下。除自定义的应用外,它还可以用来自定义应用的依赖。

package.json文件是一个JSON文件,应用的属性以键值的方式存储在其中。

一个使用Express和Grunt最新版的应用的package.json是这样定义的:{ "name" : "MEAN", "version" : "0.0.1", "dependencies" : { "express" : "latest", "grunt" : "latest" }}注意应用的名字和版本号是必填项,去掉这两个属性将会影

响到NPM的使用。

(1) 创建package.json文件

除了手动创建package.json文件,还有一种更简单的方法,那就是使用npm init命令。在命令行工具中输入如下命令:$ npm init

NPM会提出一些关于应用的问题,并自动创建一个新的package.json文件。示例创建过程类似于下图所示:

在Mac OS X中使用NPM init

上述文件创建完成后,可以修改该文件并添加一些相关的依赖属性。一般的package.json格式如下:{ "name": "MEAN", "version": "0.0.1", "description": "My First MEAN Application", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "MongoDB", "Express", "AngularJS", "Node.js" ], "author": "Amos Haviv", "license": "MIT", "dependencies": { "express": "latest", "grunt": "latest" } }注意上述示例代码中使用了latest作为关键字,以便NPM能

够安装这些包的最新版。但是,为避免在开发周期内应用依

赖包不断发生变化,我们强烈建议你指定一个具体的版本号

或者版本号范围。原因在于一些包的新版本并不一定会向前

兼容旧版本,这将会给你的应用带来极大的影响。

(2) 安装package.json中的依赖

创建完package.json文件后,就可以用它来安装应用的依赖了。进入应用的根目录,在命令行中执行npm install命令,如下所示:$ npm install

NPM会自动检测到已存在的package.json文件,并根据该文件中的配置将应用的依赖安装到本地的node_modules文件夹中。另外一个安装应用依赖的方法是使用npm update命令,而且在某些情况下,这种方法更为简便。如下所示:$ npm update

这样既可保证所有的包都会被安装,又能将已安装的包更新到其指定的版本(或版本范围)。

(3) 更新package.json文件

npm install命令还有一个强大的功能,那就是在安装包的同时,将包的信息保存到package.json的依赖关系中。只需要在安装包的时候加上--save参数即可。例如,要安装最新版的Express并将其加入到依赖关系中,执行如下命令即可:$ npm install express --save

NPM将安装最新版的Express,并在package.json中添加对Express的依赖。在后面的章节中,为了便于理解,我们将手动编辑package.json文件。但这一特性在日常开发中是有效的。注意关于更多NPM配置文件相关选项的说明,请参见https://

npmjs.org/doc/json.html上的官方文档。1.7 总结

本章中,你学到了如何安装MongoDB及使用命令行工具连接本地的数据库实例。也学到了如何安装Node.js以及使用Node.js命令行工具。还了解了NPM,以及如何使用NPM下载和安装Node.js包,如何使用package.json文件轻松地管理应用的依赖。下一章中,我们将讨论Node.js基础知识,以及如何创建Node.js Web应用。第2章Node.js入门

上一章介绍了如何配置你的开发环境,并讨论了一些基本的Node.js开发原则。本章将介绍怎样创建Node.js Web应用。你将会了解到JavaScript的基本特性——事件驱动,以及如何运用这一特性来搭建Node.js应用。你还将了解到Node.js的模块系统,以及如何创建你的第一个Node.js Web应用。接下来还会学习Connect模块以及它强大的中间件方法。学完本章,你将知道如何利用Connect和Node.js创建简单而强有力的Web应用。本章主要包含如下几个主题:● Node.js简介● JavaScript的闭包和事件驱动编程● Node.js事件驱动Web开发● CommonJS模块和Node.js模块系统● Connect Web框架简介● Connect的中间件模式2.1 Node.js简介

在2009年JSConf的欧洲分会上,Ryan Dahl上台介绍了他的Node.js项目。自2008年起,Dahl开始关注当时的Web潮流并发现了Web应用运作中的奇怪之处。几年前面世的AJAX将静态网站转化为动态Web应用,但Web开发的基本构件并没有与时俱进。其问题在于当时的Web技术并不支持浏览器和服务器之间的双向通信。其中,Flickr的文件上传系统就是一个典型的例子。由于服务器无法获取所要上传的文件的具体情况,导致浏览器无法将这一上传过程在进度条上显示出来。

Dahl的想法是创建出一个能够支持从服务器到浏览器进行数据推送的Web平台,然而这一想法实施起来并不简单。在常规的Web应用中,Web平台需要支持成百乃至上千服务器到浏览器间的持续性连接。大多数平台都通过使用开销高昂的线程来处理请求。这意味着为了保持连接,一大堆空闲线程将会被打开。对此Dahl另辟蹊径。他发现使用非阻塞的socket将会节省大量的系统资源,甚至还证明了这一技术通过C语言就可以实现。但是鉴于该技术可以使用多种语言来实现,同时Dahl认为用C语言来进行非阻塞编程既冗长又乏味,于是他决定寻找一种更合适的编程语言。

Google在2008年年底发布了Chrome和新的V8 JavaScript引擎。显而易见,JavaScript的运行速度较之从前有了很大的提升。相比其他JavaScript引擎,V8最大的优点在于,在执行JavaScript代码之前,V8会将其编译成本地代码。再加上其他方面的优化性,JavaScript成为身具执行复杂任务可行性的编程语言。Dahl意识到了这一点,并决定做一个新的尝试——在JavaScript中运用非阻塞socket。他将V8引擎用C代码封装起来,创建了Node.js的第一个版本。

在获得开发社区的强烈反响之后,Dahl开始扩展Node核心。V8引擎最初的设计并不是用在服务器环境中的,因此Node.js需要对其进行扩展,以便让它能够更好地适应服务器环境。比如,浏览器通常不需要访问文件系统,但在服务器中这却是必备的功能。最终,Node.js不仅成为了JavaScript执行引擎,它还成为一个可以运行编码简单、性能高效、扩展简易的复杂JavaScript应用平台。2.1.1 JavaScript事件驱动编程

Node.js利用JavaScript的事件驱动特性来支持平台中的非阻塞操作,这使得平台具有了超凡的性能。JavaScript是一种事件驱动的语言,这意味着如果为某一特定事件进行代码注册,当事件触发时,代码便会执行。这一理念支持无缝运行异步代码,同时不会阻塞程序其他部分的运行。

为了更好地理解这一点,我们先来看看下面这段Java代码:System.out.print("What is your name?");String name = System.console().readLine();System.out.print("Your name is: " + name);

上述例子中,程序会先执行第一行和第二行,然后停下,在用户输入名字之后继续执行第三行。这就是同步编程,I/O操作会阻塞程序其余部分的运行。但是,JavaScript并不是这样运行的。

JavaScript自设计之初是为了支持浏览器操作,因此它是基于浏览器事件的。其实在很久前JavaScript就完成了这一巨大的进步,即允许浏览器将HTML的用户事件委托给相应的JavaScript代码。请看下面这段HTML代码:What is your name?

上述代码示例中,一个文本框和一个按钮将被创建出来。当按钮被按下时,会弹出一个包含文本框内文字的警告,用以监控addEventLister()方法这一主要功能。该方法包含两个参数,一个是事件名字,一个是在事件触发时执行的匿名函数。第二个参数通常被称为回调函数。注意,不管我们在回调函数中写了什么代码,addEventListener()方法之后的代码都会直接执行,而不用等回调函数执行完毕。

上述示例阐明了JavaScript是如何通过事件来执行指令集的。因为浏览器是单线程的,所以如果使用同步编程来实现这个例子,页面里的其他部分将会僵死,从而导致网页反应迟钝,损害用户网络体验。值得庆幸的是,JavaScript并不是这样运作的。浏览器使用内循环(inner loop),通常称之为事件轮询(event loop),操控线程来执行整个JavaScript代码。事件轮询是一个由浏览器无限期运行的单线程循环。每当触发一个事件,浏览器就将其加到事件队列。事件轮询接着从事件队列中取出下一个事件,执行事件注册对应的处理函数。事件轮询执行完所有处理函数,便继续处理下一事件,如此往复,不断推进。下图将这一过程进行了图形化:

事件轮询周期

浏览器执行的通常都是用户触发的事件(如单击按钮),而Node.js则执行着不同来源的各类事件。2.1.2 Node.js事件驱动编程

在开发服务器逻辑时,你可能会注意到,大部分的系统资源会浪费在阻塞代码上。举个例子,请看下面这段PHP的数据库操作代码:$output = mysql_query('SELECT * FROM Users');echo($output);

服务器将会查询数据库并执行select语句,然后将结果返回给PHP程序,并最终将数据作为响应输出。上述代码从数据库获取到输出结果之前,会阻塞所有其他操作的执行。换言之,该进程(通常情况下是线程)在等待其他进程执行结束的过程中会一直闲置,但却要消耗系统的资源。

为了解决这个问题,许多Web平台利用线程池系统来解决连接线程占用问题。这种多线程技术非常直观,但同时又有如下几个严重不足:● 管理线程将成为一项复杂的工作● 系统资源被闲置线程占用● 这种应用不易于扩展

这种方法在不要求服务器和浏览器双向通信的时候是可行的。浏览器发起一个短连接请求,由服务器的响应结束连接。但如果要开发一个长期连接浏览器和服务器的实时应用呢?了解这一想法在实际应用中的情况,你可以参照下图所列举的Apache(阻塞式Web服务器)与Nginx(非阻塞式事件轮询)之间的并发请求处理性能对比。详情请查阅http://blog.webfaction.com/2008/12/alittle-holiday-present-10000-reqssec-with-nginx-2/。

Apache和Nginx的并发处理性能对比

上图可以看出,Apache请求响应性能的降低速度明显快于Nginx。但接下来这张二者内存消耗的对比图中,你将看到Nginx的事件轮询架构对服务器内存消耗的巨大影响。

Apache和Nginx处理并发请求时的内存占用对比

从上面的对比中,可以得出这样一个结论:使用事件驱动架构可以有效降低服务器负载,而在开发Web应用时利用JavaScript异步的理念则可达到立杆见影的效果。而使这一方法具有可行性的,则是被JavaScript开发人员称为闭包的简单设计模式。2.2 JavaScript闭包

闭包是赋给其父环境中某个变量的函数。使用闭包模式,父函数中的变量作用域将会延伸绑定到闭包函数。如下所示:function parent() { var message = "Hello World"; function child() { alert (message); } child();}parent();

上述例子可以看出, child()函数中依然可以访问parent()内定义的变量。这个例子比较简单,下面让我们看看这段更有趣的代码:function parent() { var message = 'Hello World'; function child() { alert (message);

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载