介绍MEAN堆栈

戴维·温伯格(David Weinberger)在其2002年的书中将蓬勃发展的网络内容描述为“松散加入的小作品”的集合。 这个隐喻一直困扰着我,因为很容易被欺骗,将网络视为一种整体技术堆栈。 实际上,您访问的每个网站都是库,语言和Web框架独特结合的产物。

LAMP堆栈是最早引起人们注意的开源Web技术集合之一:Linux®操作系统,Apache®Web服务器,MySQL数据库,以及Perl(或Python或PHP)使用的编程语言生成基于HTML的网页。 这些技术并不是为了协同工作而编写的。 它们是一个独立的项目,一位雄心勃勃的软件工程师,然后是另一位,然后是另一位,将其拼凑在一起。 从那时起,我们见证了寒武纪卷筒纸爆炸。 每种现代编程语言似乎都有相应的Web框架(或两个),这些框架预组装了许多技术,以使快速轻松地引导新网站成为可能。

MEAN堆栈是Web社区中引起人们广泛关注和兴奋的新兴堆栈: MongoDB , Express , AngularJS , Node.js 。 MEAN堆栈代表了一种完全现代化的Web开发方法:从客户端到服务器再到持久性,在每种应用程序层中都运行一种语言(JavaScript)。 本系列演示了MEAN Web开发项目从端到端的样子,超越了简单的语法。 此初始部分使您开始对堆栈的组件技术进行深入,动手的介绍,包括安装和设置。 请参阅下载以获取示例代码。

您访问的每个网站都是库,语言和Web框架独特结合的产物。

从LAMP到MEAN

MEAN不仅仅是对首字母缩写字母和技术升级的简单重新排列。 将基本平台从OS(Linux)切换到JavaScript运行时(Node.js)可以带来OS的独立性:Node.js在Windows®和OS X上的运行与在Linux上一样好。

Node.js还替换了LAMP堆栈中的Apache。 但是Node.js远不只是一个简单的Web服务器。 实际上,您不会将完成的应用程序部署到独立的Web服务器上。 相反,Web服务器包含在您的应用程序中,并自动安装在MEAN堆栈中。 结果,部署过程大大简化了,因为已明确定义了所需的Web服务器版本以及其余的运行时依赖项。

从传统的数据库(如MySQL)到NoSQL,无模式,面向文档的持久性存储(如MongoDB)的转变代表了持久性策略的根本转变。 您将花费更少的时间来编写SQL,而花费更多的时间来编写JavaScript中的map / reduce函数。 您还将削减大量的转换逻辑,因为MongoDB会原生发出JavaScript对象表示法(JSON) 。 因此,编写RESTful Web服务比以往任何时候都容易。

但是,从LAMP到MEAN的最大转变是从传统的服务器端页面生成向客户端单页面应用程序(SPA)方向转变。 借助Express,您仍然可以处理服务器端路由和页面生成,但是现在重点是在客户端视图上,这要归功于AngularJS。 这种更改不仅仅涉及将模型视图控制器(MVC)工件从服务器转移到客户端。 您还将获得从同步思维到本质上基本上是事件驱动和异步的思维的飞跃。 也许最重要的是,您将从应用程序的以页面为中心的视图转变为面向组件的视图。

MEAN堆栈并非以移动设备为中心-AngularJS在台式机,笔记本电脑,智能手机和平板电脑甚至智能电视上均能很好地运行-但它不会将移动设备视为二等公民。 测试不再是事后的想法:借助MochaJS , JasmineJS和KarmaJS等世界一流的测试框架,您可以为MEAN应用程序编写全面而全面的测试套件。

准备好了吗?

安装Node.js

您需要可以正常工作的Node.js安装来处理本系列中的示例应用程序,因此现在可以安装Node(如果尚未安装)。

如果您使用的是类似UNIX®的OS(Linux,Mac OS X等),建议您使用Node Version Manager(NVM) 。 (否则,请在Node.js主页上单击“ 安装 ”以下载适用于您的操作系统的安装程序,并接受默认设置。)使用NVM,您可以轻松下载Node.js并从命令行在各种版本之间进行切换。 这有助于我从一个客户端项目无缝迁移到另一个版本,从而从一个版本的Node.js无缝迁移到另一个版本。

安装NVM后,键入nvm ls-remote以查看哪些版本的Node.js可用于安装,如清单1所示。

使用NVM列出Node.js的可用版本
$ nvm ls-remote

v0.10.20

v0.10.21
v0.10.22
v0.10.23
v0.10.24
v0.10.25
v0.10.26
v0.10.27
v0.10.28

输入nvm ls显示您已经在本地安装了哪些版本的Node.js,以及当前正在使用的版本。

在撰写本文时,Node网站建议v0.10.28是最新的稳定版本。 键入nvm install v0.10.28以将其本地安装。

安装Node.js(通过NVM或特定于平台的安装程序)之后,键入node --version来验证您使用的是当前版本:

$ node --version

v0.10.28

什么是Node.js?

Node.js是无头JavaScript运行时。 实际上,它与在Google Chrome中运行JavaScript引擎(命名为V8)相同,但使用Node.js可以从命令行而不是在浏览器中运行JavaScript。

我曾让学生嘲笑从命令行运行JavaScript的想法:“如果没有要操纵HTML,JavaScript有什么用?” JavaScript是通过浏览器(Netscape Navigator 2.0)引入世界的,因此那些反对者可以因其短视和天真而被原谅。

实际上,JavaScript编程语言没有用于文档对象模型(DOM)操纵或发出Ajax请求的本机功能。 浏览器提供了DOM API,因此您可以使用JavaScript进行此类操作,但是在浏览器之外,JavaScript失去了这些功能。

这是一个例子。 在浏览器中打开一个JavaScript控制台(请参阅访问浏览器的开发人员工具 )。 输入navigator.appName 。 得到响应后,键入navigator.appVersion 。 您的结果与图1相似。

在网络浏览器中使用JavaScript navigator对象
介绍MEAN堆栈_第1张图片

在图1中,对navigator.appName的响应是Netscape ,对navigator.appVersion的响应是经验丰富的Web开发人员已经知道并且喜欢或讨厌的神秘用户代理字符串。 在图1中(来自OS X上的Chrome),字符串是5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36

现在,创建一个名为test.js的文件。 在文件中键入相同的命令,并将每个命令包装在console.log()调用中:

console.log(navigator.appName);
console.log(navigator.appVersion);

保存文件,然后键入node test.js来运行它,如清单2所示。

在Node.js中查看navigator is not defined错误
$ node test.js 

/test.js:1
ion (exports, require, module, __filename, __dirname) { console.log(navigator.
                                                                    ^
ReferenceError: navigator is not defined
    at Object. (/test.js:1:75)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:902:3

如您所见,您可以在浏览器中使用navigator器,但不能从Node.js中使用navigator器。 (很抱歉使您的第一个Node.js脚本失败了,但是我想确保您确信在浏览器中运行JavaScript与在Node.js中运行JavaScript不同。)

根据堆栈跟踪,没有加载正确的Module 。 (模块是在浏览器中运行JavaScript和在Node.js中运行它之间的另一个主要区别。稍后将介绍更多模块。)要从Node.js获取类似信息,请将test.js的内容更改为:

console.log(process.versions)
console.log(process.arch)
console.log(process.platform)

再次输入node test.js ,您将看到与清单3类似的输出。

在Node.js中使用流程模块
$ node test.js
 
{ http_parser: '1.0',
  node: '0.10.28',
  v8: '3.14.5.9',
  ares: '1.9.0-DEV',
  uv: '0.10.27',
  zlib: '1.2.3',

  modules: '11',
  openssl: '1.0.1g' }
x64
darwin

现在,您已经在Node.js中成功运行了第一个脚本,是时候解决下一个主要概念:模块了。

什么是模块?

您可以在JavaScript中创建单一用途的函数,但是与Java,Ruby或Perl不同,您无法将多个函数捆绑到可以导入和导出的内聚模块或“包”中。 当然,您可以使用

你可能感兴趣的:(编程语言,python,java,javascript,大数据)