这个其实是直接从 connect 的源码里面 copy 过来的，我倒觉得原来的更好看一点，只是比较难保持