When node.js was created, why was it essential to create a new library to run background (asynchronous) jobs? What was to example wrong with boost.asio or libevent? If some functionality was needed should it well be more easy to extend those libraries than to create a new library, from scratch?
Boost.Asio is AFAIK a part of Boost and so has dependencies on other parts of Boost. It is also C++. The aim for node has always been to have a really small C kernel, and hoist as much stuff into JS as possible. This keeps it simple and makes development faster and easier to do cross platform.
libuv started as a small wrapper around libev by node developers. libev is Unix only, and does not support Windows async IO. libuv wrapped libev on Unix, while working with IOCP on Windows, but preserving the same API.
So those are the two reasons - no Boost.Asio to keep things small and no 'libev only' for Windows support.
Eventually libev was removed from the underlying code and libuv took over most of its responsibilities. Why this was done I'll let more knowledgeable people answer.
Nikhil