|
|
|
<html>
|
|
|
|
<style>
|
|
|
|
ul {
|
|
|
|
padding: 0;
|
|
|
|
margin: 0;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
<script type="text/javascript" src="sh_main.js"></script>
|
|
|
|
<script type="text/javascript" src="sh_javascript.min.js"></script>
|
|
|
|
<link type="text/css" rel="stylesheet" href="style.css">
|
|
|
|
<link type="text/css" rel="stylesheet" href="sh_vim-dark.css">
|
|
|
|
|
|
|
|
<title>node.js</title>
|
|
|
|
<body onload="sh_highlightDocument();">
|
|
|
|
<div id="toc">
|
|
|
|
<ol>
|
|
|
|
<li><a href="#audience">Audience</a></li>
|
|
|
|
<li><a href="#about">About</a></li>
|
|
|
|
<li><a href="#download">Download</a></li>
|
|
|
|
<li><a href="#build">Build</a></li>
|
|
|
|
<li><a href="#community">Community</a></li>
|
|
|
|
<li><a href="api.html">Documentation</a></li>
|
|
|
|
</ol>
|
|
|
|
</div>
|
|
|
|
<div id="content">
|
|
|
|
|
|
|
|
<h1><a href="http://tinyclouds.org/node">Node</a></h1>
|
|
|
|
|
|
|
|
<p id="introduction">Purely event-based I/O for <a
|
|
|
|
href="http://code.google.com/p/v8/">V8 javascript</a>.
|
|
|
|
|
|
|
|
<p>An example of a web server written with Node which responds with
|
|
|
|
"Hello World" after waiting two seconds:
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
new node.http.Server(function (req, res) {
|
|
|
|
setTimeout(function () {
|
|
|
|
res.sendHeader(200, [["Content-Type", "text/plain"]]);
|
|
|
|
res.sendBody("Hello World");
|
|
|
|
res.finish();
|
|
|
|
}, 2000);
|
|
|
|
}).listen(8000);
|
|
|
|
puts("Server running at http://127.0.0.1:8000/");
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p> To run the server, put the code into a file <code>example.js</code>
|
|
|
|
and execute it with the <code>node</code> program
|
|
|
|
<pre class="sh_none">% /usr/local/bin/node example.js
|
|
|
|
Server running at http://127.0.0.1:8000/
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p> See the <a href="api.html">API documentation</a> for more examples.
|
|
|
|
|
|
|
|
<h2 id="audience">Audience</h2>
|
|
|
|
|
|
|
|
<p>This project is for those interested in
|
|
|
|
<ul>
|
|
|
|
<li>server-side javascript
|
|
|
|
<li>developing evented servers
|
|
|
|
<li>developing new web frameworks
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
<h2 id="about">About</h2>
|
|
|
|
|
|
|
|
<p> Node's goal is to provide an easy way to build scalable network
|
|
|
|
programs.
|
|
|
|
In the above example, the 2 second delay does not prevent the server from
|
|
|
|
handling new requests.
|
|
|
|
Node tells the operating system (through
|
|
|
|
<code>epoll</code>,
|
|
|
|
<code>kqueue</code>,
|
|
|
|
<code class="sh_none">/dev/poll</code>,
|
|
|
|
or <code>select</code>)
|
|
|
|
that it should be notified when the 2 seconds are up or if a new connection
|
|
|
|
is made—then it goes to sleep. If someone new connects, then it
|
|
|
|
executes the callback, if the timeout expires, it executes the inner
|
|
|
|
callback. Each connection is only a small heap allocation.
|
|
|
|
|
|
|
|
<p>This is in contrast to today's more common model
|
|
|
|
where OS threads are employed for concurrency. Thread-based networking
|
|
|
|
<a href="http://www.sics.se/~joe/apachevsyaws.html">is</a>
|
|
|
|
<a href="http://www.kegel.com/c10k.html">relatively</a>
|
|
|
|
<a href="http://bulk.fefe.de/scalable-networking.pdf">inefficient</a>
|
|
|
|
<!-- TODO needs links -->
|
|
|
|
and
|
|
|
|
very
|
|
|
|
difficult
|
|
|
|
to
|
|
|
|
use.
|
|
|
|
|
|
|
|
Node will show much better memory efficiency under high-loads
|
|
|
|
<!-- TODO benchmark -->
|
|
|
|
than systems which allocate 2mb thread stacks for each connection.
|
|
|
|
|
|
|
|
Furthermore, users of Node are free from worries of dead-locking the
|
|
|
|
process—there are no locks. No function in Node directly performs
|
|
|
|
I/O, so the process never blocks. Because nothing blocks, less-than-expert
|
|
|
|
programmers are able to develop fast systems.
|
|
|
|
|
|
|
|
<p>Node is similar in design to systems like
|
|
|
|
Ruby's <a href="http://rubyeventmachine.com/">Event Machine</a>
|
|
|
|
or
|
|
|
|
Python's <a href="http://twistedmatrix.com/">Twisted</a>.
|
|
|
|
Node takes the event model a bit further. For example, in other systems
|
|
|
|
there is always a blocking call to start the event-loop. Typically one
|
|
|
|
defines behavior through callbacks at the beginning of a script and at the
|
|
|
|
end starts a server through a call like <code>EventMachine::run()</code>.
|
|
|
|
In Node it works differently. By default Node enters the event loop after
|
|
|
|
executing the input script. Node exits the event loop when there are no more
|
|
|
|
callbacks to perform. Like in traditional browser javascript, the event loop
|
|
|
|
is hidden from the user.
|
|
|
|
|
|
|
|
<p>Node's HTTP API has grown out of my difficulties developing and working
|
|
|
|
with web servers. For example, streaming data through most web frameworks is
|
|
|
|
impossible. Or the oft-made false assumption that all message headers have
|
|
|
|
unique fields. Node attempts to correct these and other problems in its
|
|
|
|
API. Coupled with Node's purely evented infrastructure, it will make a
|
|
|
|
more comprehensive foundation for future web libraries/frameworks.
|
|
|
|
|
|
|
|
<p> <i>But what about multiple-processor concurrency? Threads are necessary
|
|
|
|
to scale programs to multi-core computers.</i> The name <i>Node</i> should
|
|
|
|
give some hint at how it is envisioned being used. Processes are necessary
|
|
|
|
to scale to multi-core computers, not memory-sharing threads. The
|
|
|
|
fundamentals of scalable systems are fast networking and non-blocking
|
|
|
|
design—the rest is message passing. In the future, I'd like Node to
|
|
|
|
to be able to spawn new processes (probably using the <a
|
|
|
|
href="http://www.whatwg.org/specs/web-workers/current-work/">Web Workers
|
|
|
|
API</a>), but this is something that fits well into the current design.
|
|
|
|
|
|
|
|
<h2 id="download">Download</h2>
|
|
|
|
|
|
|
|
<p><a href="http://github.com/ry/node/tree/master">The git repo</a>
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
<li> 2009.05.31 <a href="http://s3.amazonaws.com/four.livejournal/20090531/node-0.0.2.tar.gz">node-0.0.2.tar.gz</a>
|
|
|
|
<li> 2009.05.27 <a href="http://s3.amazonaws.com/four.livejournal/20090527/node-0.0.1.tar.gz">node-0.0.1.tar.gz</a>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
<h2 id="build">Build</h2>
|
|
|
|
|
|
|
|
<p>Node eventually wants to support all POSIX operating systems (including
|
|
|
|
Windows with MinGW) but at the moment it is only being tested on
|
|
|
|
<b>Linux</b>,
|
|
|
|
<b>Macintosh</b>, and
|
|
|
|
<b>FreeBSD</b>. The build system requires Python. V8, on which
|
|
|
|
Node is built, supports only IA-32 and ARM processors. V8 is included in the
|
|
|
|
Node distribution. There are no dependencies.
|
|
|
|
|
|
|
|
<pre class="sh_none">
|
|
|
|
./configure
|
|
|
|
make
|
|
|
|
make install
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<p> Then have a look at the <a href="api.html">API documentation</a>.
|
|
|
|
|
|
|
|
<p>To run the tests
|
|
|
|
|
|
|
|
<pre class="sh_none">
|
|
|
|
./configure --debug
|
|
|
|
make test
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
<h2 id="community">Community</h2>
|
|
|
|
|
|
|
|
<p>
|
|
|
|
For help and discussion subscribe to the mailing list at
|
|
|
|
<a href="http://groups.google.com/group/nodejs">http://groups.google.com/group/nodejs</a>
|
|
|
|
or send an email to <a href="mailto:nodejs+subscribe@googlegroups.com">nodejs+subscribe@googlegroups.com</a>.
|
|
|
|
</p>
|
|
|
|
|
|
|
|
</body>
|
|
|
|
</html>
|