Forward
In 2008 I was searching for a new programming platform for making websites. This was more than wanting a new language--indeed the details of the language mattered very little to me. I was concerned rather about the ability to program advanced push features into the website like I had seen in GMail--the ability to for the server to push data to the user instead of having to constantly poll. The existing platforms were tightly coupled to the idea of the server as something which receives a request and issues a response sequentially. To be able to push events to the browser the platform needed to be able to constantly handle a number of open mostly idle connections.
I knew how to make this work at the system call layer, in C. If I used only non-blocking sockets the overhead per connection was very small, in small tests I could demonstrate a server that could handle thousands of idle connections or pretty massive throughput. I knew that this was the optimal way for a user-space Unix server to be implemented. However I didn't want to work in C, I wanted the beautiful fluidness of a dynamic language. While it was possible to issue the exact system calls I wanted in every programming language it was very ugly and was always the "alternative" method of socket programming. My theory was that non-blocking sockets were not actually difficult at all as long as everything was non-blocking.
Google announce Chrome and its new JavaScript engine V8 in late 2008. A faster JavaScript engine made for a faster web - and V8 made the web A LOT faster. Suddenly there was this idea of a JavaScript arms race between Google, Apple, Mozilla, and Microsoft. This combined with Doug Crockford's book JavaScript: The Good Parts sent JavaScript from the language everyone despised to an important language.
I had an idea: Non-blocking sockets in JavaScript! Because JavaScript has no existing socket libraries I could be the first to introduce this new and hopefully better interface. Just take V8 and glue it to my non-blocking C code and I should be done. I quit my contracting job and began working on this idea full time. Once I made the very first version available I immediately had users who reported bugs and I started fixing those bugs and three years passed.
It turns out that JavaScript jives extremely well with non-blocking sockets. This was not clear from the start. The closures made everything possible. People were able to build very complex non-blocking servers in just a couple of lines of JavaScript. My initial fear that the system would be unusably niche was quickly alleviated as hackers from all over the world began to build libraries for it. The single event loop and pure non-blocking interface allowed libraries to add more and more complexity without introducing expensive threads.
In Node users find a system which scales well by default. Because of the choices made in the core system, nothing in the system is allowed to do anything too terrible (like block the current thread), and thus performance never degrades horribly. It is an order of magnitude better than the traditional blocking approach, where 'better' is defined as the amount of traffic it can handle take.
These days Node is being used by a large number of startups and established companies around the world from Voxer and Uber to Walmart and Microsoft. It's safe to say that billions of requests are passing through Node every day. As more and more people come to the project, the third party modules and extensions available grows and increases in quality. While I was once reserved about recommending Node for mission critical applications, I now full heartily recommend Node for even the most demanding server systems.
This book gracefully takes the reader through the discussion and guided exercises of Node and many of the third party modules. By learning the material covered here you go from basic familiarity with JavaScript to building complex interactive websites. If you've used other server-side web frameworks in the past, you'll be shocked at how easy it is to build a server in Node.
--Ryan Dahl, Creator of Node.js








