Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Node.js (https://javascript.ru/forum/server/6992-node-js.html)

Kolyaj 09.01.2010 23:08

Node.js
 
http://kolyaj.ya.ru/replies.xml?item_no=2953
Цитата:

Покопался с Node.js. Для тех, кто не знает -- это такой серверный асинхронный JavaScript. Все три слова для меня ключевые, я люблю JavaScript, я люблю писать на нём в асинхронном стиле, и я давно, но не активно, ищу замену для PHP на сервере, т.к. после создания кода на JS в промышленных масштабах к PHP вернуться не могу. Так что всё, что будет написано, сильно субъективно, впрочем как и всегда.

Я написал на нём парсер логов достаточно кривого формата, которые после парсинга складываются в CouchDB. Т.к. сам Node.js предоставляет только низкоуровневые функции работы с файлами (что, несомненно, хорошо), то пришлось сначала написать функцию, наподобие PHP-шной file, но которая генерирует события по прочтении очередной строки файла (а логи, кстати, многострочные). Вокруг неё уже реализовался класс, генерирующий событие после прочтения очередной записи лога. А обработчик этих событий уже отсылал записи в CouchDB (тоже несколькими строчками). И всё это асинхронно, т.е. одновременно читается файл, одновременно парсится, одновременно отправляются несколько HTTP-запросов и всё это несколькими функциями без всяких потоков.

Вобщем достаточный минимум для серверных приложений в Node.js есть, осталось написать необходимый в виде пары сотен библиотек на любой вкус. Большинство, к сожалению, кинулось реализовывать никому не нужные в данном случае web-фреймворки, хотя есть несколько достаточно оригинальных решений, как например реализация доступа к sqlite, запускающая в отдельном процессе sqlite3 и парсящая её вывод в консоль.

Из особо бредовых на мой взгляд node-XMLHttpRequest, реализующая интерфейс XMLHttpRequest. Тот самый убогий интерфейс, для которого в браузерных фреймворках создают обёртки не ради кроссбраузерности, а ради удобства. При этом в Node.js нормальный HTTP-клиент из коробки.

Короче от использования его в продакшне меня останавливает только вопрос хостинга, т.к. админ из меня некудышный, линуксоид тоже, поэтому я давно не могу решится взять vds, т.к. не знаю, что с ним делать :).

З.Ы. Ах да, главный минус -- addListener не принимает контекста вызова колбэка, и я даже не знаю, что с этим делать, кроме повсеместного использования func.bind(), что мне не сильно нравится.

Dmitry A. Soshnikov 10.01.2010 00:06

Спасибо, надо будет выделить время, тоже покапаться с серверным JS. Вкратце, конечно, читал обзоры, но не смотрел (и тем более, глубоко).

Основной принцип - они расширили какой-то движок (V8 в данном случае) новым функционалом и запускают этот интерпретатор на серваке?

Какие ещё альтернативы есть (тут, вроде недавно была похожая тема с каким-то другим серверным JS)? Какие лучшие?

Что за фреймворки? Кто пишет? Как их писать? Так же, как и для клиентского JS?

update:

Посмотрел исходники.

Kolyaj 10.01.2010 00:28

Цитата:

Сообщение от Dmitry A. Soshnikov
Основной принцип - они расширили какой-то движок (V8 в данном случае) новым функционалом и запускают этот интерпретатор на серваке?

Он (Ryan Dahl) написал на C++ движок, использующий гугловский v8 для исполнения JS, и предоставляющий в JS объекты для асинхронного ввода/вывода.

Цитата:

Сообщение от Dmitry A. Soshnikov
Какие ещё альтернативы есть (тут, вроде недавно была похожая тема с каким-то другим серверным JS)? Какие лучшие?

Какие лучшие -- это, конечно, будет сильно субъективно. Но в данном случае неоспоримые преимущества: скорость v8 и асинхронность.

Цитата:

Сообщение от Dmitry A. Soshnikov
Что за фреймворки? Кто пишет?

http://wiki.github.com/ry/node

Цитата:

Сообщение от Dmitry A. Soshnikov
Как их писать? Так же, как и для клиентского JS?

Ну вот нет, например, нативного клиента для MySQL. Можно пойти в доки по MySQL, почитать формат общения клиента с сервером по TCP и написать асинхронного клиента на JS. Отличия от клиентского JS в задачах и в предоставляемых хост-объектах.

Dmitry A. Soshnikov 10.01.2010 00:50

Цитата:

Сообщение от Kolyaj
Он (Ryan Dahl) написал на C++ движок, использующий гугловский v8 для исполнения JS, и предоставляющий в JS объекты для асинхронного ввода/вывода.

Да, я посмотрел уже исходники, ядро (основное расширение для V8) - на С++, базовая библиотека - на JS.

Цитата:

Сообщение от Kolyaj
скорость v8 и асинхронность

В смысле, асинхронность? Мульти-треды, мульти-процессы? Или тот же setTimeout?

Цитата:

Сообщение от Kolyaj
http://wiki.github.com/ry/node

Угу, спасибо, полистаю.

Я вот эту тему имел в виду: http://javascript.ru/forum/project/6...zhenijj-2.html Там тоже наподобие - какой-то движок расширен (возможно, Rhino, т.к. там фигурирует Java тоже; хотя, это лучше в той теме интересоваться)?

Node.js тоже как-то с облачной платформой связан? А в чём принципиальное отличие этой облачной платформы от этого Node.js?

Kolyaj 10.01.2010 01:05

Цитата:

Сообщение от Dmitry A. Soshnikov
В смысле, асинхронность? Мульти-треды, мульти-процессы? Или тот же setTimeout?

Например: написан у нас веб-сервер на Node.js, приходит запрос, нам нужно прочитать с диска файл. В случае с тем же PHP чтение файла будет синхронным и весь процесс заблокируется на время чтения, поэтому там создаётся много процессов для обработки многих запросов. В случае с Node.js оставляется колбэк, который будет вызван, когда файл будет считан с диска, а за то время пока он читается, текущий процесс обрабатывает остальные http-запросы. Т.е. как с XMLHttpRequest в браузере. Так что скорее setTimeout.

Цитата:

Сообщение от Dmitry A. Soshnikov
Я вот эту тему имел в виду: Облачная платформа для разработки javascript приложений Там тоже наподобие - какой-то движок расширен (возможно, Rhino, т.к. там фигурирует Java тоже; хотя, это лучше в той теме интересоваться)?

Node.js тоже как-то с облачной платформой связан? А в чём принципиальное отличие этой облачной платформы от этого Node.js?

Я вот, честно говоря, не понял, зачем эта облачная платформа мне лично могла бы пригодиться, а более подробно разбираться было лень. Но там Rhino, а это очень медленно. Вот тут человек говорит
Цитата:

Предварительные результаты: для Node в виртуальной машине и Rhino на обычной разница примерно в 6-7 раз, но это для единовременного выполнения скрипта. В случае обработки серии запросов Rhino будет ещё больше отставать из-за времени, необходимого на запуск JVM.

Dmitry A. Soshnikov 10.01.2010 01:51

Цитата:

Сообщение от Kolyaj
Например: написан у нас веб-сервер на Node.js, приходит запрос, нам нужно прочитать с диска файл. В случае с тем же PHP чтение файла будет синхронным и весь процесс заблокируется на время чтения, поэтому там создаётся много процессов для обработки многих запросов. В случае с Node.js оставляется колбэк, который будет вызван, когда файл будет считан с диска, а за то время пока он читается, текущий процесс обрабатывает остальные http-запросы. Т.е. как с XMLHttpRequest в браузере. Так что скорее setTimeout.

Угу, но на уровне реализации, файл-то, получается, читается в другом треде этого "текущего" процесса. Возможно, так же создаётся несколько процессов с несколькими тредами. Но, я только предполагаю.

Но с точки зрения JS-кода - это просто событийное программирование, где всё разруливается коллбэками и для JS это всё подаётся, как "один" поток?

Ок, будет время, поизучаю глубже.

Вообще, ECMAScript-у ничего не мешает дописать стандартную библиотеку (до уровня Ruby, Python) и расширить сферу использования, включая серверное программирование. Имею в виду, официально, по стандарту (хотя, в ближайшее время это вряд ли будет) + чтобы появилась пара-тройка признанных фреймворков - тогда JS с лёгкостью будет отличной альтернативой PHP/Python/Ruby на сервере.

kurokikaze 15.01.2010 13:52

Цитата:

Сообщение от Dmitry A. Soshnikov (Сообщение 40111)
Вообще, ECMAScript-у ничего не мешает дописать стандартную библиотеку (до уровня Ruby, Python) и расширить сферу использования, включая серверное программирование. Имею в виду, официально, по стандарту (хотя, в ближайшее время это вряд ли будет) + чтобы появилась пара-тройка признанных фреймворков - тогда JS с лёгкостью будет отличной альтернативой PHP/Python/Ruby на сервере.

Имхо стандарт должен определять синтаксис и модель языка, а не список доступных модулей. Так что библиотека может быть и внешней - главное чтобы основные модули были доступны сразу с Node, а дополнительные - по требованию. Кстати, работа над package manager для Ноды уже идёт.

А насчёт реализации - там Global interpreter lock, как в Питоне. Впрочем, если сравнивать side-by-side, Нода по производительности делает питоновский асинхронный Торнадо.

Gvozd 15.01.2010 13:59

Цитата:

Сообщение от Kolyaj
В случае с тем же PHP чтение файла будет синхронным и весь процесс заблокируется на время чтения

в PHP также доступна асинхронность при работе с потоками
используя неблокируемые сокеты, вы можете достаточно сносно работать со многими вещами, используя асинхронность: файлы, сеть, процессы
проблема в том, что эта облать документации слабо документирована, и работает не всегда стабильно.
примеров в сети также не сильно много. но, это возможно

Kolyaj 15.01.2010 14:12

Цитата:

Сообщение от kurokikaze
Кстати, работа над package manager для Ноды уже идёт.

А чем текущий require не устраивает?

Цитата:

Сообщение от Gvozd
в PHP также доступна асинхронность при работе с потоками

Вот только язык не предрасполагает писать в таком стиле.

kurokikaze 15.01.2010 14:14

Цитата:

Сообщение от Kolyaj (Сообщение 40672)
А чем текущий require не устраивает?

Require это способ подключения файлов. А kiwi - способ инсталляции пакетов (с учётом версий и зависимостей) типа apt или rubygems. Или PEAR, если хотите.

Kolyaj 15.01.2010 14:19

Лично мне всегда больше нравился путь PHP, когда скопировал файлы рядом и подключил их, нежели путь того же Python, когда сначала нужно что-то установить.

Gvozd 15.01.2010 14:20

Цитата:

Сообщение от Kolyaj
Вот только язык не предрасполагает писать в таком стиле.

ну, в базовом виде, конечно да.
но, это можно обойти при желании.
в нем есть способы для реализации колбеков, и создания простейшего событийного механизма
я специализируюсь в написании парсеров и граберов на PHP, и мною был сделан несложный модуль(базирующийся на multi-CURL, но легко переделываемый под любую другую асинхронность) из нескольких классов, который позволяет посылать одновременно несколько запросов, и обрабатывать по мере прихода.
кодирование сводится к созданию пары новых классов наследующих базовые: для контроля очереди и количества потоков, и для конкретных запросов(с двумя основными методами-создать запрос, и обработать пришедший)
короче, было бы желание, можно и из веревки застрелится))))
на сим я извиняюсь за офтопик, и ухожу из темы.
если интересна моя тема, то прошу в личку, или новую тему

Kolyaj 15.01.2010 14:25

Цитата:

Сообщение от Gvozd
на сим я извиняюсь за офтопик, и ухожу из темы.

Ну почему же оффтопик, асинхронность по отношению к Node.js как раз не оффтопик :)

Опять же, в стандартном режиме работы в PHP на каждый запрос новый поток. Поэтому пока, например, асинхронно читается файл с диска, потоку, по большому счету, делать нечего. Node.js же в это время обрабатывает другие запросы.

Dmitry A. Soshnikov 15.01.2010 14:25

Цитата:

Сообщение от kurokikaze
Имхо стандарт должен определять синтаксис и модель языка, а не список доступных модулей. Так что библиотека может быть и внешней - главное чтобы основные модули были доступны сразу с Node, а дополнительные - по требованию.

Ну, все built-in модули стандарт описывает (и 3-я и 5-я редакции). Вопрос лишь в том, до какой степени создавать стандартную библиотеку в built-in режиме, а что - оставить для написания 3rd-party разработчикам.

К примеру, Ruby имеет большую стандартную библиотеку (хотя, всё это могло бы быть написано чисто на Руби, а сам Руби был бы небольшим ядром; кстати, где-то недавно видел финальный драфт спецификации по Руби, не знаю, описывались ли там все built-in модули или нет). Python тоже имеет немалую built-in библиотеку и часть py-built-in.

Цитата:

Сообщение от kurokikaze
Кстати, работа над package manager для Ноды уже идёт.

Угу, спасибо, посмотрю. Это какой-то альтернативный менеджер пакетов (в смысле, есть ли стандартный для Node.js)? Автор - Вы? Если да, развивайте - есть хорошая возможность занять нишу.

Цитата:

Сообщение от kurokikaze
А насчёт реализации - там Global interpreter lock, как в Питоне.

Угу, т.е., всё-таки, лочится на определённом моменте, а дальше может делаться fork текущего процесса?

Gvozd 15.01.2010 14:52

Цитата:

Сообщение от Kolyaj
не оффтопик

ну раз так, то продолжаем обмен мнениями)))
Цитата:

Сообщение от Kolyaj
Опять же, в стандартном режиме работы в PHP на каждый запрос новый поток. Поэтому пока, например, асинхронно читается файл с диска, потоку, по большому счету, делать нечего. Node.js же в это время обрабатывает другие запросы.

да, PHP этого не умеет.
на каждый запрос всегда создается либо отдельный поток(модуль), либо отдельный процесс(CGI)
fast-CGI (хотя он не совсем в тему к асинхронным возможностям Node.js) в PHP насколько я знаю не реализован и опция такая поставлена "для заглушки"
НО! Пока конкретный экземпляр скрипта простаивает в ожидании данных из файла, остальные потоки/процессы продолжают обрабатывать запросы, что обеспечивается многопоточностью самой ОС/веб-сервера
Использовать же один процесс для обработки нескольких запросов вперемешку(а не последовательно как в fast-CGI), считаю плохой идеей, по-крайней мере если нету эффективного инструмента для отделения глобальных переменных от переменных индивидуальных для каждого запроса.

в любом случае, использование асинхронности в PHP является достаточно нетипичным, и если уж используется, то как правило пока идет чтение файла(ов), можно делать(и нужно) какое-то полезное действие(обработка прочитанных блоков,действия не зависящие от файла)

Kolyaj 15.01.2010 15:10

Цитата:

Сообщение от Gvozd
fast-CGI (хотя он не совсем в тему к асинхронным возможностям Node.js) в PHP насколько я знаю не реализован и опция такая поставлена "для заглушки"

Если так, то совсем всё плохо.

Цитата:

Сообщение от Gvozd
НО! Пока конкретный экземпляр скрипта простаивает в ожидании данных из файла, остальные потоки/процессы продолжают обрабатывать запросы, что обеспечивается многопоточностью самой ОС/веб-сервера

Так они и при синхронной работе то же самое делают.

Цитата:

Сообщение от Gvozd
Использовать же один процесс для обработки нескольких запросов вперемешку(а не последовательно как в fast-CGI), считаю плохой идеей, по-крайней мере если нету эффективного инструмента для отделения глобальных переменных от переменных индивидуальных для каждого запроса.

// созданные здесь переменные будут глобальными для всех запросов
http.createServer(function() {
    // созданные здесь переменные будут локальными для каждого запроса.
})
А вот обмен данными между запросами в PHP уже можно реализовать только через базу/файлы.

Порог входа, разумеется, получается выше чем у PHP, но зато возможностей гораздо больше.

Gvozd 15.01.2010 15:29

Цитата:

Сообщение от Kolyaj
А вот обмен данными между запросами в PHP уже можно реализовать только через базу/файлы.

есть достаточно мало задач, где бы могло понадобится взаимодействие между происходящими в данный момент запросами.
поэтому как правило БД и файлов вполне достаточно
тем не менее, можно использовать для этого механизм семафоров и общей памяти, хотя не разу им не пользовался, и не в курсе, насколько он эффективен
HEAP-таблицы вполне пригодны для обмена переменными
также в случае CGI можно попытаться писать в stdin-поток других экземпляров скриптов, но не уверен

Kolyaj 15.01.2010 15:39

А мне вот интересно. Simon Willison приводит бенчмарк для сервера, отдающего "Hello, World" через 2 секунды
http.createServer(function(req, res) {
  setTimeout(function() {
    res.sendHeader(200, {'Content-Type': 'text/html'});
    res.sendBody('<h1>Hello World</h1>');
    res.finish();
  }, 2000);
}).listen(8080);
У кого-нибудь есть под рукой инструменты, чтобы проверить PHP в той же ситуации?
<?php
sleep(2);
echo "Hello, World";

moro 06.02.2010 14:36

проверял на mac book pro:
node.js Requests per second: 49.72 [#/sec] (mean)
php Requests per second: 38.97 [#/sec] (mean)

Kolyaj 06.02.2010 19:15

moro,
спасибо, результаты радуют.

Цитата:

Сообщение от moro
node.js Requests per second: 49.72 [#/sec] (mean)

Близко к результатам Симона и к максимально возможному количеству.

Riim 06.02.2010 19:46

Так он быстрей чем PHP или я что-то не так понял?

Kolyaj 06.02.2010 20:58

Ну я в V8 не сомневался, вопрос был насколько быстрей.

Gvozd 07.02.2010 01:03

Цитата:

Сообщение от Kolyaj
Ну я в V8 не сомневался, вопрос был насколько быстрей.

а теперь давайте проведем нормальные бенчмарки?)))
голый hello-world с задержкой-не показатель
основные направления:
1)вывод "голого" HTML
2)задача на парсинг кода(мегабайт кода с одинаковыми вычислениями)
3)голые циклы
4)задача на скорость простейших арифметических вычислений(цикл с небольшим количеством вычислений)

и оценивать надо не количеством запросов в секунду(это во многом зависит еще и от апача), а продолжительностью выполнения, и потраченными CPU

Kolyaj 07.02.2010 10:00

Цитата:

Сообщение от Gvozd
а теперь давайте проведем нормальные бенчмарки?)))

Никто не против.

moro 07.02.2010 10:39

sys = require('sys');
var start = Date.now();
for(var i = 0; i < 10000000; i++){
	a = 0;
	b = a + 100;
	c = b*b;
	d = c + 123456;
	e = d/987;
	f = e*e;
}
sys.puts((Date.now() - start)/1000);

list($usec, $seconds) = explode(" ", microtime());
$start = ((float)$usec + (float)$seconds);
for($i = 0; $i < 10000000; $i++){
	$a = 0;
	$b = $a + 100;
	$c = $b*$b;
	$d = $c + 123456;
	$e = $d/987;
	$f = $e*$e;
}
list($usec, $seconds) = explode(" ", microtime());
$end = ((float)$usec + (float)$seconds);
echo $end - $start;

Запускалось из командной
средний результат:
node.js - 0.57
php - 3.71
Не знаю как точно оценить использование cpu, но когда я увеличивал размер цикла, чтобы успеть посмотреть, монитор показывал примерно одинаковые проценты использования cpu.
Вместо a = 0, ставил a = i, результаты примерно такие же:
0.64
3.96

Gvozd 07.02.2010 14:19

Цитата:

Сообщение от moro
средний результат:
node.js - 0.57
php - 3.71

очень даже замечательно
Цитата:

Сообщение от moro
Не знаю как точно оценить использование cpu

я знаю как под *NIX оценить CPU для PHP
используется ф-ция getrusage(), являющаяся интерфейсом одноименной ф-ции. не знаю, есть ли такая фишка в node.js

moro,
могу я вас попросить провести также и первые три теста?
мне интересен их результат . особенно второго

Kolyaj 07.02.2010 14:27

Цитата:

Сообщение от Gvozd
2)задача на парсинг кода(мегабайт кода с одинаковыми вычислениями)

А вот это что имеется в виду? Парсинг js(php)-кода? Так для Node это не актуально, он единожды парсится, а не при каждом запросе.

moro 07.02.2010 14:31

тестовый код давайте, сделаю

Gvozd 07.02.2010 14:32

Цитата:

Сообщение от Kolyaj
он единожды парсится

это наверняка?
то есть он при старте парсится в байт-код, который уже дальше и выполняется?

Kolyaj 07.02.2010 14:38

Цитата:

Сообщение от Gvozd
то есть он при старте парсится в байт-код, который уже дальше и выполняется?

Не совсем. Скрипт на Node -- это приложение, отвечающее на запросы. Сам себе сервер. В случае PHP апач отвечает на запросы и при надобности загружает/запускает PHP, Node всё делает сам. Т.е. когда приходит запрос, ничего не парсится и не запускается, всё уже запущено.

Поэтому для удобной отдачи статики перед Node не помешает nginx, ну или придётся писать отдельный контроллер для статики, что лишнее, т.к. со статикой прекрасно справляется nginx.

moro 07.02.2010 14:51

да это программа, каждый раз не запускается как php скрипт, для проверки
var sys = require('sys');
var http = require('http');
var a = 1;
http.createServer(function (req, res) {
	res.sendHeader(200, {'Content-Type': 'text/plain'});
	res.sendBody('a: ' + a);
	a++;
	res.finish();
}).listen(8000);

при каждом запросе переменная a будет увеличиваться

Gvozd 07.02.2010 14:58

Цитата:

Сообщение от moro
тестовый код давайте, сделаю

вот, генератор двух одинаковых тестовых кодов
<?

$fp1=fopen('test.php','w');
$fp2=fopen('test.js','w');
fwrite($fp1,"<?\r\n");
fwrite($fp1,"list(\$usec, \$seconds) = explode(\" \", microtime());\r\n");
fwrite($fp1,"\$start = ((float)\$usec + (float)\$seconds);\r\n");

fwrite($fp2,"sys = require('sys');\r\n");
fwrite($fp2,"var start = Date.now();\r\n");
$op=array('+','-','*','/','%');
for($i=97;$i<=122;$i++)
	{
	fwrite($fp1,'$'.chr(rand(97,122))."=0;\r\n");
	fwrite($fp2,'var '.chr(rand(97,122))."=0;\r\n");
	}
$string='$'.chr(rand(97,122)).'='.'$'.chr(rand(97,122)).$op[array_rand($op)].rand(1,1000000).";\r\n";
for($i=0;$i<1000000;$i++)
	{
	$a=chr(rand(97,122));
	$b=chr(rand(97,122));
	$c=$op[array_rand($op)];
	$d=rand(1,1000000).'.'.rand(1,10000);
	$string='$'.$a.'='.'$'.$b.$c.$d.";\r\n";
	fwrite($fp1,$string);
	$string=$a.'='.$b.$c.$d.";\r\n";
	fwrite($fp2,$string);
	}

fwrite($fp1,"list(\$usec, \$seconds) = explode(\" \", microtime());\r\n");
fwrite($fp1,"\$end = ((float)\$usec + (float)\$seconds);\r\n");
fwrite($fp1,"echo \$end - \$start;");
fwrite($fp1,"?>");

fwrite($fp2,"sys.puts((Date.now() - start)/1000);\r\n");

?>

moro 07.02.2010 16:21

заменил rand(97,122) на $i в первом цикле, а то пишет что переменные не определены некоторые.
использовал следующий код для запуска, чтобы измерить полное время парсинга/загрузки/выполнения скрипта
sys = require('sys')
var start = Date.now();
sys.exec('node test.js').addCallback(function(output){//sys.exec('php test.php')
	sys.puts(output);
	sys.puts((Date.now() - start)/1000);
});

результат (в сек)
Код:

node.js 0.024 - время выполения показаное скриптом
        5.5  - время выполения скрипта включая загрузку
php    0.133
        2.43


Gvozd 07.02.2010 17:04

ну, чтож.
Nodejs весьма хорош, чтобы на нем можно было писать
посмотрел список существующих на данный момент модулей
огорчило отсутствие SAX
Самый главный минус вижу, только в низкой степени популяризации.
Мало кто из заказчиков приемлет проект написанный на нем.
но для себя, я думаю смогу найти применение этому инструменту

Kolyaj 07.02.2010 17:42

Цитата:

Сообщение от Gvozd
Самый главный минус вижу, только в низкой степени популяризации.

Это не удивительно, ему года нет.

Цитата:

Сообщение от Gvozd
Мало кто из заказчиков приемлет проект написанный на нем.

Заказчики будут против ещё потому, что тут vds нужен, виртуальный хостинг не покатит.

moro 07.02.2010 18:45

есть libxmljs http://libxmljs.squishtech.com/

Gvozd 07.02.2010 23:08

Цитата:

Сообщение от moro

шикарно

Kolyaj 08.02.2010 18:23

Список модулей растёт не по дням, а по часам, что не может не радовать.

Hivext Technologies 09.02.2010 19:47

Можно добавить node.js в рамках платформы Хайвекст. Соответственно появится выбор между двумя движками Rhino и V8 (node.js) + сервисы и другие возможности станут доступны также в node.js

Kolyaj 09.02.2010 21:15

Hivext Technologies,
а это имеет смысл? Основная фишка -- асинхронность, у вас, я так понимаю, ею не пахнет.


Часовой пояс GMT +3, время: 22:12.