Part 2:我眼中的 Node.js 核心

  • 1)小而美的哲学
  • 2)从 LAMP 到 MEAN
  • 3)异步流程控制
  • 4)Node.js Web 开发
  • 5)Node.js 模块开发

时间原因,接下来稍微介绍一下 MEAN

小而美的哲学

“Small is beautiful” 是 Unix 哲学9条里的第一条,但对 Node.js 来说,它实在是再合适不过了

http://blog.izs.me/post/48281998870/unix-philosophy-and-nodejs

  • Write modules that do one thing well. Write a new module rather than complicate an old one.
  • Write modules that encourage composition rather than extension.
  • Write modules that handle data Streams, because that is the universal interface.
  • Write modules that are agnostic about the source of their input or the destination of their output.
  • Write modules that solve a problem you know, so you can learn about the ones you don’t.
  • Write modules that are small. Iterate quickly. Refactor ruthlessly. Rewrite bravely.
  • Write modules quickly, to meet your needs, with just a few tests for compliance. Avoid extensive specifications. Add a test for each bug you fix.
  • Write modules for publication, even if you only use them privately. You will appreciate documentation in the future.

从LAMP到MEAN

MEAN 是目前最潮的全栈 javascript 架构

MEAN 是一个 Javascript 平台的现代 Web 开发框架总称,它是 MongoDB + Express + AngularJS + NodeJS 四个框架的第一个字母组合。它与传统 LAMP 一样是一种全套开发工具的简称。

从我的角度看

  • mysql 用 mongodb 替换,nosql 里最像 rdbms 的,从开发和性能都是有优势的(老毕已经讲过了)
  • angular 的出现是一个时代,ioc,双向绑定,指令等都曾让无数热血沸腾
  • nodejs 提供了完全的生态和工具链,你要的它基本都有,感谢 npm,早些年 nodejs 的性能甩 php 几条街的
  • express 作为 nodejs 示范项目,它非常精简,是比较合适的 web 框架

我为什么选择MEAN架构?

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

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

我的一篇爆款文章《Node.js 最新 Web 技术栈(2015年5月)》https://cnodejs.org/topic/55651bf07d4c64752effb4b1
讲的就是我们用的技术栈

异步流程控制

js 流程控制的演进过程,分以下5部分

  • 1) 回调函数 Callbacks
  • 2) 异步 JavaScript
  • 3) Promise/A+ 规范
  • 4) 生成器 Generators/ yield(es6)
  • 5) Async/ await(es7)

Part 2:我眼中的 Node.js 核心 - 图1

  • 目前所有版本都支持 Promise/A+ 规范
  • 目前 Node.js 4.0 + 支持 Generators/ yield
  • 目前不支持 ES7 里的 Async/await,但可以通过 babel 实现

整体来说,对异步流程控制解决的还是比较好的。

详见 Node.js 最新技术栈之 Promise 篇

Node.js Web 开发

  • Node.js Web 开发
    • express、koa
    • restify、hapi
    • 其他框架 sails、meteor

各种类型 web 开发都支持的,一般我们采用非 restful 的使用 express、koa 更简单

如果是纯 restful,可以采用 restify、hapi

另外还有快速模拟 api 的 json-server,对 rest 支持超方便

Node.js 模块开发

  • Node.js 模块开发
    • 普通模块
    • cli
    • 脚手架 scaffold
    • c/c++ addons

普通模块和 cli 模块只是差 package.json 里的

  1. "preferGlobal": "true",
  2. "bin": {
  3. "kp": "kp.js"
  4. },

脚手架 scaffold = cli + 模板生成,在 Node.js 里这2点都非常容易

在 Node.js 里写 c/c++扩展,有 nan 抽象层,其他就看大家的 c/c++ 水平了

其他

如何看到 koa && koa2

Part 2:我眼中的 Node.js 核心 - 图2

http://17koa.com/node4koa/#/

数据库

见 mongoose.md

如何做 benchmark

https://github.com/17koa/koa-benchmark

开源项目里怎么样写测试、CI 和代码测试覆盖率

https://cnodejs.org/topic/558df089ebf9c92d17e73358

真实环境部署 nodejs 程序

deploy.md