-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathindex.htm
194 lines (167 loc) · 11.3 KB
/
index.htm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<!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;
}
</style>
<script type="text/javascript" src="assets/sh_main.js"></script>
<script type="text/javascript" src="assets/sh_javascript.min.js"></script>
<link type="text/css" rel="stylesheet" href="assets/pipe.css" />
<link type="text/css" rel="stylesheet" href="assets/sh_vim-dark.css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>node.js</title>
</head>
<body>
<div id="toc">
<ol>
<li><a href="#download">Загрузить</a></li>
<li><a href="https://github.com/joyent/node/raw/master/ChangeLog">ChangeLog</a></li>
<li><a href="#about">Описание</a></li>
<li><a href="v0.2.x/index.html">Документация по v0.2.6</a></li>
<li><b><a href="v0.4.x/index.html">Документация по v0.4.12</a></b></li>
<li><b><a href="v0.6.x/index.html">Документация по v0.6.12</a></b></li>
<br/>
<li><b><a href="https://github.com/joyent/node/wiki">Wiki</a></b></li>
</ol>
</div>
<div id="content">
<img id="logo" src="assets/logo.png" alt="node.js"/>
<p id="introduction">
Асинхронный I/O фреймворк для <a href="http://code.google.com/p/v8/">V8 JavaScript</a>.
</p>
<p>
Пример web сервера, написанного с помощью Node и отвечающего строкой 'Hello World':
</p>
<pre>
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
</pre>
<p>
Чтобы запустить сервер, поместите код в файл с названием <code>example.js</code>
и выполните его программой <code>node</code>:
</p>
<pre class="sh_none">
% node example.js
Server running at http://127.0.0.1:8124/</pre>
<p>
Простой пример сервера, который возвращает полученный запрос и слушает на порту 8124:
</p>
<pre>
var net = require('net');
net.createServer(function (socket) {
socket.write("Echo server\r\n");
socket.on("data", function (data) {
socket.write(data);
});
}).listen(8124, "127.0.0.1");
</pre>
<p>
Вы можете почерпнуть больше актуальной информации из <a href="https://github.com/joyent/node/wiki">wiki</a> проекта (<a href="http://forum.nodejs.ru/wiki/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0">русскоязычная вики</a> еще в процессе наполнения).
</p>
<h2 id="download">Загрузить</h2>
<p>
<a href="http://github.com/joyent/node/tree/master">Git-репозиторий</a>
</p>
<p>
Последняя стабильная версия: 2011.09.15
<a href="http://nodejs.org/dist/node-v0.4.12.tar.gz">node-v0.4.12.tar.gz</a>
(<a href="v0.4.x/">документация на русском</a>)
</p>
<p>
Последняя разрабатываемая версия: 2011.09.16
<a href="http://nodejs.org/dist/node-v0.5.7.tar.gz">node-v0.5.7.tar.gz</a>
</p>
<p>
Предпоследняя стабильная версия: 2010.12.30
<a href="http://nodejs.org/dist/node-v0.2.6.tar.gz">node-v0.2.6.tar.gz</a>
(<a href="v0.2.x/">документация на русском</a>)
</p>
<p>Все версии: <a href="http://nodejs.org/dist">дистрибутивы</a>, <a href="http://nodejs.org/docs">документация на английском</a></p>
<p>
Инструкции по сборке и список поддерживаемых ОС вы можете найти на странице
<a href="https://github.com/joyent/node/wiki/Installation">https://github.com/ry/node/wiki/Installation</a>
</p>
<h2 id="about">Описание</h2>
<p>
Цель проекта Node - предоставить лёгкий способ построения масштабируемых
сетевых программ. В примере с веб-сервером "hello world" может обслуживаться много одновременных клиентских запросов.
Node сообщает операционной системе (через <code>epoll</code>, <code>kqueue</code>,
<code class="sh_none">/dev/poll</code>, или <code>select</code>)
что её нужно оповещать при создании нового подключения, и
потом переходит в спящий режим. Если кто нибудь подключается, запускается
обработчик. Для каждого соединения выделяется небольшой объём памяти в куче.
</p>
<p>
Это поведение отличается от часто используемого подхода с использованием потоков ОС.
Потоки относительно неэффективны при использовании в сетевых приложениях.
Подробнее об этом можно прочитать <a href="http://www.kegel.com/c10k.html">здесь</a> и
<a href="http://bulk.fefe.de/scalable-networking.pdf">здесь</a>.
Node показывает меньший расход памяти в высоконагруженных системах,
чем подход с созданием потока в стеке, каждый из которых занимает 2Мб.
Кроме того, пользователи Node застрахованы от возможных dead-locks
— в его коде нет блокировок. Почти ни одна функция в Node
не производит прямого ввода/вывода, так что процесс никогда не блокируется.
Из-за этой особенности даже совсем-не-эксперты могут разработатьт быстрые приложения.
</p>
<p>
Node похожа по дизайну и написана под влянием таких систем, как <a
href="http://rubyeventmachine.com/">Event Machine</a> для Ruby и <a
href="http://twistedmatrix.com/">Twisted</a>для Python. Node также
расширяет границы событийной модели — он делает цикл событий частью языка,
а не встраивает с помощью библиотеки. В остальных системах всегда есть
блокирующий вызов для запуска цикла событий. Обычно необходимо описать
поведение с использованием функций обратного вызова и после этого
запустить сервер с помощью вызова похожего на <code>EventMachine::run()</code>.
В Node нет подобного вызова, запускающего цикл событий. Node самостоятельно
входит в цикл после выполнения заданного скрипта. Node выходит из цикла в случае,
если больше не осталось функци обратного вызова, которые могу быть вызваны.
Это поведение подобно поведению Javascript в браузерах — цикл событий скрыт от пользователя.
</p>
<p>
HTTP является первостепенным протоколом в Node. Библиотек HTTP в Node
основана на опыте автора в разработке Web серверов. Например,
потоковая передача данных невозможно в большинстве Web фреймворков.
Node старается исправить подобные проблемы в <a href="http://github.com/ry/http-parser/tree/master">своей реализации парсера HTTP</a>
и API. В совокупности с инфраструктурой, построенной на событиях, это даёт хорошую основу для различных Web библиотек и фреймворков.
</p>
<p>
<i>
Но что насчёт многопроцессорного параллелизма?
Являются ли потоки необходимыми для масштабирования на многоядерные компьютеры?
</i>
Процессы необходимы для масштабирования на многопроцессорные компьютеры, а не потоки, использующие общую прамять.
Основой масштабируемых систем являются быстрое сетевое взаимодействие и неблокирующий дизайн —
остальное должно быть реализовано с помощью передачи сообщений. Возможно,
в будущих версиях Node будет возможность создавать процессы (с помощью <a
href="http://www.whatwg.org/specs/web-workers/current-work/">Web
Workers API </a>), которые будут хорошо вписываться в текущий дизайн.
</p>
<p>
Смотрите также:
<ul>
<li><a href="http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf">слайды</a> с конференции JSConf 2009</li>
<li><a href="http://nodejs.org/jsconf2010.pdf">слайды</a> с конференции JSConf 2010</li>
<li><a href="http://www.yuiblog.com/blog/2010/05/20/video-dahl/">видео</a> с семинара в Yahoo, май 2010</li>
</ul>
</p>
</div>
<div style="padding-top: 10em; font-size: 8pt">
<a href="http://no.de/"><img src="assets/sponsored.png" height="58" width="120"/></a><br/>
<a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String"
title="JS String match"><img
src="assets/promotejsh.gif" height="150" width="180"
alt="JS String match"/></a>
</div>
<div style="clear: both; font-size: 8pt">
Copyright 2010 Joyent, Inc
</div>
<script type="text/javascript">highlight(undefined, undefined, 'pre');</script>
</body>
</html>