虽然 Node.js 在国内没有盛行,但据 StackOverflow 2016 年开发者调查,其中 node.js 、全栈、JavaScript 相关的技术在多个领域(包括全栈、后端)都有排名领先。 javascript
( http://stackoverflow.com/research/developer-survey-2016 )php
后端分布css
( http://stackoverflow.com/research/developer-survey-2016 )html
Node.js 与生俱来的 2 个特性:前端
之前总强调的异步特性,到今天异步已经不是明显优点。所以除了性能,其余都是病(不足)?vue
一、Callback hell 问题html5
目前已经很好的解决了。promise / generator / async 后面会讲。java
二、包管理node
npm 已是开源世界里最大的包管理器了,模块很是丰富(25.6万 )。mysql
Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
之前咱们老是喜欢拿异步说事儿,如今咱们拿 Node.js 的强大的生态来炫耀。
空弦科技作的是基于云仓储的 SaaS 服务,给中小卖家提供服务,核心系统是进销存、订单池、WMS。
先看一下咱们的瓶颈在哪里
因而就引出了我认为的 Node.js 好处
Node.js 给了咱们足够的选择工具
甚至能够用各类编译器 coffee、typescript、babel(es)等。对于从 0 开始的团队来说,能够先面向过程、而后随着团队的成熟度,一点一点增长难度。
提供好的基础和包管理工具
以上这些都作大型软件的基础,Node.js 在这方面作得很是好
特定场景的快速
不少人把 MEAN 组合(好比 mean.io)起来,这样作的好处是若是熟悉,开发速度确实会很是快,可是难度太大,不多有人能搞的定。metetor 模糊了服务端和客户端,是同构的典型应用,对于实时场景是很是高效的。这种东西都算特定场景的快速,通常不敢轻易上,调优难度很是大,若是有人能 cover 的住,在初期是很是高效的。
总结需求:能够简单,能够难;能够快、也能够慢;能够开发大型软件
若是以上不知足咋办?这时就须要架构平衡了。
在架构中各自作各自合适的事儿就好,咱们很坦然的面对 Node.js 的优势和缺点,作好架构平衡。
一、在语言层面能够作,那语言层面作
从上面看,绝大部分需求均可以知足了
二、若是语言层面搞不定,那就架构层面作
稍微解释一下,首先,架构与 Node.js 没直接关系。其次,架构师经常使用的东东有足够的 Node.js 模块支持,好比 MQ,像 Rabbitmq 有比较好的 Node 模块支持,RPC 里 Thrift、Grpc、Tchannel 支持的都不错,咱们使用的 senecajs,Redis,ioredis 等软件,后面作 HA 都是同样的。
三、若是架构层面也解决不了……
合适的场景用合适的东西。有不少东西是 Node.js 不擅长,又不在架构范畴里的,咋办?如实在不够,Java 补(严格点,应该叫其余语言补)
但凡是 Java 或其余语言里比较成熟的库,能够做为独立服务使用的,均可以作 Node.js 的支持。避免过多的时间用在造轮子上,影响开发进度。
四、Node.js 优劣分析
Node.js 的 Web 开发框架 Express、Koa 等,简单,小巧,精致,缺点是集成度不够,目前已有的 MEAN 或 yo 或 sails 等总有某种方面的不满意
选择 Node.js 咱们须要作的包括:固化项目结构;限定 ORM;自定义脚手架。
因为 Node.js 已经提供如下特性,所以你能够在 30 分钟完成一个脚手架。
咱们用Node.js作什么?
目前进度
一些正在建设的方面
打算进行技术栈更新,包括Nodejs 4.x(预计今年 6 月份;Koa(generator/co);es6/es7 ( babel )。
4.x 在内存和性能上都有很是大的提高,新的语言特性上,异步流程和语法上都须要学习,故不急于升级,待人才梯队完善。
目前的作法是小步快走,一次只上同样新技术;另外造成梯队,便可准备上新东西;善用 npm,实现 3 化:模块化、最小化、服务化
MEAN 架构
MEAN 是目前最潮的全栈 JavaScript 架构。MEAN 是一个 JavaScript 平台的现代 Web 开发框架总称,它是 MongoDB Express AngularJS Node.js 四个框架的第一个字母组合。它与传统 LAMP 同样是一种全套开发工具的简称。
从个人角度看
我为何选择 MEAN 架构?
最重要的一件事儿,是当有问题的时候,有人能 cover 住,在创业初期这是最最重要的事儿。
Node.js最新Web技术栈https://cnodejs.org/topic/55651bf07d4c64752effb4b1
异步流程控制
JavaScript 流程控制的演进过程,分如下 5 部分:
总体来讲,对异步流程控制解决的仍是比较好的。
Node.js 最新技术栈之 Promise 篇https://cnodejs.org/topic/560dbc826a1ed28204a1e7de
业务边界优化
创业公司有不少可变性,要作的系统也无数,如何保证业务系统的边界是很是难的,咱们其实走了不少弯路。
静态 API 理论
当需求和 UE 定下来以后,就开始编写静态 API,这样 APP、H五、前端就可使用静态 API 完成功能,然后端也能够以静态 API 为标准来实现,总体效率仍是比较高的。
API 的最佳实践
http://developer.github.com/v3/ (严格的restful)
微博 API (可读性强,相对比较传统),咱们采用的微博 API 相似的,约定结构也是相似的。
res.api is an express middleware for render json api , it convention over api format like this :{ data : {}, status: { code : x, msg : "some message" }}
客户端 API 开发总结https://cnodejs.org/topic/552b3b9382388cec50cf6d95
约定结构
和 Java 开发里的目录结构相似,该分层的分层,适当的按照 Express/Koa 增长中间件、路由等目录,便于开发。
使用 npm 模块化
编写生成器
在 Web 开发里,写了 Moajs 生成器,相似于 rails
moag order name:string password:string
其余开发,如 iOS 开发里模型校验很是烦,因而写了一个 json2objc 命令行工具,读取 json,生成 oc 代码,能够节省很多时间
Moajs 框架和先后端分离
moa 生成器,即上面讲的生成器 scaffold。
moa-frontend 技术栈:Express / Jade / bootstrap、bootstrap-table / jQuery / gulp / Nginx
moa-api 技术栈:
Features
从开发效果上看,仍是很是快的,很是稳定的。
Moajs框架演进之路https://cnodejs.org/topic/567e2388aacb6923221de469
Node.js 相关工具
前端开发四阶段
Vuejs 综合 Angular 和 React 的优势,应该是下一个流行趋势。
Hybrid 开发
Hybrid 混搭开发是指使用 H5 技术开发的跨浏览器应用,并最终能够将 HTML5/js/css 等打包成 apk 和 ipa 包的开发方式。它也能够上传到应用商店,提供给移动设备进行安装。它最大的好处是经过 H5 开发一次,就能够在多个平台上安装。
将来将会是 JavaScript 一统天下(Node.js 作后端,传统 Web 和 H5 使用 Javasctipt,更智能的工具如 gulp,更简单的写法如 coffeescript 等)。H5 大行其道(网速变快,硬件内存增加)。
跨平台
C/S 架构到 B/S 架构,这个大部分都清楚,很少说。
移动端加壳,在浏览器上作文章,把页面生成各个移动端的 app 文件。
PC 端加壳,同样是延续浏览器作文章,不过此次把页面生成各个 PC 平台的可执行文件。
目前比较火的编辑器都是基于 Electron 打包:
组件化:统一用法
react 的出现影响最大的是 JSX 的出现,解决了长久以来组件化的问题:
单纯的 React 只是 view 层面的,还不足以应用,因而又有 Redux。核心概念:Actions、Reducers 和 Store,简单点说就是状态控制,而后再结合打包加壳,变成 app 或可执行文件。ios、Android 上用 Cordova,PC 上使用 Electron。
总结
这部分其实组件化了前端,那么可否用这样的思想来组件化移动端呢?
react-nativehttps://github.com/facebook/react-native)A framework for building native apps with React. http://facebook.github.io/react-native/
简单点说,就是用 React 的语法来组件化 iOS 或 android SDK。它们都在告诉咱们,大家之后就玩这些组件就行了,你不须要知道复杂的 SDK 是什么。
当下流行玩法
Medis is a beautiful, easy-to-use Redis management application built on the modern web with Electron, React, and Redux. It’s powered by many awesome Node.js modules, especially ioredis and ssh2. https://github.com/luin/medis
技术点
亲,你看到将来了么?
讲了 Node 工具,前端 4 阶段,hybrid,各类跨平台,目前就是为了介绍 Node 全栈的各类可能,下面讲一下如何能作到 Node 全栈?
全栈核心,后端不会的 UI(界面相关),前端不会的 DB(业务相关),只要打通这 2 个要点,其余就比较容易了。
一、从后端转
作后端的人对数据库是比较熟悉,不管 mongodb,仍是 MySQL、Postgres,对前端理解比较弱,会基本的Html,Css,模板引擎等比较熟悉。
4 阶段按部就班,build 与工具齐飞,前端开发 4 阶段,个人感受是按照顺序,按部就班。
Vuejs 综合 Angular 和 React 的优势,应该是下一个流行趋势
二、从前端转
从前端日后端转,API 接口很是容易学会,像 Express、Koa 这类框架大部分人一周就能学会,最难的是对 DB、ER 模型的理解,说直白点,仍是业务需求落地的理解
咱们来想一想通常的前端有什么技能?
那么他们若是想在前端领域作的更深有哪些难点呢?
以上皆是痛点。因此比较好的办法:
从咱们的经验看,这样是比较靠谱的。 Moa FrontEnd 就是最简单先后端分离,里面没有任何和 DB 相关。
技术栈
通常的前端都很是容易学会,基本 2 周就已经很是熟练了,个人计划是半年后,让他们接触【异步流程处理】和【数据库】相关内容,学习后端代码,就能够全栈了
三、从移动端转
移动端分:native 原生开发,hybrid 混搭式开发。原生开发就是 iOS 用 oc/Swift,Android 用 Java 或 Scala 等,就算偶尔嵌入 webview,能玩 JavaScript 的机会也很是好少。因此移动端转全栈的方法,最好是从 cordova(之前叫 phonegap)开始作 hybrid开发。只要关注 www 目录里的 H5 便可,比较简单。若是 H5 不足以完成的状况下,能够编写 cordova 插件,即经过插件让 JavaScript 调用原生s dk 里功能。cordova 的 cli 能够经过 npm 安装,学习 npm 的好方法,学习 gulp 构建工具。
只要入了 H5 的坑,其实就很是好办了。
这个基本上是我走的路,从 2010 年写 IOS、作 phonegap(当时是0.9.3)一路走到如今的总结吧。
Node.js 多是一场春梦,
也可能一个变革机遇;
咱们更相信它是变革机遇,
请拭目以待!
Q1 第一季度
Q2 第二季度
Q3 第三季度
Q4 第四季度
版本帝?去年从 v0.10.35 开始
目前(2016 年 3 月 20 日)的 2 个版本
总体来讲趋于稳定。
(参考连接: http://i5ting.github.io/history-of-node-js/ )
Node.js 的企业级大事儿记
2014年 nearform ( Node.Js 为何会成为企业中的首选技术? )
2015年 IBM (收购 StrongLoop,拓展云服务业务)
Node.js 基金会的创始成员包括 Joyent、IBM、Paypal、微软、Fidelity 和 Linux 基金会。
对于企业级开发,Node.js 是足够的,不管从性能、安全、稳定性等都是很是棒的。
空弦科技作的是基于云仓储的 SaaS 服务,给中小卖家提供服务,核心系统是进销存、订单池、WMS。目前来看不存在任何问题,
es && babel
2015 年 ECMA 国际大会宣布正式批准 ECMA-262 第 6 版,亦即 ECMAScript 2015(曾用名:ECMAScript 六、ES6)的语言规范。
babel (http://babeljs.io/)做为 es 编译器,已经大量开始使用了,模块作的很是棒,还有人用babel写其余语言编译器。Node.js 里在 0.12 以后才增长 es6 特性,es7 的目前还不支持。因此在 Node.js 里使用 es 里比较高级的特性,是须要 babel 去编译处理的。这是 Node 追逐的标准。
2016 年 01 月 22 日,(微软请求 Node.js 支持 ChakraCore https://github.com/nodejs/node/pull/4765 )
将来 Node.js 不仅是基于 chrome v8 内核,它还能够支持更多其余浏览器内核,对生态、效率提高等很是有好处。
蔡伟小兄弟的查克拉 benchmark 的对比( https://github.com/DavidCai1993/ES6-benchmark )基本结论是 V8 ES5 > 查克拉 ES6 > 查克拉 ES5 > V8 ES6
1. 在全栈的语言选择上,除了 Node.js,是否还考虑过其余语言?
桑世龙:有的,将来 swift 和 Lua 是有可能的。swift 的语法和性能上有很大优点,Lua 在 openresty 的推进下也有机会,不过没有 swift 大。像 WebAssembly 之类的就不太看好了。
2. 请教桑老师:刚才你说的并发开发流程中静态 API 指的是 API 文档?若是是的话谁负责编写?大家目前已是一我的分模块从前端写到后端了吗?
桑世龙:目前没作到文档即静态 API,因此目前是直接提供 json 和部分(json-server https://github.com/typicode/json-server/ ),负责是后端开发的 leader 在写,他的进度会比正常开发要早一周左右。目前不是一我的写全部的先后端,团队成立不久,天津 Node.js 会的很少,因此仍是先后端分离。可是经过 moa-frontend 可让前端了解 Express 等后端知识,适当的时候会给予机会,前端转后端。
3. 贵司在开发协做中提到了静态 API,请问是否是有什么比较好的工具能够推荐?
桑世龙:Node.js 里(json-server https://github.com/typicode/json-server ) 比较好
我其实很想围绕静态 API,写各类请求的生成器,只要 API 出来,文档和各平台的 HTTP 请求代码就生成出来,同时能够对正式 API 进行压测,惋惜目前还没精力写。
4. 作 hybrid app 在移动端会遇到性能问题吧,有没有什么优化经验能够分享?
桑世龙:足够轻量级,少选大框架,作好前端该有的优化。注意 touch 和 click 的区别,好比 fastclick 或 Zeptojs 的 tap 手势。Chrome profile(CSS3动画)。使用 weinre 真机测试。参考:(个人 H5实践 。
5. 若是都全栈了,当前大家团队是如何分工的?
桑世龙:咱们团队仍是倾向于分工专业化,各个服务粒度很是小,便于轮岗、还有就是能够为之后像 Google 那样代码开放作准备。可是有不少状况下,是须要有机动的突击队的(尤为是创业时期),这样能够随便组合,另外就是全栈为 remote 提供了更多便利性。
6. H5 在手机上用 iScroll 坑比较多啊 尤为三星打开硬件加速的时候 render 页面,桑老师怎么看?
桑世龙:能够尝试一下淘宝系的 H5 虚拟化,鬼道曾经在 as 大会上讲过的,咱们目前还没能力作这么深层次的优化。
7. Node.js 作业务金额计算的金额性能和精度够吗
桑世龙:你问的不是 Node.js,而是 Node.js 要操做的数据库。耗性能的计算能够在架构上平衡的,若是能够延时,MQ 就能够了。若是是非延时状况,能够采用其余语言编写对应服务,不必非要必定要 Node.js。咱们目前的场景,尚未在计算遇到瓶颈。
8. 关于 API 返回格式那里,对于 status 为何不打平了把 code 和 message 放出来?这么设定有什么好处么?
桑世龙:语义上更加清晰。整个返回的 json 就只有 data 和 status,若是 status.code != 0,我取 msg 就行了,若是等于 0,处理 data 数据这种设计不见得多好,不过结构清晰,对于开发者来讲,是比较容易接受的。
本文策划李庆丰,编辑王杰,审校 Tim Yang
原文地址:http://weibo.com/ttarticle/p/show?id=2309403956502426692050