Part 2 :准备:如何学习Node.js - Web重点
一般,后端开发指的是 Web 应用开发中和视图渲染无关的部分,主要是和数据库交互为主的重业务型逻辑处理。但现在架构升级后,Node.js 承担了前后端分离重任之后,有了更多玩法。从带视图的传统Web应用和面向Api接口应用,到通过 RPC 调用封装对数据库的操作,到提供前端 Api 代理和网关,服务组装等,统称为后端开发,不再是以往只有和数据库打交道的部分才算后端。这样,就可以让前端工程师对开发过程可控,更好的进行调优和性能优化。
对 Node.js 来说,一直没有在后端取得其合理的占有率,原因是多方面的,暂列几条。
- 1)利益分配,已有实现大多是Java或者其他语言,基本是没法撼动的,重写的成本是巨大的,另外,如果用Node写了,那幺那些写Java的人怎幺办?抢人饭碗,这是要拼命的。
- 2)Node相对年轻,大家对Node的理解不够,回调和异步流程控制略麻烦,很多架构师都不愿意花时间去学习。尽管在Web应用部分处理起来非常简单高效,但在遇到问题时并不容易排查定位,对开发者水平要求略高。
- 3)开发者技能单一,很多是从前端转过来的,对数据库,架构方面知识欠缺,对系统设计也知之不多,这是很危险的,有种麻杆打狼两头害怕的感觉。
- 4)Node在科普、培训、布道等方面做的并不好,国外使用的非常多,国内却很少人知道,不如某些语言做得好。
尽管如此,Node.js 还是尽人皆知,卷入各种是非风口,也算是在大前端浪潮中大红大紫。原因是它的定位非常明确,补足以 JavaScript 为核心的全栈体系中服务器部分。开发也是人,能够同时掌握并精通多门语言的人毕竟不多,而且程序员的美德是“懒”,能使用 JavaScript 一门语言完成所有事儿,为什幺要学更多呢?
对于 Web 应用大致分2种,带视图的传统Web应用和面向Api接口应用,我们先看一下 Node.js Web 应用开发框架的演进时间线大致如下:
- 2010年 TJ Holowaychuk 写的 Express
- 2011年 Derby.js 开始开发,8月5日,WalmartLabs 的一位成员 Eran Hammer 提交了 Hapi 的第一次git记录。Hapi 原本是 Postmile 的一部分,并且最开始是基于 Express 构建的。后来它发展成自己自己的框架,
- 2012年1月21日,专注于 Rest api 的 Restify 发布1.0版本,同构的 Meteor 开始投入开发,最像Rails 的 Sails 也开始了开发
- 2013年 TJ Holowaychuk 开始玩 es6 generator,编写
co
这个 Generator 执行器,并开始了Koa 项目。2013 年下半年李成银开始 ThinkJS,参考 ThinkPHP - 2014年4月9日,Express 发布4.0,进入4.x时代持续到今天,MEAN.js 开始随着 MEAN 架构的提出开始开发,意图大一统,另外 Total.js 开始起步,最像PHP里 Laravel 或 Python 里的 Django 或 ASP.NET MVC的框架,代表着 Node.js 的成熟,开始从其他语言里的成熟框架借鉴
- 2015年8月22日,下一代 Web 框架 Koa 发布1.0,可以在Node.js v0.12下面,通过
co
和 generator实现同步逻辑,那时候co
还是基于thunkfy
的,在2015年10月30日,ThinkJS发布了首个基于 Es2015+ 特性开发的 v2.0 版本 - 2016 年 09 月,蚂蚁金服的 Eggjs,在 JSConf China 2016 上亮相并宣布开源
- 2017年2月,下一代Web框架 Koa 发布v2.0正式版
我们可以根据框架的特性进行分类
框架名称 | 特性 | 点评 |
---|---|---|
Express | 简单、实用,路由中间件等五脏俱全 | 最着名的Web框架 |
Derby.js && Meteor | 同构 | 前后端都放到一起,模糊了开发便捷,看上去更简单,实际上上对开发来说要求更高 |
Sails、Total | 面向其他语言,Ruby、PHP等 | 借鉴业界优秀实现,也是 Node.js 成熟的一个标志 |
MEAN.js | 面向架构 | 类似于脚手架,又期望同构,结果只是蹭了热点 |
Hapi和Restfy | 面向Api && 微服务 | 移动互联网时代Api的作用被放大,故而独立分类。尤其是对于微服务开发更是利器 |
ThinkJS | 面向新特性 | 借鉴ThinkPHP,并慢慢走出自己的一条路,对于Async函数等新特性支持,无出其右,新版v3.0是基于Koa v2.0的作为内核的 |
Koa | 专注于异步流程改进 | 下一代Web框架 |
Egg | 基于Koa,在开发上有极大便利 | 企业级Web开发框架 |
对于框架选型
- 业务场景、特点,不必为了什幺而什幺,避免本末倒置
- 自身团队能力、喜好,有时候技术选型决定团队氛围的,需要平衡激进与稳定
- 出现问题的时候,有人能够做到源码级定制。Node.js 已经有8年历史,但模块完善程度良莠不齐,如果不慎踩到一个坑里,需要团队在无外力的情况能够搞定,否则会影响进度
Tips:个人学习求新,企业架构求稳,无非喜好与场景而已
Node.js 本来就为了做后端而设计的,这里我们再看看利益问题。Node.js 向后端延伸,必然会触动后端开发的利益。那幺 Proxy 层的事儿,前后端矛盾的交界处,后端不想变,前端又求变,那幺长此以往,Api接口会变得越来越恶心。后端是愿意把Api的事儿叫前端的,对后端来说,只要你不动我的数据库和服务就可以。
但是 Node.js 能不能做这部分呢?答案是能的,这个是和 Java、PHP 类似的,一般是和数据库连接到一起,处理带有业务逻辑的。目前国内大部分都是以 Java、PHP 等为主,所以要想吃到这部分并不容易。
- 小公司,创业公司,新孵化的项目更倾向于 Node.js ,简单,快速,高效
- 微服务架构下的某些服务,使用 Node.js 开发,是比较合理的
国内这部分一直没有做的很好,所以 Node.js 在大公司还没有很好的被应用,安全问题、生态问题、历史遗留问题等,还有很多人对 Node.js 的误解。
- 单线程很脆弱,这是事实,但单线程不等于不能多核并发,而且你还有集群呢
- 运维,其实很简单,比其他语言之简单,日志采集、监控也非常简单
- 模块稳定性,对于
MongoDB
、MySQL
、Redis
等还是相当不错,但其他的数据库支持可能没那幺好。 - 安全问题是个伪命题,所有框架面临的都是一样的。
这些对于提供Api服务来说已经足够了,本书后面有大量篇幅讲如何使用 Koa 框架来构建Api服务。
Web编程核心
- 异步流程控制(前面讲过了)
- 基本框架 Koa或Express,新手推荐Express,毕竟资料多,上手更容易。如果有一定经验,推荐Koa,其实这些都是为了了解Web编程原理,尤其是中间件机制理解。
- 数据库 mongodb或mysql都行,mongoose和Sequelize、bookshelf,TypeOrm等都非常不错。对于事务,不是Node.js的锅,是你选的数据库的问题。另外一些偏门,想node连sqlserver等估计还不成熟,我是不会这样用的。
- 模板引擎, ejs,jade,nunjucks。理解原理最好。尤其是extend,include等高级用法,理解布局,复用的好处。其实前后端思路都是一样的。