您必须知道的几个Node.js编码习惯
前言
前面的两篇,以sacdl
工程为例,简单介绍了Node.js的环境搭建和代码组织。这一篇,做个简单的小结,把涉及到的编码习惯用我个人的理解,提示性的说明一下。
编程,其实就是用特定的语言
讲故事、写规则。特定
就是习惯,就像中国的方言,掌握了技巧,很快可以交流,剩下的细节慢慢积累就是。
比特币体现了人类去中心化的本质,Node.js也是最能体现人类特质的编程语言之一,比如:一切都是数据流,事事皆回调。下面,让咱们慢慢品鉴一下吧。
1、一切都是数据流
概念理解
Node.js
默认提供了Stream
模块,即:流,我们在第二篇讲解gulp的时候说起过。作为一个抽象接口,它是Node.js的基础模块,被其他很多模块所使用。
流,最早是linux环境下的概念,与之对应的方法经常是pipe,即:管道(方法)。我个人理解,这种设计非常形象合理。流的概念存在于人类生活的任何场景,数据流,与水流、空气流等具有相同的特性。如:
(1)流,兼具时间和地点两个坐标,时间代表一个过程,地点代表流入、流出(对应发生、结束的编码)位置;
(2)流,是一个时间上的线性过程,而非一个时间点。在时间段内的传输只是部分数据,若要获得完整的数据,就需要花费足够的时间;
(3)流,只能沿着构建在从发生到结束的编码位置的管道传输,在传输的过程中,可以被调整和改变;
再直白一些,流,不可能一下子发生或结束,再快也得有个时间差。就像人类社会,始终以时间为单位,这一刻到下一刻,已经发生变化。而Node.js严格尊重这个现实,无论是远程访问,还是本地请求,每一个data都被分成一段一段数据流(通常是Buffer对象)传输。
因此,Node.js里没有简单拷贝的概念,或者说拷贝其实可以通过流来简单实现。
代码示例
比如:
//引用模块
var fs = require('fs');
var rs = fs.createReadStream('test.md');
var chunks = [],
size = 0;
//接受数据:一段段的接受
rs.on("data", function (chunk){
chunks.push(chunk);
size += chunk.length;
});
//拼接数据,并转换为字符串(**注**:如果 test.md 不是 UTF-8 编码格式的,如果直接
//转换为字符串,可能会出现乱码,这时需要使用其他的模块(比如:iconv-lite)来进行转换)
rs.on("end", function() {
var data = Buffer.concat(chunks, size);
var str = data.toString("utf8");
console.log(str);
});