|
|
@ -1,5 +1,7 @@ |
|
|
|
<html> |
|
|
|
<style> |
|
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
|
|
<head> |
|
|
|
<style type="text/css"> |
|
|
|
ul { |
|
|
|
padding: 0; |
|
|
|
margin: 0; |
|
|
@ -7,10 +9,11 @@ |
|
|
|
</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"> |
|
|
|
|
|
|
|
<link type="text/css" rel="stylesheet" href="style.css" /> |
|
|
|
<link type="text/css" rel="stylesheet" href="sh_vim-dark.css" /> |
|
|
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
|
|
|
<title>node.js</title> |
|
|
|
</head> |
|
|
|
<body onload="sh_highlightDocument();"> |
|
|
|
<div id="toc"> |
|
|
|
<ol> |
|
|
@ -26,11 +29,15 @@ |
|
|
|
|
|
|
|
<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 id="introduction"> |
|
|
|
Purely event-based I/O for |
|
|
|
<a href="http://code.google.com/p/v8/">V8 javascript</a>. |
|
|
|
</p> |
|
|
|
|
|
|
|
<p>An example of a web server written with Node which responds with |
|
|
|
<p> |
|
|
|
An example of a web server written with Node which responds with |
|
|
|
"Hello World" after waiting two seconds: |
|
|
|
</p> |
|
|
|
|
|
|
|
<pre> |
|
|
|
new node.http.Server(function (req, res) { |
|
|
@ -40,130 +47,150 @@ new node.http.Server(function (req, res) { |
|
|
|
res.finish(); |
|
|
|
}, 2000); |
|
|
|
}).listen(8000); |
|
|
|
puts("Server running at http://127.0.0.1:8000/"); |
|
|
|
</pre> |
|
|
|
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> |
|
|
|
To run the server, put the code into a file |
|
|
|
<code>example.js</code> and execute it with the <code>node</code> |
|
|
|
program |
|
|
|
</p> |
|
|
|
<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. |
|
|
|
<p> |
|
|
|
See the <a href="api.html">API documentation</a> for more |
|
|
|
examples. |
|
|
|
</p> |
|
|
|
|
|
|
|
<h2 id="audience">Audience</h2> |
|
|
|
|
|
|
|
<p>This project is for those interested in |
|
|
|
<p>This project is for those interested in</p> |
|
|
|
<ul> |
|
|
|
<li>server-side javascript |
|
|
|
<li>developing evented servers |
|
|
|
<li>developing new web frameworks |
|
|
|
<li>server-side javascript</li> |
|
|
|
<li>developing evented servers</li> |
|
|
|
<li>developing new web frameworks</li> |
|
|
|
</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 |
|
|
|
<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> |
|
|
|
|
|
|
|
<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. |
|
|
|
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 |
|
|
|
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> |
|
|
|
|
|
|
|
<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> |
|
|
|
|
|
|
|
<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. |
|
|
|
<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> |
|
|
|
|
|
|
|
<h2 id="download">Download</h2> |
|
|
|
<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. |
|
|
|
</p> |
|
|
|
|
|
|
|
<p><a href="http://github.com/ry/node/tree/master">The git repo</a> |
|
|
|
<h2 id="download">Download</h2> |
|
|
|
|
|
|
|
<p> |
|
|
|
<a href="http://github.com/ry/node/tree/master">The git repo</a> |
|
|
|
</p> |
|
|
|
<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> |
|
|
|
<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> |
|
|
|
<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> |
|
|
|
</li> |
|
|
|
</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. |
|
|
|
<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. |
|
|
|
</p> |
|
|
|
|
|
|
|
<pre class="sh_none"> |
|
|
|
./configure |
|
|
|
make |
|
|
|
make install |
|
|
|
</pre> |
|
|
|
make install</pre> |
|
|
|
|
|
|
|
<p> Then have a look at the <a href="api.html">API documentation</a>. |
|
|
|
<p> |
|
|
|
Then have a look at the <a href="api.html">API documentation</a>. |
|
|
|
</p> |
|
|
|
|
|
|
|
<p>To run the tests |
|
|
|
<p>To run the tests</p> |
|
|
|
|
|
|
|
<pre class="sh_none"> |
|
|
|
./configure --debug |
|
|
|
make test |
|
|
|
</pre> |
|
|
|
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> |
|
|
@ -175,6 +202,6 @@ make test |
|
|
|
code for the chat room is at <a href="http://github.com/ry/node_chat/tree/master">http://github.com/ry/node_chat</a>. |
|
|
|
The chat room is not stable and may be occasionally go down. |
|
|
|
</p> |
|
|
|
|
|
|
|
</div> |
|
|
|
</body> |
|
|
|
</html> |
|
|
|