1. 起源
Ryan Dahl 起初想建立一个 Web 服务器, 后来 Node 项目发展迅速, 发展成了构建网络应用的一个基础框架。
2. 特点
基于事件驱动, 非阻塞I/O。
3. 单线程的问题,
通过采用类似 HTML5 Web Workers创建工作线程来进行计算解决 JavaScript 大计算阻塞 UI 渲染的问题, Node 采用 child_process 解决单线程中大量的计算问题 。
4. 采用 NPM 管理依赖包
a. 使用淘宝镜像安装, 加快安装速度
npm install -g cnpm--registry=https://registry.npm.taobao.org
cnpm install xxxx
NPM 钩子命令, 在执行 npm start 前会自动执行 npm prestart"script" : {
"prestart" : "do something",
"start": "do something"
}
b. 发布自己的 NPM 包
例如在一个空文件夹中开始建立你的 npm 包, 使用 npm init 命令, 然后在命令行填入一些基本信息,用来初始化一个package.json, 然后使用 npm adduser 注册一个账号, ok 完后使用 npm publish 即可发布你自己的包。最后你可通过 npm install 包名 下载, 或者是之前配置了淘宝镜像通过 cnpm install 包名 下载。
5. 一个文件读取的例子
a. fs 文件读取模块, 如若不指定 utf-8 会出现格式不正确 。
b. 使用流的形式读取,你可以把数据流看成特殊的数组, 只不过数组中的数据分散在空间, 而数据流中的数据是分散在时间上的。开发人员可以每收到一份数据就开始处理,而不用等到所有数据都到全了在做处理。
6. 一个可读流和可写流连接形式管道的例子。
a. 当 HTTP 服务器上有请求过来时, 对其进行响应的res对象就是可写数据流中的一种。
b. 可读和可写数据流可以连接起来形成管道, 这是一种高效的数据处理方式, 只要有数据准备好就可以处理, 不用等着读取完整个资源再把它写出去。
如下,数据从文件读进来 (fs.createReadStream) 然后数据随着进来就被送到(.pipe)客户端(res)
7. 两个 Socket.IO 实例
a. 踩的坑:
和io.sockets.clients('particular room') 进行了版本更替,不要受以前的技术博客误导。
io.sockets.manager.rooms用io.sockets.adapter.rooms 代替
io.sockets.clients('particular room')换成了io.sockets.adapter.rooms['private_room'];
socket.to('others').emit('an event', { some: 'data' });
socket.in('others').emit('an event', { some: 'data' });
以上第二个 socket.in 包括自己在内的发信息,没有作用
b. 俩完整实例地址 (均是本人实敲出来,可供参考)
node + JavaScript + Socket.Io 版本 : https://github.com/xiaoxiaojx/Socket.IO_EasyTest
express + TypeScript + react + Socket.Io 版本 : https://github.com/xiaoxiaojx/Socket.IO_Test