Обращаю внимание на то, что если вы не программировали, например, на Python или Ruby, только на PHP, не обходите его стороной, это не ещё один незнакомый язык. И в этом его преимущество — Javascript — знакомый язык, особенно для тех, кто программировал на PHP+Javascript, но PHP не позволял очень многих вещей, особенно в связке с Apache, например, аплоад файлов с полосой загрузки (без Flash), возможность низкоуровневого управления сетью (возможность написать, например, клиента или сервер Mysql или прокси-сервер вроде nginx).
О гибкости языка говорит тот факт, что расширения для работы с MySQL, например, написаны на самом Javascript.
Я планировал написать статью с описанием этой замечательной системы, с примерами, но на момент чтения читателю хорошо бы иметь под рукой установленную версию node.js. Поэтому этот пост о том, как установить node.js, в том числе и на Windows, что актуально в связи с недавним появлением порта под cygwin. (Да, есть информация о том, где скачать node.exe)
Важное замечание.
В первую очередь хочу обратить внимание на то, что с развитием node.js его синтаксис менялся, порой несколько раз. В связи с этим, категорически не рекомендую использовать старые версии node, проскальзывающий недавно node.NET, и подобные сборки. Идеально — версия 0.1.90 или новее. По той же причине будьте внимательны при нахождениии в сети туториалов по установке. Те, что начинаются с wget http://s3.amazonaws… загрузят устаревшую версию.
Перед установкой убедитесь в том, что python установлен, он нужен для конфигурации и сборки с помощью make (актуально для всего, кроме Windows в некоторых случаях).
GNU/Linux
Под Linux node.js ставится проще всего.
Заходим на nodejs.org
Копируем ссылку на исходники
wget http://nodejs.org/dist/node-v0.1.97.tar.gz
tar -xvf node-v0.1.97.tar.gz
//либо делаем так
git clone git://github.com/ry/node.git (если git есть)
cd node*
./configure
make
make installХабрахабр советует в коментариях:
Programmer
Лучше было бы собрать как минимум при помощи checkinstall
checkinstall --fstrans=no --install=no --pkgname=node.js --pkgversion "0.1.97" --default
Логика подсказывает, что под MacOS установка будет аналогичной, проверить не могу. Разработчики тестируют своё детище на MacOS, работать должно без проблем.
FreeBSD
У меня VDS на FreeBSD, и поэтому для меня эта система наиболее актуальная. Вместе с тем, разработчики не тестируют node.js на FreeBSD, поэтому возможны некоторые проблемы.
Перед установкой необходимо убедиться в наличии libexecinfo. Ставится он так:
cd /usr/ports/devel/libexecinfo
make installТак же подсказали,
hilobok:
На FreeBSD чтобы не собирать libexecinfo из портов достаточно сделать:
pkg_add -r libexecinfo
Итак, классический способ#1
cd /usr/ports/www/node
make
make installТот, что доктор прописал, рекомендуется всем. Тем, кто не знал о том, что node присутствует в портах — знайте.
Способ#2
Если у портах node отсутствует, можно попытаться установить с помощью классического способа, описанного выше (под Linux): wget или git clone; tar -xvf; configure; make и т.д.Но, судя по всему, таким способом не выйдет установить node на 64-битную систему.
Способ#3
Если возникли какие-либо проблемы (а у меня возникали), есть очередной способ.Заходим на страницу www.freebsd.org/cgi/query-pr.cgi?pr=145641
Скачиваем файл node-0.1.90.shar
Или создаём файл node-0.1.90.shar и заполняем его содержимое вручную (для тех, у кого wget споткнётся о знак амперсанда в url, и не хочется разбираться, в чём дело).
Говорим:
sh node-0.1.90.shar
cd node
make
make installПодобные файлы (.shar), ежели они будут появляться впоследствии, можно будет найти тут: b23.ru/exxw
Способ от AterCattus
При сборке под FreeBSD 8.0_RELEASE amd64 с первого раза не собралось:
...obj/release/cpu-profiler.o(.text._ZN2v88internal23ProfilerEventsProcessor19FunctionCreateEventEPhS2_i+0x81): In function `v8::internal::ProfilerEventsProcessor::FunctionCreateEvent(unsigned char*, unsigned char*, int)':
: undefined reference to `v8::internal::OS::ReleaseStore(long volatile*, long)'
obj/release/cpu-profiler.o(.text._ZN2v88internal23ProfilerEventsProcessor15CodeCreateEventENS0_6Logger16LogEventsAndTagsEiPhj+0xa3): more undefined references to `v8::internal::OS::ReleaseStore(long volatile*, long)' follow
scons: *** [obj/release/mksnapshot] Error 1
scons: building terminated because of errors.
Waf: Leaving directory `/home/atercattus/node.js/node-v0.1.97/build'
Build failed: -> task failed (err #2):
{task: libv8.a SConstruct -> libv8.a}
*** Error code 1
Помогла эта ссылка: code.google.com/p/v8/issues/detail?id=726.
Там все просто, в v8/src/platform-freebsd.cc добавляется между int OS::ActivationFrameAlignment() и const char* OS::LocalTimezone(double time) реализация недостающей функции:
void OS::ReleaseStore(volatile AtomicWord* ptr, AtomicWord value) {
__asm__ __volatile__(""::: «memory»);
*ptr = value;
}
Может кому поможет.
Обновление на момент 11 июня
Вышеприведённый патч не актуален для последней версии из git — само прекрасно компилится под freebsd-amd64Установка под Windows
Забудьте про .NET версию, по крайней мере, до появления порта версии 0.1.90 (см. примечание выше). Придётся использовать Cygwin. Тут есть два способа — находите, качаете, ставите Cygwin, добавляете python, g++, другие зависимости, возможно правите ручками исходники node… Если есть время и желание — пожалуйста, в таком случае Cygwin-совместимый порт брать тут.
Я предлагаю более простой вариант:
Скачиваем архив с прекомпилированным node.exe: drop.io/2dwcadi или dl.dropbox.com/u/626643/node-cygwinx86.zip — зеркало на dropbox. Это последняя версия, доступная для Cygwin (0.1.95), кроме того, для неё cygwin и не нужен (она portable). Распаковываем.
Есть еще один запасной вариант, через colinux: bit.ly/9hCjHO
Примечание:
azproduction:
Для пользователей windows (если у вас node.exe и server.js лежат в разных местах) команда для запуска из-под Cygwin версии будет:
node.exe /cygdrive/буква_диска/путь/до/скрипта/server.js
относительные пути не понимает, windows пути с любыми слэшами тоже не понимает.
Также небольшой апдейт — на данный момент (11 июня) из-под cygwin можно собирать оригинальный node.js, скачав его с помощью git.
Тест — драйв
Для запуска создаём файл, например, server.js. Содержимое-образец можно взять на nodejs.org.
В cmd переходим в распакованную папку и говорим:
node.exe server.jsВ *nix аналогично, переходим в распакованную папку и говорим:
node server.jsОбращаю внимание, что тормоз в две секунды в примере — это не тормоз, а специальная отсрочка отдачи, реализованная через setTimeout, просто в качестве демонстрации возможностей.
Мой любимый пример немного другой:
var sys = require('sys'),
http = require('http');
var i=0;
http.createServer(function (req, res) {
i++;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World'+i+'\n');
res.end();
}).listen(8000);
sys.puts('Server running at 127.0.0.1:8000/');Обратите внимание на инкремент переменной при обновлении страницы.
Чтобы выключить сервер/перезагрузить с другим скриптом, нажмите Ctrl+C (и заново запустите node). Обратите внимание, что если вы запустите node через putty, например, то при закрытии консоли node выключится. Я думаю, разобраться в этом несложно, самый простой вариант — запускать screen, либо демонизировать процесс, добавив node в /etc/init.d, выключая при помощи команды stop или killall node. Подробнее о такой установке (на английском) тут.
Это всё.
Настройка nginx
Далее, ваш сервер, скорее всего, будет работать на 80 порту, а node, например, на 8000. Чтобы было удобнее писать скрипты с красивыми адресами, настраиваем nginx, прописывая в конфиге:
location /ajax/ {
proxy_pass http://127.0.0.1:8000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}Как замечено в комментариях, эта конструкция не подходит для настоящих проектов, и надо настраивать Timeout, размеры сообщений, и т.д. кроме того, всё равно придётся настраивать количество одновременнызх подключений в самой системе. Т. е. эта конструкция подходит для ознакомления и для тестирования.
Теперь при запросе example.com/ajax содержимое отдаст node.js.
Обратите внимание, скрипт, запущенный в node в таком случае определит url не как равным '/ajax/', а именно как '/'.
На этом можно остановиться, получив рабочий node.js, можно начинать его трогать ручками. Эта штука — действительно замечательна. Напоследок несколько ссылок:
nodejs.org/api.html Документация
kuroikaze85.wordpress.com/all-node-js-entries — Сборник статей о node хабрачеловека Сергея Широкова (kurokikaze).
howtonode.org — статьи и заметки на английском Тима Касвелла (Tim Caswell aka creationix).