一名全栈工程师Node.js之路-转

Node.js 全球现状

虽然 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 个特性:前端

  • event-driven
  • non-blocking I/O

之前总强调的异步特性,到今天异步已经不是明显优点。所以除了性能,其余都是病(不足)?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 的强大的生态来炫耀。

为何选择 Node.js?

空弦科技作的是基于云仓储的 SaaS 服务,给中小卖家提供服务,核心系统是进销存、订单池、WMS。

先看一下咱们的瓶颈在哪里

  • 人(天津很差招人)。Node.js 招不到,好多都是从 Java 转的,前端也很差找,好多也是从 Java 转的,咱们至关于从 0 开始组建团队
  • 开发速度。创业公司 5 分钟要造火箭,你们都懂。因此让开发快速进入状态,提升开发速度,对咱们来讲相当重要。
  • 稳定。在没有专业运维人员的状况下,如何保证系统可用、稳定。

因而就引出了我认为的 Node.js 好处

  • 一样不优化,性能比大部分语言好。即便优化,也比其余语言简单,好比Java。
  • 有足够多的选择和架构的平衡。
  • 如实在不够,Java 补。

Node.js 给了咱们足够的选择工具

  • 能够采用面向过程
  • 能够面向对象
  • 能够函数式

甚至能够用各类编译器 coffee、typescript、babel(es)等。对于从 0 开始的团队来说,能够先面向过程、而后随着团队的成熟度,一点一点增长难度。

提供好的基础和包管理工具

  • 测试相关 tdd / bdd 测试覆盖率
  • 规范化 standard、各类 lint、hint
  • 构建相关 gulp、grunt、webpack,大量插件
  • 生成器 yo 等
  • 包管理工具 npm 足够简单易用

以上这些都作大型软件的基础,Node.js 在这方面作得很是好

特定场景的快速

不少人把 MEAN 组合(好比 mean.io)起来,这样作的好处是若是熟悉,开发速度确实会很是快,可是难度太大,不多有人能搞的定。metetor 模糊了服务端和客户端,是同构的典型应用,对于实时场景是很是高效的。这种东西都算特定场景的快速,通常不敢轻易上,调优难度很是大,若是有人能 cover 的住,在初期是很是高效的。

总结需求:能够简单,能够难;能够快、也能够慢;能够开发大型软件

若是以上不知足咋办?这时就须要架构平衡了。

架构平衡

在架构中各自作各自合适的事儿就好,咱们很坦然的面对 Node.js 的优势和缺点,作好架构平衡。

 

 

一、在语言层面能够作,那语言层面作

  • 已有大量 npm 上的模块 ( 目前在 25.6 万个以上 ) 
  • 本身造轮子 ( 站在海量包上 简单语法 npm = 快速 )
  • 使用 Node.js 里的 (nan https://github.com/nodejs/nan )本身包装 C/C++ 轮子

从上面看,绝大部分需求均可以知足了 

二、若是语言层面搞不定,那就架构层面作

  • 业务边界、模块拆分、面向服务
  • MQ、RPC、cache
  • 运维、监控、自动化

稍微解释一下,首先,架构与 Node.js 没直接关系。其次,架构师经常使用的东东有足够的 Node.js 模块支持,好比 MQ,像 Rabbitmq 有比较好的 Node 模块支持,RPC 里 Thrift、Grpc、Tchannel 支持的都不错,咱们使用的 senecajs,Redis,ioredis 等软件,后面作 HA 都是同样的。

三、若是架构层面也解决不了……

合适的场景用合适的东西。有不少东西是 Node.js 不擅长,又不在架构范畴里的,咋办?如实在不够,Java 补(严格点,应该叫其余语言补)

  • 好比复杂 excel 生成
  • 好比 apns 推送(Go 作其实也很好,不过除了我,没人能维护)

但凡是 Java 或其余语言里比较成熟的库,能够做为独立服务使用的,均可以作 Node.js 的支持。避免过多的时间用在造轮子上,影响开发进度。

四、Node.js 优劣分析

  • 执行效率,一样不优化,性能比大部分语言好。
  • 开发效率,Node.js 自己比较简单,开发效率仍是比较高的。完善的生态,好比测试、工具、npm 大量模块。
  • 缺乏 Rails 同样的大杀器,scaffold 脚手架,ORM 太弱。

Node.js 的 Web 开发框架 Express、Koa 等,简单,小巧,精致,缺点是集成度不够,目前已有的 MEAN 或 yo 或 sails 等总有某种方面的不满意

团队 Node.js 使用现状

选择 Node.js 咱们须要作的包括:固化项目结构;限定 ORM;自定义脚手架。

因为 Node.js 已经提供如下特性,所以你能够在 30 分钟完成一个脚手架。

  • cli 命令模块,编写很是容易
  • 基于 JavaScript 的模板引擎(知名的 30 )

咱们用Node.js作什么?

  • API 服务
  • 前端(moa-frontend)
  • SDK(OAuth Provider)
  • 辅助开发 cli 工具

目前进度

  • 使用 0.10.38,开发 Moajs 框架,Express / MongoDB
  • pm2 部署, 先后端分离,阿里云的 slb 负载,alinode 监控
  • moa-api, moa-frontend, moa-h5 (未能用)
  • 使用 Redis 缓存,Rabbitmq,senaca 做为 RPC

一些正在建设的方面

  • 使用 kong 做为 API gateway
  • consul 作服务发现和配置
  • 上 elk 做为日志分析处理
  • 使用 docker compose 做为本地开发环境
  • 线上 docker

打算进行技术栈更新,包括Nodejs 4.x(预计今年 6 月份;Koa(generator/co);es6/es7 ( babel )。

4.x 在内存和性能上都有很是大的提高,新的语言特性上,异步流程和语法上都须要学习,故不急于升级,待人才梯队完善。

目前的作法是小步快走,一次只上同样新技术;另外造成梯队,便可准备上新东西;善用 npm,实现 3 化:模块化、最小化、服务化

为何选择 MEAN 架构

MEAN 架构

 

 

MEAN 是目前最潮的全栈 JavaScript 架构。MEAN 是一个 JavaScript 平台的现代 Web 开发框架总称,它是 MongoDB Express AngularJS Node.js 四个框架的第一个字母组合。它与传统 LAMP 同样是一种全套开发工具的简称。

从个人角度看

  • MySQL 用 MongoDB 替换,NoSQL 里最像 rdbms 的,从开发和性能都是有优点的(参看老毕在高可用架构群分享文章:MongoDB 2015回顾:全新里程碑式的WiredTiger存储引擎 )。
  • Angular 的出现是一个时代,IoC,双向绑定,指令等都曾让无数热血沸腾。
  • Node.js 提供了彻底的生态和工具链,你要的它基本都有,感谢 npm,早些年 Node.js 的性能甩 php 几条街的。
  • Express 做为 Node.js 示范项目,它很是精简,是比较合适的 Web 框架

我为何选择 MEAN 架构?

  • 成熟、稳定,简单,有问题咱们能 cover 住,因此咱们选了 Node.js。
  • 把握趋势,之后 Node.js 的前景很是看好,尤为先后端统一,全栈方向。
  • 在架构上能够屏蔽可能风险,不背注一掷,也不会一叶障目,合理的使用其余语言,只要每一个功能都以服务出现,至于它是什么语言写的,并不重要。
  • 招人成本的性价比相对较高,技术栈新,容易吸引人才。

最重要的一件事儿,是当有问题的时候,有人能 cover 住,在创业初期这是最最重要的事儿。

Node.js最新Web技术栈https://cnodejs.org/topic/55651bf07d4c64752effb4b1

Node.js 异步流程

异步流程控制

JavaScript 流程控制的演进过程,分如下 5 部分:

  • 回调函数Callbacks
  • 异步JavaScript
  • Promise / a+ 规范
  • 生成器Generators/ yield ( es6 )
  • Async/ await ( es7 )

 

 

  • 目前全部版本都支持 Promise / a+ 规范
  • 目前 Node.js 4.0 支持 Generators/ yield
  • 目前不支持 es7 里的 Async/await,但能够经过 babel 实现

总体来讲,对异步流程控制解决的仍是比较好的。

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 模块化

  • 使用 npmjs 的 private 私有模块(目前作法)
  • 使用 npm 的本地模块开发方法(测试和部署都很是快)
  • 搭建 npm 私服(todo)

编写生成器

在 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

  • 自动加载路由,自带用户管理,使用 jsonwebtoken 作用户鉴权
  • 支持 MongoDB 配置,集成 mongoosedao,快速写 CRUD 等 dao 接口
  • 支持 migrate 测试,Mocha 测试
  • 默认集成 res.api,便于写接口
  • 集成 supervisor,代码变更,自动重载,gulp 自动监控文件变更,跑测试
  • gulp routes 生成路由说明
  • 使用 log4js 记录日志

从开发效果上看,仍是很是快的,很是稳定的。

Moajs框架演进之路https://cnodejs.org/topic/567e2388aacb6923221de469

全栈 or 全烂 ?

Node.js 相关工具

  • grunt/gulp/fis/webpack
  • bower/spm/npm
  • tdd/bdd cucumber/mocha
  • standard
  • babel/typescript/coffee

前端开发四阶段

  • Html/css/js(基础)
  • jQuery、jQuery-ui,Extjs(曾经流行)
  • Backbone(mvc),Angularjs、Vuejs(当前流行)
  • React组件化(将来趋势)、Vuejs

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 平台的可执行文件。

  • node-webkit is renamed ( NW.js )
  • Electron  - Build cross platform desktop apps with web technologies

目前比较火的编辑器都是基于 Electron 打包:

 

 

组件化:统一用法

react 的出现影响最大的是 JSX 的出现,解决了长久以来组件化的问题:

  • 咱们反复的折腾 JavaScript ,依然没法搞定
  • 咱们尝试 OO,好比 extjs
  • 咱们最终仍是找个中间格式 JSX

单纯的 React 只是 view 层面的,还不足以应用,因而又有 Redux。核心概念:Actions、Reducers 和 Store,简单点说就是状态控制,而后再结合打包加壳,变成 app 或可执行文件。iosAndroid 上用 Cordova,PC 上使用 Electron。

总结

  • 组件定义好(React)
  • 控制好组件之间的状态切换(Redux)
  • 打包或加壳(Cordova or 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.js 模块
  • 使用 Webpack 构建
  • 使用 React(视图) Redux(控制逻辑)
  • 使用 Electron 加壳打包

亲,你看到将来了么?

如何全栈?

讲了 Node 工具,前端 4 阶段,hybrid,各类跨平台,目前就是为了介绍 Node 全栈的各类可能,下面讲一下如何能作到 Node 全栈?

全栈核心,后端不会的 UI(界面相关),前端不会的 DB(业务相关),只要打通这 2 个要点,其余就比较容易了。

一、从后端转

作后端的人对数据库是比较熟悉,不管 mongodb,仍是 MySQL、Postgres,对前端理解比较弱,会基本的Html,Css,模板引擎等比较熟悉。

4 阶段按部就班,build 与工具齐飞,前端开发 4 阶段,个人感受是按照顺序,按部就班。

  • Html / Css / JavaScript(基础)
  • jQuery、jQuery-ui,Extjs(曾经流行)
  • Backbone,Angularjs(当前流行)、Vuejs
  • React(将来趋势)、Vuejs

Vuejs 综合 Angular 和 React 的优势,应该是下一个流行趋势

二、从前端转

从前端日后端转,API 接口很是容易学会,像 Express、Koa 这类框架大部分人一周就能学会,最难的是对 DB、ER 模型的理解,说直白点,仍是业务需求落地的理解

咱们来想一想通常的前端有什么技能?

  • Html
  • Css(兼容浏览器)
  • JavaScript 会点(可能更多的是会点 jQuery)
  • PS切图
  • Firebug 和 Chrome debuger会的人都不太多
  • 用过几个框架,大部分人是仅仅会用
  • 英语通常
  • Svn / Git 会一点

那么他们若是想在前端领域作的更深有哪些难点呢?

  • 基础:OO,设计模式,命令,Shell,构建等
  • 编程思想上的理解(MVC、IoC,规约等)
  • 区分概念
  • 外围验收,如  H5 和 hybird 等
  • 追赶趋势,如何学习新东西

以上皆是痛点。因此比较好的办法:

  • 玩转 npm、gulp 这样的前端工具类(此时仍是前端)
  • 使用 Node 作先后端分离(此时仍是前端)
  • Express、Koa 这类框架
  • Jade、ejs 等模板引擎
  • Nginx
  • 玩转【后端】异步流程处理 promise / es6 的 ( generator | yield) / es7 ( async|await )
  • 玩转【后端】MongoDB、Mysql 对应的 Node 模块

从咱们的经验看,这样是比较靠谱的。 Moa FrontEnd  就是最简单先后端分离,里面没有任何和 DB 相关。

技术栈

  • Express
  • Jade
  • bootstrap,bootstrap-table
  • jQuery
  • gulp
  • Nginx

通常的前端都很是容易学会,基本 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 的坑,其实就很是好办了。

  • 而后 H五、Zeptojs、iScroll、fastclick 等
  • 而后微信经常使用的,如weui、vux(vue weui)、jmui(react weui)
  • 而后能够玩点框架,好比 jQuery mobile,Sencha touch
  • 而后能够玩点高级货,ionicframework(基于Angularjs、cordova)
  • 而后前端 4 阶段,依次打怪升级
  • 而后 Node.js

这个基本上是我走的路,从 2010 年写 IOS、作 phonegap(当时是0.9.3)一路走到如今的总结吧。

展望 Node.js 技术将来

Node.js 多是一场春梦,

也可能一个变革机遇;

咱们更相信它是变革机遇,

请拭目以待!

附:Node.js 2015 发展历史

Q1 第一季度

  • IO.js 1.0.0 发布
  • Joyent 推动创建 Node.js 基金会
  • Joyent,IBM,Microsoft,PayPal,Fidelity,SAP and The Linux Foundation Join Forces to Support Node.js Community With Neutral and Open Governance
  • IO.js 和 Node.js 和解提案

Q2 第二季度

  • npm 支持私有模块
  • Node 项目领导人 TJ Fontaine 逐步解除核心身份并离开 Joyent 公司
  • A changing of the guard in Nodeland
  • Node.js 和 IO.js 在 Node 基金会下合并状况

Q3 第三季度

  •  4.0 版本发布,即新的 1.0 版本

Q4 第四季度

  • Node v4.2.0,首个长期支持版本(LTS)
  • Apigee,RisingStack 和 Yahoo 加入 Node.js 基金会
  • Node Interactive
  • The first annual Node.js conference by the Node.js Foundation

版本帝?去年从 v0.10.35 开始

  • 2015-01-14 发布了 v1.0.0 版本(IO.js)
  • 2.x(IO.js)
  • 3.x(IO.js)
  • 2015 年 09 月 Node.js 基金会已发布 Node.js v4.0 版 与 IO.js 合并后的第一个版本
  • 2015 年 10 月 Node.js v4.2.0 将是首个 LTS 长期支持版本
  • 年末发布到 4.2.4 && 5.4.0

目前(2016 年 3 月 20 日)的 2 个版本

  • v4.4.0 LTS(长期支持版本)
  • v5.9.0 Stable(稳定版本)

 

 

总体来讲趋于稳定。

  • 成立了 Node 基金会,可以让 Node.js 在将来有更好的开源社区支持。
  • 发布了 LTS 版本,意味着 API 稳定。
  • 快速发版本,不少人吐槽这个,其实换个角度看,这也是社区活跃的一个体现,但若是你们真的看 CHANGELOG,其实都是小改进,并且是边边角角的改进,也就是说 Node.js 的 core(核心)已经很是稳定了,能够大规模使用。

(参考连接: http://i5ting.github.io/history-of-node-js/ )

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

Q & A

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

相关文章
相关标签/搜索