ECMAScript 6中的生成器及koa小析

引子

老听人说 koa大法好,这两天我也赶了把时髦:用 n 安上了node 0.11.12,下了个koa开启harmony模式试水。在一系列文档和贴子的教育下,大概认识到:

  • koa 是TJ 大神主导的新一代Web框架
  • koa 的中间件基于ES6的生成器函数(function *)形式
  • koa的核心流程库是 co,它能很好的解决Pyramid of Doom问题

koa

在接触 Node.js 前,由于有过 Python编程的经验,我对生成器是个什么东西已经是很清楚了。我真正感兴趣的是:它是怎么被用来优化回调嵌套的。

“为何这么屌”

在 KOA框架为何这么屌 一文中有[……]

阅读全文

使用File API 异步上传文件

离上次更新已经有一个月了,惭愧。

最近在做一个网盘的项目,不出意外的涉及到大文件的上传,那么问题来了:如何实时的显示文件上传的进度?

问题分解

似乎是老生常谈,几年前我做过类似的功能模块(基于.NET平台),方案思路:

  • 基于表单提交
  • Server端根据上传文件分配标识符(GUID)并进行流式读取
  • Browser端发起Ajax拉取文件上传状态

这种方案的问题是受制于文件大小(最大2G)。所谓文件上传进度的实时显示,个人觉得比较理想的方案是:

  • Browser 端需要告诉Server文件的大小
  • Browser 端需要能对文件分块读取
  • Server 端需[……]

阅读全文

OAuth 2和passport框架

OAuth是什么


OAuth
(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth 2.0

OAuth 2OAuth的版本有v1.0, v1.0a 和 v2.0。OAuth 2.0 的出现主要是解决1.0+中的几个问题,提升开发简易度和应用安全性:

  • 更好的支持非浏览器APP(移动和桌面客户端,可以省略v1.0的交换token过程,增强用户体验)
  • 给访问令牌(Access-Token)添加了续期概念,对令牌泄露多了一层防御
  • 不再强制客户端使用Token Secret,有令牌[……]

阅读全文

Node + Redis 实现分布式Session方案

Session是什么?

Session 是面向连接的状态信息,是对 Http 无状态协议的补充。

Session 怎么工作?

Session 数据保留在服务端,而为了标识具体 Session 信息指向哪个连接,需要客户端传递向服务端发送一个连接标识,比如存在Cookies 中的session_id值(也可以通过URL的QueryString传递),服务端根据这个id 存取状态信息。

在服务端存储 Session,可以有很多种方案:

  1. 内存存储
  2. 数据库存储
  3. 分布式缓存存储

分布式Session

随着网站规模(访问量/复杂度/数据量)的扩容,针对单机的方案将成为性[……]

阅读全文

Cluster,把多核用起来

引子

众所周知,虽然Node的底层有一个IO线程池,但其应用层默认是单线程运行的,对于多核CPU环境来说,是一种资源的浪费。

所幸Node提供了child_process 模块,让开发者得以开多个进程,实现每个进程各自利用一个CPU,以实现多核的利用。

child_process 模块给予Node 可以随意创建子进程的能力。因为 child_process 类本身是一个 EventEmitter,所以进程间通信很容易;且父子进程间通信并不通过网络层,而是在内核中完成,高效。

但 child_process 对于开发者来说,编程模型还是过于复杂,需要操心的细节过多,比如:父进[……]

阅读全文

Bigpipe的启示

Bigpipe 是一种异步渲染方案,能有效提升页面加载速度。它也是Facebook前端渲染的主力,据说为网站提速近一倍。

Bigpipe是怎么做到的?

它的思路:将页面分割成多个部分(pagelet),先向用户输出没有数据的布局(框架),然后将每个部分逐步输出到前端,再最终渲染填充框架,完成整个网页的渲染。这个过程需要前端JavaScript渲染,后端异步输出相互配合。

了解这些,容易联想到的是Node的异步输出能力。

在并发的情况下,数据库IO往往会成为一个瓶颈,如果使用传统的模板渲染(EJS/Jade),恐怕还是个同步的思路:请求DB取数据 -> 串行等待数据到位[……]

阅读全文

元编程?

wind 源码的时候,脑子里蹦出一个词:MetaProgramming… 当然,我不是在说 wind 就是元编程了,只是觉得 JS 的动态性,很易于进行元编程。

我理解的元编程:用代码做为数据动态产生代码,用程序写程序。

JS 无需编译,所以有天然优势,运行时操作类或函数易如反掌。

比如说,需要动态给类的对象织入方法,代码是在程序运行时传入的,可以这么干:

当然,这个hello() 的调用有点先知先觉了,呵呵且看:

而且,和写 元编程[……]

阅读全文

函数的arguments,注入及高阶函数

引子

在研究恶魔金字塔(Pyramid of Doom)的过程中,注意到 async 有这样的示例代码:

令人寻味的是这个回调函数callback。它不是调用者写的,而是由series()通过高阶函数的方式注入的。怎么注入的?答案是 arguments。事实上,async 完美的运用了函数arguments 的动态特性。

说到这个 arguments呢,它其实不是个数组,toString 会报告它是一种 [object Arguments] 类型的数据。诚如 MDN 所述:

The arguments object[……]

阅读全文

Pyramid of Doom (2)

上篇,要在JavaScript异步环境中支持串行化执行,尝试参考了 CommonJS的Promise标准 后,决定使用没有状态的Promise 方式来实现。

严格说来,Promise标准应该包括:

  • 暴露给调用的then接口,用以串联:这个接口永远返回promise对象本身
  • 内部维护每一次执行的状态,接受fulfilledHandler/ errorHandler/ progressHandler 以处理 成功/失败/执行中 状态
  • then接口里的待执行函数,需要回调promise以触发下一次执行(执行链思路大同小异,上篇的问题只是不串行
  • 内部维护一个队列,在构造执行[……]

阅读全文

Pyramid of Doom (1)

引子

在学Node的时候,遇到了一个关于回调的问题:

有若干个进行资源调用的函数(比如它们共享一个mongoDB的连接),要确保在它们都执行完成后,执行一个资源销毁的函数,怎么做比较好?

Node提供的是一个纯异步的执行环境,决定了至少这样的代码是行不通的:

因为:很可能在函数a或b执行完成之前,destory已经被触发。

那这样行不行:

当然行,随之而来的问题也很明显:

  • 函数互相间的侵入性太强,基本弹不上什么模块化
  • 这只是举例就两[……]

阅读全文