本篇介绍以Nodejs和Mongodb为后端,以Ionic为前端,以Docker作为服务器容器为基础架构的混合App开发方式的技术综述。

我已经把项目文件整理起来放到github上了,供大家参考。

HTML && CSS && JS简介

HTML的全称是Hyper Text Markup Language,中文名为超文本标记语言,它通过标记符号来标记页面中要显示的各个部分,HTML组成了页面的框架。

CSS的全称是Cascading Style Sheets,中文名为层叠样式表,它是一种用来表现HTML文件样式的计算机语言,是能够真正做到网页表现与内容分离的一种样式设计语言。

JS是Javascript的简称,JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。

百度百科 http://baike.baidu.com/view/16168.htm?fromtitle=JS&fromid=10687961&type=syn

AngularJS技术简介

Ionic框架依赖 AngularJS和Cordova而实现,因此我们先介绍这两个框架再来介绍Ionic。AngularJS是Google开发的纯客户端JavaScript技术的WEB框架,用于扩展、增强HTML功能,它专为构建强大的WEB应用。AngularJS试图成为WEB应用中的一种端对端的解决方案。这意味着它不只是你的WEB应用中的一个小部分,还是一个完整的端对端的解决方案。这会让AngularJS在构建一个CRUD(增加Create、查询Retrieve、更新Update、删除Delete)的应用时显得很“固执”(原文为 opinionated,意指没有太多的其他方式)。但是,尽管它很“固执”,它仍然能确保它的“固执”只是在你构建应用的起点,并且你仍能灵活变动。

AngularJS通过为开发者呈现一个更高层次的抽象来简化应用的开发。如同其他的抽象技术一样,这也会损失一部分灵活性。换句话说,并不是所有的应用都适合用AngularJS来做。AngularJS主要考虑的是构建CRUD应用。幸运的是,至少90%的WEB应用都是CRUD应用。但是要了解什么适合用AngularJS构建,就得了解什么不适合用AngularJS构建。
如游戏,图形界面编辑器,这种DOM操作很频繁也很复杂的应用,和CRUD应用就有很大的不同,它们不适合用AngularJS来构建。像这种情况用一些更轻量、简单的技术如jQuery可能会更好。

百度百科 http://baike.baidu.com/item/AngularJS

Cordova技术简介

Cordova是Apahe基金会旗下的一个开源项目,其在官网上的简介为:Apache Cordova is a platform for building native mobile applications using HTML, CSS and JavaScript,中文解释就是Apache Cordoava 是一个使用HMTL,CSS和Javascript来构建本地移动应用的平台。

它是一个Adobe的开源的混合型(Hydrid)移动应用开发框架,它的前身是PhoneGap开源框架,现在这两个品牌都在使用,不过基本上除了名字以外,其它都相同。Cordova为HTML 5代码提供了对本地资源的访问能力,能够充分发挥HTML 5的跨平台能力和本地代码在性能以及资源访问上的优势。到目前为止,Cordova已经支持了所有的主流移动平台,可以减少企业在移动应用开发上的成本和时间。

Cordova开发第一课 环境准备 http://io.diveinedu.com/2015/01/09/Cordova开发第一课-环境准备.html

Cordova为应用开发者提供了一组可以调用本地设备功能的API,这些API用JS编写,让你能方便地调用摄像头,加速器等功能。和一些常见的前端框架如JQuery等等配合使用能够允许一个应用只使用HTML,CSS和Javascript进行构建。使用Cordova你不需要再编写任何本地代码如Java或Objective-C等等,只需要web技术就可以,这些代码由应用自身本地加载并显示。

Ionic技术简述

Ionic官网上的简介是”Ionic is the beautiful, open source front-end SDK for developing hybird mobile apps with web technologies”,翻译过来就是”Ionic是一个用web技术开发混合移动应用的漂亮的开源前端SDK”。作为一款前端SDK,Ionic向我们提供了一系列的HTML,CSS,JS组件,手势和工具来构架具有复杂交互的app,Ionic主要关注于应用的外观和交互,它设计的初衷并不是为了取代PhoneGap这类JS框架,而是简化我们编写App时的一个大的方面即前端。

那么已经存在Cordova,PhoneGap此类开源引擎的情况下,Ionic为什么而存在呢?在前端方面有一个传奇的前端代码库Bootstrap,Bootstrap是twitter推出的一款界面框架,从github上高达8万的star数量就可以知道这个库有多么的流行。在前端仍是莽荒一片的时代程序员编写代码必须从头开始,编写晦涩的代码以满足不同浏览器的癖好,直到前端代码库的出现才让程序员解放生产力,像Bootstrap这种代码库并不是让程序员可以不写代码就编写项目,而是他提供给开发者一个更高的起点来写出高质量的项目,直接的好处就是这种库通常设计精良,经过严格测试,并支持跨浏览器的一致体验。Ionic库也有着类似的目标,通过共享库的方式向开发者推荐合适的设计模式并将良好的实践文档化,让我们在开发混合App的时候能够专注于应用的架构。

CS样式

Ionic我们提供了丰富的CSS样式和Javascript功能,首先是CSS,如下图所示,图一中1为Ionic的CSS样式列表,提供了如按钮,列表,卡片,选择等基本的页面部件,开发者通过图中2中的HTML代码就能够方便的将部件集成到页面中来,如图中3所示为各种样式的按钮。

JS功能部件

JS功能部件能够提供各种动态效果以及交互功能,图二中1为Ionic为我们提供的JS功能列表,提供了例如导航,弹出菜单,滑动窗口等基本页面交互功能,通过使用图2中的JS代码能够很方便的使用这些功能,让我们的APP能够与用户进行交互,图中3所示为弹出窗口的效果。

Nodejs技术简述

Nodejs是一个基于Chrome V8引擎的js运行时环境,它采用基于事件的非阻塞I/O模型,V8是Google创造出来的高性能JS引擎,得益于V8的高性能,Nodejs能够既轻量级又具备高性能。Nodejs很适合用来搭建高性能的web服务器,而且因为Node内置了服务器,我们不需要像PHP或Django一样用Ngnix之类的代理服务器,例如使用下面的代码就可以简单地创建一个Nodejs服务器:

1
2
3
4
5
6
7
8
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

这段代码使用Nodejs内置的http模块,监听本地1337端口,并将所有访问该地址的请求返回一个Hello World的回应。

Node.js是一个为实时Web(Real-time Web)应用开发而诞生的平台,它从诞生之初就充分考虑了在实时响应,超大规模数据要求下架构的可扩展性。这使得它摈弃了传统平台依靠多线程来实现高并发的设计思路,而采用了单线程,异步式I/O,事件驱动的程序设计模型,这些特性不仅带来了巨大的性能提升,还减少了多线程程序设计的复杂性,进而提高了开发效率。Nodejs是一个让Javascript运行在浏览器之外的平台。它实现了诸如文件系统,模块,包,操作系统API,网络通信等Core JavaScript没有或者不完善的功能。Node.js的Javascript引擎是V8,来自Google Chrome项目。V8号称是目前世界上最快的Javascript引擎,经历了数次引擎革命,它的JIT(Just-in-time Compilation,即时编译)的执行速度已经快到了接近本地代码的执行速度。Node.js不运行在浏览器中,所以也就不存在JavaScript的浏览器兼容性问题,可以放心地使用JavaScript语言的所有特性。

NodeJS开发指南

mongojs 模块

Mongojs是一个小巧的Node.js模块,它的功能就是用来连接Mongodb数据库,并提供Mongodb操作的封装,让我们在Node下面能够对数据库进行操作,Mongojs很容易使用,例如:

1
2
var mongojs = require('mongojs')
var db = mongojs(connectionString, [collections])

上面的代码的功能是引入mongojs模块,并根据连接信息打开数据库,并返回具有特定集合的db接口,有了db这个对象,我们就能对数据库进行各种增删改查的操作。例如查找所有性别为female的用户:

1
2
3
4
5
6
7
// app.js
db.users.find({sex: "female"}, function(err, users) {
if( err || !users) console.log("No female users found");
else users.forEach( function(femaleUser) {
console.log(femaleUser);
} );
});

restify 模块

要介绍Restify模块,首先得理解REST风格的开发方式,REST(Representational State Transfer 表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。

在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。

非常简单适用的解释:

  • REST是一套用来创建Web Service的方法。
  • REST式的Web Service的主旨是让事情尽量的简单化。
  • REST式的Web Service使用HTTP里的方法:GET, POST, DELETE, PUT。你不需要使用URL或请求的内容来指定这个方法。
  • REST式的Web Service使用URL来指明你将要操作什么对象。
  • REST式的Web Service使用HTTP状态码作为返回值。
  • REST式的Web Service调用产生的HTTP请求内容只是用于服务数据——不是用来指明调用方法,目标对象或返回值的。

restify模块使得在Node.js中写正确的REST API变得容易了很多,而且它还提供了即装即用的支持,如版本控制、错误处理、CORS和内容协商。

eventproxy 模块

在Nodejs中由于其异步调用的特点,往往会编写很长的深度嵌套的代码,不仅可读性差,维护困难,而且因为无法利用并行特性导致代码效率低下。
EventProxy是一个很轻量的工具,但是能够带来一种事件式编程的思维变化。有几个特点:

  • 利用事件机制解耦复杂业务逻辑
  • 移除被广为诟病的深度callback嵌套问题
  • 将串行等待变成并行等待,提升多异步协作场景下的执行效率
  • 友好的Error handling
  • 无平台依赖,适合前后端,能用于浏览器和Node.js
  • 兼容CMD,AMD以及CommonJS模块环境

    https://www.npmjs.com/package/eventproxy

在本系统的实现过程中我们使用该模块来利用事件机制对复杂的业务逻辑进行解耦。

Mongodb数据库简述

Mongo是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,旨在为WEB应用提供可护展的高性能数据存储解决方案,它是很多Nodejs应用的好伴侣.

MongoDB由‘数据库’组成,数据库由‘集合’组成,集合由‘文档’组成。‘域’组成了文档,集合可以被‘索引’,从而提高了查找和排序的性能。
最后,我们从MongoDB读取数据的时候是通过‘游标’进行的,除非需要,游标不会真正去作读的操作。

虽然这些概念和那些关系数据库中的相应概念很相似,但是还是存在差异的。关键的差异在于关系数据库是在‘表’这一层次定义‘列’的,而一个面向文档的数据库则是在‘文档’这一层次定义‘域’的。也就是说,集合中的每个文档都可以有独立的域。
因此,虽说集合相对于表来说是一个简化了的容器,而文档则包含了比行要多得多的信息。

Docker容器技术

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

百度百科 http://baike.baidu.com/link?url=ScLumbWwrxxcWth3ZEbYHJFDSQF5d_OXfGjkT45OKooynZUcmlcBNfnV4SiUKpBe6eXVHmpwdUrhBh1FqJmSDa

利用docker我们可以:

  • 自动打包和部署应用
  • 创建轻量、私有的PaaS环境
  • 自动化测试和持续集成/部署
  • 部署并扩展Web应用、数据库和后端服务器

利用Docker可以将我们的nodejs服务器部署到远程的VPS服务器上去。