MEAN-Web-Development

图灵社区外文图书翻译计划《MEAN Web Development》我翻译的内容,包含[前言][第一章]

#前言

回顾1995年的春天,那时候的浏览器跟现在的浏览器差别很大。站在那时候看,万维网才诞生了4年(第一个互联网浏览器是Tim Berners-Lee编写的),距离马赛克的初始版本发布过去了两年,而IE1.0也刚刚发布不过数月。万维网开始展现出一种人气蓬勃的态势,尽管有些大公司对这个领域很感兴趣,而主要的扰乱者却是一家名为网景(Netscape)的小公司。

Netscape Navigator是由网景发行,已经流行起来的浏览器。即将发行到第二版本时,工程师和联合创始人 Marc Anderseen决定在其中嵌入一种编程语言。这个任务分配给一个名叫Branden Eich的软件工程师,他在1995年5月6日到15日的10天内完成了这种编程语言,命名为Mocha, 也就是之后的LiveScript,最终的名字是Javascript。

Netscape Navigator2.0在1995年9月发布,改变了我们之前对网页浏览器的看法。到1996年8月,IE3.0中引入了它自己实现的Javascript,在这一年9月,网景宣布他们将Javascript提交给ECMA来实现标准化。1997年6月,ECMA-262规范的发布,使Javascript作为标准网页编程语言成为现实。

多年来,Javascript作为不专业的编程语言饱受诟病。其结构、碎片化执行以及被视为“业余”语言的观点的流传,使得专业程序员忽略了它。但是,随着AJAX推出以及受到谷歌在2000年中期推出的Gmail和Google Maps的影响,人们突然认识到,AJAX技术甚至能把网站转化成web应用。新一代的web开发者由此受到启发,把Javascript的发展推进到了一个崭新的层面。

像jQuery、Prototype这些第一代Javascript库在谷歌的进一步推动下迅速获得了极大的发展。2008年末谷歌发布了Chrome浏览器以及V8引擎。拥有JIT编译能力的V8引擎,大大提高了JavaScript的性能。这,将Javascript的开发拓展到一个全新的时代。

2009年是JavaScript的奇迹年:像Node.js这种平台,使得开发者在服务器上运行JavaScript成为现实;以MongoDB为代表的数据库推广并简化了JSON储存器;诸如AngularJS的框架在全新高效的浏览器中广泛运用。20年前,Javascript首次亮相,而今,它已随处可见。曾经这个只能执行小脚本的“不专业的”编程语言已经发展成了当今世界上最流行的编程语言。开源协作工具的兴起以及天才工程师的热情投入,造就了世界上最活跃富饶的社区,曾经的贡献者们埋下的种子,现在正以旺盛的生命力和创造力蓬勃生长。

JavaScript的实际影响是不可估量的。一群每个人都是各自领域佼佼者的开发团队,以前只能是一个零散的队伍,而今,他们却可以通过利用同一种横跨所有层的编程语言真正成为一个团队,协力开发出更精简更迅捷的软件。

如今,已经存在很多全栈JavaScript框架了。不乏优秀的团队开发的,或者致力于解决重要问题的。但是,其中却没有一个像MEAN栈堆一样开放并且模块化的。这个想法很简单,我们用MongoDB作为数据库,Express作为web框架,AngularJS作为前端框架,Node.js作为平台,并且用模块化的方式把它们结合起来,以此来满足现代软件开发的灵活性需求。MEAN的运作依赖于其中每个开源模块的社区,以此来保证其不断更新并且稳定,当其中一个模块变得无用时,我们仅需要用一个更好的模块来代替它就好了。

我很欢迎你也能参与到JavaScript的革命中来,并向你保证,我将尽我做大的努力来帮助你成为一个全栈JavaScript开发者。

在这本书中,我们将帮助你搭建你自己的开发环境并向你解释如何用最好的模块将不同的MEAN组件连结在一起。你将学到维护你代码简洁明了的最佳方式以及如何避免常见的错误。我们将逐步建立你的身份验证层并添加第一个实例。你将学习如何通过JavaScript无阻碍架构来建立能在服务器端和客户端实时通信的应用。最后,我们将告诉你如何用合适的方法来测试你的代码以及用什么工具来帮助你完成自动化开发。

##本书包含的内容:
第一章,介绍MEAN,引领你使用MEAN栈并向你展示如何在各个系统下安装不同的预备环境。

第二章,以Node.js开始,讲解Node.js的基础知识以及它在web开发中的使用。

第三章,开发一个Express web应用,讲解如何通过实现MVC模式来创造以及架构一个Exoress应用。

第四章,介绍MongoDB,讲解其基础知识以及它如何来储存你的应用数据。

第五章,介绍Mongoose,讲解如何用它来连接一个Express应用以及MonogoDB数据库。

第六章,使用密码来管理用户身份,讲解如何管理你的用户验证并提供多样化的登陆选项。

第七章,介绍AngularJS,讲解如何实现AngularJS与你的Express应用的快速结合。

第八章,创建一个MEAN CRUD模块,讲解如何编写及使用你的MEAN应用实例。

第九章,使用Socket.io添加实时功能,讲解如何编写并使用在客户端和服务器间实时通信的应用。

第十章,测试MEAN应用,讲解如何自动化测试你MEAN应用的不同部分。

第十一章,自动化并调试MEAN应用,讲解如何更高效地开发你的MEAN应用。

##学习本书前你需要的知识:
这本书适合拥有HTML、CSS以及现代JavaScript编程基础知识的初级或中级web开发者。

##本书面向对象:
有兴趣学习如何用MongoDB、Express、AngularJS以及Node.js来架构现代web应用的web开发者。

##约定:
在本书中,你将发现不同类型的文本有着多样的样式。下面是这些样式的例子及其含义的解释:

在文本、数据库表名、文件夹名、文件名、文件扩展名、路径、URL、用户输入以及推特手柄中的代码是以下样式:“它还包含一个作为属性的exports对象的指针”
代码块是这样的格式:

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
新的项目以及重要的词会用粗体标识。例如,你在屏幕、菜单或者对话框中看到的文字,按这种样式出现:“当你点击[next]按钮的时候,安装就会开始。”

警告或者重要提示会用这种方式出现在框中。

提示以及技巧用这种方式出现。

##读者反馈
我们永远欢迎来自读者的反馈。让我们知道你对本书的看法——你喜欢其中哪些内容或者不喜欢哪些。读者反馈对我们改进本书具有重要意义,而这也是你真正从中收获到的。

通常的反馈可以直接发邮件到 feedback@packtpub.com 。注意在邮件标题中说明本书书名。

如果在相关方面你有丰富的专业知识并且你愿意编写或者参与编写一本书,可以访问 www.packtpub.com/authors 参考我们的作者指南。

##客户支持
现在,你应为你拥有本书感到自豪,我们有多项措施保证你购买本书是十分明智的。

##下载示例代码
你可以从 http://www.packtpub.com 登陆你的账户下载所有Packt系列书籍的示例代码。如果你通过其他渠道购买本书,你可以访问 http://www.packtpub.com/support 注册,相关文件会直接以邮件形式发送给你。

##勘误表
虽然我们已经尽力保证本书内容的准确性,错误仍是不可避免的。当您在本书中发现错误时–也许在篇章中,也许在代码中–如果您能把错误报告给我们,我们将不胜感激。这样做,你将帮助其他读者并且帮助我们在后续版本中修正。如果你发现了任何勘误,请访问 http://www.packtpub.com/support ,选择相应的书,点击勘误提交表链接,输入您发现的勘误内容。当您提交的勘误表被核实后,勘误会上传到我们的网站或者根据勘误标题添加到已有的勘误表中。

##盗版
互联网上版权材料的盗版问题是普遍存在的。关于Packt,我们非常严肃地保护我们的版权及许可。如果您在互联网上发现我们的作品有任何形式的非法拷贝,给为我们提供地址及网站名称以便我们能做出补救。

请通过 copyright@packtpub.com 与我们联系,将可能含盗版作品的链接地址提供给我们。

非常感谢您能帮助我们来保护作者版权,保护我们创作有价值内容的能力。

##问题
如果你有关于本书任何方面的问题,可以通过 questions@packtpub.com 与我们联系,我们将尽我们最大的努力来解决它。

#介绍MEAN
MEAN是一个强大的全栈JavaScript解决方案包括四个主要部分:作为数据库的MongoDB,作为Web服务框架的Express,作为web客户端框架的AngularJS以及作为服务器平台的Node.js.这些构件由不同的团队开发维护,涉及到庞大的开发者和倡导者群体,他们推进了各组件开发以及文档维护。MEAN栈的主要优势在于它是主要编程语言JavaScript的集中化。然而,把这些工具连接在一起能为缩小并解决问题打下基础,而这显著影响着你的开发进程。

在本书中,我将讲解关于搭建一个MEAN应用的最佳操作以及已知的问题,但是在你真正开始MEAN开发前,你赢首先配置好你的环境。本章将包含一点编程概述,但是主要是讲述如何正确安装支持MEAN应用的基本组件。读完本章,你将学会如何在通常的操作系统中安装并配置MongoDB以及Node.js,还会了解如何使用Node的包管理。在本章中讲包含以下主题:

  • 介绍MEAN栈结构
  • 在Windows、Linux、Mac OS X下安装并运行MongoDB
  • 下Windows、Linux、Mac OS X下安装并运行Node.js
  • 介绍Node.js包管理(NPM)以及如何用它来安装Node模块

##三层web应用开发
大多数web应用都是基于三层结构的,包括三个主要层次:数据、逻辑以及前端呈现。在web应用中,应用结构通常被分成数据库、服务器和客户端,而在现代web开发中,也可以被分成数据库、服务器逻辑、客户端逻辑以及客户端UI。

实现这种结构的流行模式是MVC架构模式。在MVC架构中,逻辑、数据以及可视化效果被分成三种类型的对象,分别处理自己的任务。视图处理负责视觉部分以及用户交互;控制器负责响应系统以及用户事件,指挥模型处理以及视图处理做出正确的反应;模型处理负责处理数据操作,响应请求的信息或者根据控制器的指令改变自身状态。下图是MVC的简单直观展示:
【图】
在25年的web发展中,许多用来构建三层Web应用程序的技术栈堆越来越流行。如今,你可以从各种各样的栈堆中找到LAMP栈、.NET栈以及丰富的其他工具和框架。这些栈堆的主要问题是普遍存在的–每一层都需要相应的的基础知识,而这些往往超出朝单一领域发展的开发者的能力,这就使得一个团队变得十分臃肿、低效并且更容易出现意外的风险。

##JavaScript的演变
JavaScript是一种用于web开发的直译式编程语言。最初由Netscape Navigator浏览器实现,它成为了浏览器用于执行客户端逻辑的编程语言。在2000年代中期,在网站到web应用演变的过程中,伴随着浏览器的更新换代,逐渐形成了JavaScript开发者编写更复杂应用的社区。这些开发者开始编写缩短开发周期的库和工具,推进了新一代更先进web应用的诞生,也为编写更优秀的浏览器提出了源源不断的需求。就这样,这个周期持续了数年,厂商们不断完善浏览器而JavaScript开发者也不断做出新的突破。真正的革命始于2008年,这一年,谷歌发布了Chrome浏览器,它搭载了拥有JIT编译能力的V8 JavaScript引擎。谷歌的V8引擎使得JavaScript运行十分迅速,完全改变了web应用开发的格局。更重要的是,开放的引擎源代码使得开发者可以脱离浏览器运行JavaScript代码。这场革命的最新产品之一就是Node.js。

经过了一段时间的搜寻尝试,程序员Ryan Dahl发现V8引擎很适合他的无阻塞I/O的试验,这就是Node.js。这个想法很简单:帮助开发者构建无阻塞代码单元以便更好地利用系统资源、创造更加灵敏的应用程序。其结果就是诞生了一个利用JavaScript脱离浏览器的无阻塞平台,这个平台虽然小,但是功能十分强大。Node优秀的模块系统使开发者能方便地使用第三方模块来扩展这个平台,实现几乎所有功能。社区中不段诞生各种各样的工具,从现代的web框架,到机器人技术服务平台。然而,服务器端的JavaScript才刚刚开始。

早在2007年,当Dwight Merriman和Eliot Horowitz开始着手建立自己的可扩展解决方案时,他们就积累了构建web应用的大量经验。然而,他们建立的这个平台并未像计划中那样成功。于是到了2009年他们决定将其拆开,开源其中的组件,包括一个名为MongoDB的基于V8的数据库。作为无比庞大文本的衍生品,MongoDB是一个可扩展的无SQL的数据库,它采用类JSON动态模式数据模型。当开发者们需要处理复杂数据时,MongoDB为他们提供了相当高的灵活性,它因此获得了极高的影响力。MongoDB也提供关系数据库的功能,比如高级查询、?易缩放?等。凭借这些特性,MongoDB最终从众多无SQL的解决方案中脱颖而出。JavaScript又进展到了一个境地。JavaScript革命者们从未忘记这一切的开始之处。事实上,现代浏览器的普及为JavaScript前端框架的发展掀起了一场新的浪潮。

2009年,Miško Hevery和Adam Abrons在作为平台服务建立JSON时,他们发现仅靠通常的JavaScript库是不够的。他们的web程序丰富的特性对框架提出了更高的要求,需要一个更有条理更清晰的框架来减少繁琐的工作以及方便维护一个有组织的代码库。他们放弃了原本的想法,决定专注于自己编写的前端框架的发展,并将此项目开源,命名为AngularJS。他们的想法是弥补JavaScript与HTML之间的鸿沟并帮助推广单页应用程序的开发。其结果就是诞生了一个丰富的Web框架,它展示了前端开发者的理念,如:双向数据绑定、跨组件的依赖注入以及基于MVC的组成部分。AngularJS以及其他MVC框架彻底改变了web开发格局,将曾经不可维护的前端代码库转化成可以支持更高级开发的发展模式,比如TDD。

开源协作工具的兴起以及天才工程师的热情投入,造就了世界上最活跃富饶的社区。更重要的是,这些巨大的进步使web应用程序开发所需的三个层通过JavaScript这种编程语言统一在一起。这就使通常所说的全栈JavaScript的想法。MEAN栈堆仅仅使这种想法的一个例子。

##介绍MEAN
MEAN是MongoDB、Express、AngularJS、Node.js的一个缩写。其背后的理念是只使用JavaScript驱动的解决方案来满足应用程序不同部分的需求。其优势是巨大的:

  • 用一种编程语言贯穿整个应用开发
  • 应用的所有部分都能支持或者强制使用MVC架构
  • 不再需要数据结构的序列化和反序列化因为数据是用JSON对象封装的
  • 然而,仍然有一些未回答的问题:

如何把所有的组件连接起来?

  • Node.js拥有一个庞大的模块系统,到底该使用哪些模块?
  • JavaScript是与范式无关的,那如何保证MVC架构结构?
  • JSON是一种无模式的数据结构,怎样处理、何时处理数据呢?
  • 如何处理用户验证?
  • 如何使用Node.js的无阻塞架构实现实时交互?
  • 如何测试MEAN应用程序的代码?
  • 可以用哪些JavaScript工具加速MEAN应用开发进程?

在本书中,我将尝试着回答上面所列的以及其他的问题,但在我们走得更远前,你最先需要的就是安装基础组件。

##安装MongoDB
对于MongoDB的稳定版本,其官方网站提供了在Linux、Mac OS X以及Windows下的最简单安装方式的链接。

请注意,你需要下载对应于你操作系统的正确版本。如果你使用Windows或者Linux,请根据你的系统下载32位或者64位的版本。Mac用户请下载64位版本。

MongoDB的版本控制方案是这样的:用偶数版本号标记稳定的版本,因此2.2.x版本和2.4.x都是稳定的,而2.1.x版本以及2.3.x是不应该用于产品中的不稳定版本。目前最新的稳定版本是2.6.x。

http://mongodb.org/downloads 下载页面将会提供一个用于你安装MongoDB的二进制文件下载。下载并解压归档文件后,你需要找到MongoDB的二进制文件,它通常位于bin文件夹内。mongod进程运行MongoDB服务进程的主要部分,它可以作为一个独立的服务器或者MongoDB集的一个节点。在我们的李子中,我们将使用MongoDB作为独立的服务器。mongod进程需要一个文件夹来储存数据文件(默认文件夹是/data/db)以及一个监听端口(默认端口为27017)。在接下来的小节中,我们将介绍各种操作系统中的安装步骤。我们从通常的Windows操作系统开始我们的安装。

我们建议你通过访问 https://mongodb.org 官方文档来了解更多关于MongoDB的知识

###在Windows操作系统中安装MongoDB
当你下载完成正确的版本并解压缩后,把文件夹移动到C:\mongodb。MongoDB使用默认的文件夹来储存它的文件。在Windows中,默认位置是C:\data\db,所以在命令提示符下,转到C:\并输入下面的命令:
> md data\db

你可以使用--dbpath命令行标签来告诉mongod服务使用其他的数据文件路径

当你把MongoDB文件夹移动到正确的目录并创建数据文件夹后,你有两种选择来运行MongoDB主服务。

####手动运行MongoDB
你需要运行mongodb二进制文件来手动运行MongoDB。因此,打开命令提示符并使用如下命令:
> C:\mongodb\bin\mongod.exe
上面的命令会开始监听MongoDB主服务,默认的端口是27017。如果一切正常,你将看到跟下图相似的控制台输出。
图片
根据Windows的安全类别,会弹出一个安全警告对话框来提醒你某些服务功能被禁止,如果出现这种情况,选择专用网络,点击允许访问

你应该知道MongoDB服务是自包含的,所以你可以从你选择的任何文件夹中运行它。

####作为Windows服务运行MongoDB
比较流行的做法是每次开机后自动运行MongoDB。在你开始设置MongoDB为Windows服务前,指定MongoDB的日志文件和配置文件的路径是个不错的练习。首先,通过在你的命令行中运行下面的命令来创建一个文件夹:
> md C:\mongodb\log
然后,你就可以使用--logpath命令行标签来创建配置文件了,接下来,在命令行中执行下面的命令:
> echo logpath=C:\mongodb\log\mongo.log > C:\mongodb\mongod.cfg
当顺利创建配置文件后,通过右键命令行控制台图标选择用管理员权限运行来以管理员身份打开一个新的命令行控制台。在新的命令行控制台中,通过运行下面的命令安装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
注意:只有配置文件和日志路径设置都正确时安装才会成功。安装完成MongoDB服务后,你可以在以管理员身份运行的命令提示符中用下列命令运行它:
> net start MongoDB

下载示例代码
你可以从 http://www.packtpub.com 登陆你的账户下载所有Packt系列书籍的示例代码。如果你通过其他渠道购买本书,你可以访问 http://www.packtpub.com/support 注册,相关文件会直接以邮件形式发送给你。

为了适应需要,MongoDB的配置文件是可以修改的,更多的信息请访问 http://docs.mongodb.org/manual/reference/configuration-options/

###在Mac OS X以及Linux中安装MongoDB
在本小节中,你将学到用不同的方法在基于Unix的操作系统中安装MongoDB。我们从最简单的安装方法开始,此方法包括下载MongoDB的预编译二进制文件

####从二进制文件中安装MongoDB
你可以从 http://www.mongodb.org/downloads 下载页中下载MongoDB的正确版本。或者,你也可以用下面的命令通过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使用默认的文件夹来储存它的文件。在Linux和Mac OS X 中,默认的位置是/data/db,所以,在你的命令行中运行下面的命令:
$ mkdir -p /data/db

在你创建这个文件夹的过程中可能会出现一些问题,通常是因为许可问题,所以在运行上述命令时应使用sodo命令或者超级用户身份

上述命令将会创建datadb两个文件夹因为-p标签也会创建父文件夹。注意默认文件夹在你的home文件夹之外,所以运行下面的命令来设置文件夹许可:
$ chown -R $USER /data/db
现在就把一切都准备好了,用你的命令行工具进入到bin文件夹并用下面的命令运行mongod服务:
$ cd mongodb/bin
$ mongod
这将运行MongoDB主服务,并开始监听默认的27017端口。如果一切顺利的话,你会看到命令行控制台中输出和下图相似的信息:

####用包管理安装MongoDB
有时候安装MongoDB的最简单方法是使用包管理。不足之处是一些包管理器并未支持最新的版本。幸运的是,MongoDB背后的团队也是RedHat、Debian、Ubuntu以及Mac OS X上的Hombrew等官方包管理维护团队的成员。注意你应该配置你的包管理资料库使它包含MongoDB服务以便能下载官方MongoDB包。

在Red Hat Enterprise、CentOS或者Fedora上使用Yum安装,参考 http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/ 的介绍。

在Ubuntu使用APT安装,参考 http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/ 的介绍。

在Debian上使用APT安装,参考 http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/ 的介绍。

在Mac OS X 上使用Homebrew安装 http://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/

###使用MongoDB shell
MongoDB的档案文件包含了MongoDB shell,允许你通过命令行与你的服务器实例进行交互。你可以用下面的命令启动shell,跳转到MongoDB bin 文件夹并开启mongo服务:
$ cd mongodb/bin
$ mongo
如果你成功安装了MongoDB,shell将用text数据库自动连接到你的本地实例。你会在命令控制台输出中看到与下图相似的信息:

用下面的命令来测试你的数据库:
> db.articles.insert({title: "Hello World"})
上述命令将创建一个新的article集并插入一个包含title属性的JSON对象。用下面的命令检索article对象:
> db.articles.find()
控制台会输出下面的信息:
{ _id : ObjectId("52d02240e4b01d67d71ad577"), title: "Hello World " }
恭喜!这就意味着你的MongoDB实例在正常工作并且你已能成功地用MongoDB shell与它交互。在后面的章节中,你将学到更多关于MongoDB的知识以及如何使用MongoDB shell。

##安装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是不应该用于产品中的不稳定版本。目前Node.js最新的稳定版本是0.10.x。

###在Windows操作系统中安装Node.js
在Windows操作系统中用独立的安装程序安装Node.js是很容易的。打开 http://nodejs.org/download/ 页面下载相应的.msi文件。请注意有32位与64位版本的区别,确保你下载的适合你的系统。

下载完安装包后运行它,如果弹出任何安全警告信息,点击运行按钮,安装进程就会开始。系统会有类似下图的界面提醒你:

当你点击Next按钮后,安装就会开始。几分钟后,你将看到与下图相似的界面,告诉你Node.js已经成功安装了。

###在Mac OS X 中安装Node.js
在Mac OS X中用独立的安装程序安装Node.js是很容易的。打开 http://nodejs.org/download/ 页面下载相应的.pkg文件。
下载完安装包后运行它,你将看到与下图类似的界面:

点击Continue按钮后安装进程就会开始,安装程序会询问要求同意许可然后让你选择目标文件夹。选择最适合你的选项并再次点击Continue。安装程序会要求你确认安装信息并需要输入用户密码。稍后,你将看到与下图相似的界面,告诉你Node.js已经成功安装了。

###在Linux中安装Node.js
要在Linux机器中安装Node.js,你需要使用官方网站提供的tarball文件。最佳方案是下载最新版本然后使用make命令编译安装源代码。打开 http://nodejs.org/download/ 页面下载相应的.tar.gz文件。然后,用下列命令解压文件并安装Node.js:
$ tar -zxf node-v0.10.31.tar.gz
$ cd node-v0.10.31
$ ./configure && make && sudo make install
如果一切正常,这将在你的机器中安装Node.js。注意这些命令是适应Node.js 0.10.31版本的,所以记住用你下载的版本号代替相应的部分。如果你遇到任何问题,Node.js背后的团队已经为你创立了一套别样的安装方案,可以访问 https://github.com/joyent/node/wiki/installation 查看相应文档。

我们建议你通过浏览 https://nodejs.org 的官方文档来了解更多node.js的知识。

###运行Node.js
成功安装Node.js后,现在你就可以在它提供的命令行界面(CLI)中开始试验了,打开命令行工具,运行下面命令:
$ node
这将运行Node.js CLI,接受下一步的 JavaScript输入。可以用以下命令测试安装:
> console.log('Node is up and running!');
Node is up and running!
undefined
非常棒,你应尝试运行一下JavaScript文件:创建一个名为application.js的文件,在里面写入下列内容:
console.log('Node is up and running!');
运行它,你必须把文件名作为CLI的第一个参数,像这样:
$ node application.js
Node is up and running!
祝贺!你已经创建了你的第一个Node.js应用。可以通过按 CTRL + D 或者 CTRL + C来终止CLI。

##介绍NPM
Node.js是一个平台,这就意味着它提供的功能和API都是最底层的。为了实现更复杂的功能,它使用一个模块系统来允许你更好的扩展它。NPM是安装、更新、卸载Node.js模块的最佳选择,它有下列特性:

  • 一个用于浏览、下载或者安装第三方模块的注册表
  • 管理局部包及全局包的CLI工具

为方便起见,NPM已经在Node.js安装过程中安装完成了,那我们来学习一下如何使用它。

###使用NPM
为了理解NPM是怎么工作的,我们来用它安装Express web 框架,这个将会在后面的章节中使用。NPM是一个强大的包管理工具,集中了各种公共模块。你可以访问 https://npmjs.org/ 浏览可用的公共包。

注册表中的大多数包都是开源并由Node.js社区开发者维护的。当一个开发者开发出一个新的开源模块后,包作者可以把它发布到注册中心允许其他开发人员在各自的项目中下载使用。在包配置文件中,包作者会选择一个名称来作为以后下载的唯一标识符。

建议您访问 https://npmjs.org 的官方文档获取更多关于Node.js的知识。

####NPM的安装过程
请注意,NPM有两种安装模式,分别是局部和全局。默认的局部包管理更为常用,它将在你的应用目录下创建一个node_modules文件夹并在其中安装所需的第三方模块。这不会引起系统级别的影响,它只用来安装你应用所需的包,并不会创建无用的全局文件污染你的系统。

全局安装模式用于安装你在Node.js全局范围内使用的包。通常是CLI工具,比如说你将会在下面的章节中遇到的Grunt。大多数情况下,包作者将会引导你安装在全局情况下使用的包。因此,若有疑问的话请使用局部安装模式。在基于Uinx的系统中,全局安装模式通常会把包安装到/usr/local/lib/node_modules目录,这在基于Windows的系统中会是C:\Users\%USERNAME%\AppData\Roaming\npm\node_modules路径。全局安装的包会使所有该系统上的Node.js都可以使用。

#####使用NPM安装包
当你发现了一个不错的包时,你可以用npm命令安装它,像这样:
$ npm install <Package Unique Name>
如果要安装全局模块,你需要使用-g标签:
$ npm install –g <Package Unique Name>

如果出现你的账户没有权限安装全局包的情况,你应使用root用户或者sodo命令来安装。

举例来说,局部安装Express,你需要转到你的应用目录并执行:
$ npm install express
上述命令将会把最新的稳定版Express包局部安装到你的node_modules文件夹中。此外,NPM还支持广泛的版本,所以你可以用下列命令来安装一个特定版本的包:
$ npm install <Package Unique Name>@<Package Version>
举例来说,要安装Express的次要版本,你可以用下面的命令:
$ npm install express@2.x
这将安装Express2的最新稳定版。注意这个语句允许NPM下载安装Express 2的任意次要版本。请访问 https://github.com/isaacs/node-semver 了解更多关于NPM支持的语句的语义。

当包中有依赖关系时,NPM将自动处理这些依赖关系,在包文件夹中建立node_modules文件夹安装所需要的包。在上面的例子中,Express的依赖包将会被安装到node_modules/express/node_modules目录中。

#####使用NPM移除包
要移除一个安装过的包,你可以转到你的应用文件夹中并运行下列命令:
$ npm uninstall < Package Unique Name>
NPM将会查找并尝试从node_modules局部文件夹中移除它。要移除一个全局包,你需要使用-g标签,像下面这样:
$ npm uninstall –g < Package Unique Name>

#####使用NPM更新包
使用下面的命令将包更新到最新版本:
$ npm update < Package Unique Name>
NPM将会下载并安装最新版的包即使它并不存在。用下面的命令更新一个全局包:
$ npm update –g < Package Unique Name>

####使用package.json文件管理依赖关系
安装一个包是不错的,但很快,你的应用程序就会需要使用其它的几个包,所以你需要一个更好的方法来管理这些软件包的依赖关系。为此,NPM允许你使用一个名为package.json的配置文件来处理这些依赖关系,它位于你应用程序的根文件夹中。在你的package.json文件,你就可以定义应用程序的各种元数据属性,包括应用程序名,版本以及应用作者。这个文件也是你定义你应用依赖关系的地方。
package.json实际上是一个包含各种属性的JSON文件,这些属性用于描述你应用程序特性。
一个使用最新版Express以及Grunt包的应用应该会有这样一个package.json文件:

{
“name” : “MEAN”,
“version” : “0.0.1”,
“dependencies” : {
“express” : “latest”,
“grunt” : “latest”
}
}

你的应用名及版本属性是必须的,如果没有这些属性,NPM就不会正常运行。

#####创建一个package.json文件
虽然你可以手动创建package.json文件,但是一个更简单的办法是使用npm init命令。你可以使用你的命令行并运行下面的命令:
$ npm init
NPM将会询问一些关于你应用信息的问题,并自动创建一个新的package.json文件,将会出现与下图相似的界面:

创建package.json文件后,你需要对其进行修改和添加依赖属性。最终的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来安装这些软件包的最新版本。但是,我们强烈建议你使用特定版本或版本范围,以避免在开发过程中你的应用程序依赖关系是不断变化的。这是因为新版本的包不一定能与旧版本的包兼容,这可能会在你的应用中导致严重的问题。

#####安装package.json依赖关系
创建package.json文件后,你可以通过跳转到你的应用根目录并使用npm install命令来安装应用依赖关系:
$ npm install
NPM将自动检测你的package.json文件并安装你应用所有的依赖关系,把它们放到局部的node_modules文件夹中。有时候,使用下面的npm update命令安装依赖是更佳选择:
npm update
这将安装所有缺失的包并把已存在的依赖更新到指定的版本。

#####更新package.json文件
npm install的另一个强大特性是安装一个新的包并且把包信息作为依赖关系保存到package.json文件中。这可以通过在安装某个包时使用--save标签来实现。例如,要安装最新版的Express并保存它的依赖关系,你可以是用下面的命令:
$ npm install express --save
NPM将会安装最新版的Express并将Express包依赖添加到package.json文件中。为了清楚起见,在下面的章节中,我们更喜欢手动编辑package.json文件。然而,这种有用的功能会在你的日常开发周期中非常方便。

建议你访问 https://npmjs.org/doc/json.html ,阅读官方文档进一步了解NPM强大的配置选项。

##总结
在本章中,你学到了如何安装MongoDB以及如何使用MongoDB shell连接到你的本地数据库实例。你还学到了如何安装Node.js以及使用Node.js CLI。你也了解了NPM并知道了如何用它来下载、安装Node.js包。你还学习了如何使用package.json文件轻松地管理你应用程序的依赖关系。在下一章中,我们将会讨论一些Node.js的基础知识,你会创建你的第一个Node.js web应用程序。