需要在source目录下填加一个demo目录放一些示例文件,hexo默认会编译source目录下的所有文件。但demo目录并不需要编译,_config.yml有提供一个配置项skip_render, 官网说明:

skip_render:跳过指定文件的渲染,您可使用glob表达式来匹配路径。

glob表达式链接的是minimatch,说明路径匹配用的应该是minimatch这个npm模块包来完成的。需要指出的是这里面配置的路径都是相对source目录的。

Read More

探索问题:

  1. React生命周期有哪些,各自在什么阶段触发
  2. 哪些阶段可以使用重新设置状态,例如使用setState

Read More

探索问题:

  1. 为什么ES6中数组,字符串等是可迭代的,而对象却是不可迭代?直观感受就是数组和字符串都可以用for...of,而对象却不可以。
  2. 实现一个最小化的迭代器。

Read More

在开发代码时,通常需要配置一些额外的代码质量校验工具来保证代码质量,像我们这边使用的就是fecs。因为平常都是用Webstorm来开发,正好fecs有提供这样的插件,用起来却也很方便。

Read More

记录不同形式Destructuring导致的不同结果:

1
2
3
4
5
6
7
function move1({x=0, y=0} = {}) {
console.log(x, y)
}
function move2({x, y} = {x: 0, y: 0}) {
console.log(x, y)
}

Read More

在使用ES6时,一般都是推荐使用let, const来定义变量,相对var而言:

Hoisting Scope Creates global properties
var Declaration Function Yes
let Temporal dead zone Block No
const Temporal dead zone Block No

Temporal dead zone这个与varDeclaration有什么不一样的地方?

Read More

探索问题:

  1. TCP建立连接为什么要三步握手
  2. 建立连接时发送的SEQ, ACK是什么

Read More

广播数据

如何向所有的客户端广播数据?

  1. 使用io.sockets.emit

    1
    2
    3
    4
    5
    6
    ...
    var io = require('socket.io')(server);
    io.on('connection', function(socket){
    io.sockets.emit('new', {hello: 'world'});
    });
  2. 使用socket.broadcast.emit

1
2
3
4
5
6
...
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.broadcast.emit('new', {hello: 'world'});
});

两种方式区别io.sockets.emit向所有连接的客户端广播数据,而socket.broadcast.emit则向
除了该socket自身之外的其他所有广播数据。其实也就是说
io.sockets.emit = socket.broadcast.emit + socket.emit

因此可以猜测出socket.io内部会保留所有连接的socket。