Express — Sinatra для Node

Автор оригинала: Dion Almaer
  • Перевод
require.paths.unshift('path/to/express/lib');
require('express');

get('/', function(){
 this.redirect('/hello/world')
});

get('/hello/world', function(){
 return 'Hello World'
});

get('/bye/world', function(){
 this.render('title.html.haml', {
  layout: false,
  locals: {
   title: 'Bye World'
  }
 });
});

run();

В стремлении сделать серверный JavaScript похожим на Rails или Sinatra мы получили Express. Чистый и простой. Простой и чистый.

Комментарии 70

    +3
    очень интересно смотреть, как js начинает применятся не только в качестве украшалки для web страниц, но как полноценный язык разработки. после знакомства с mooTools я познал, насколько js может быть мощным и что он не сильно уступает ruby.
      +4
      познакомившись с node, я понял, как прекрасен js без браузера…
        0
        GWT уже давно это показал, что весь фронтенд может быть только на js :)
          +1
          пардон, мне какзалось, что GWT просто транслирует Java код в JS, но это немного другой разговор, из разряда трансляторов (например VB в С++ — были подобные штуки)
          0
          Сильно уступает, сильно… но не без плюсов, конечно.
            +1
            я бы не сказал что сильно, большинство фичей и в javascript есть, таких как все классы это объекты, лямбды и т.д.

            просто раньше (во всяком случае я сам) его не рассматривали серьезно за пределами браузера или скриптования в играх (и то редко).
              +1
              Чего нет:

              в языке
              — Классическое наследование, mix-ins
              — method_missing
              — destructuring
              — &:method
              — потоки
              — всё — объекты

              в комьюнити
              — Rails, Rack, Passenger
              — DHH, Yehuda Katz

              Могу по каждому пункту развернуть, почему это действительно нужно, и написать еще много чего))

              В целом, преимуществ node.js два:
              — скорость (да, V8 рулит)
              — молодость (орентир на асинхронность дан изначально, нет legacy кода)

              При этом сам язык менее мощный и выразительный, чем руби (см. выше). Зачем писать на менее мощном языке, при том, что производительность имеет тенденцию повышаться просто из-за следствий закона Мура, я не понимаю.
                +4
                — наследование — используйте любой каркас типа base2.
                — разрушение объектов в языках со сборкой мусора — не дело.
                — для событийно-управляемых приложений и вообще для Unix потоки скорее вредны.
                — Yehuda Katz является контрибутором в такой проект, как jQuery Core.

                А вообще это всё новое, поэтому каркасы ещё только начали создаваться. аналог Синатры уже есть.

                  0
                  > используйте любой каркас типа base2
                  Они кривы в мелочах.
                  > разрушение объектов в языках со сборкой мусора — не дело.
                  Вы не поняли. multi.rubyforge.org/text8.html
                  > для событийно-управляемых приложений и вообще для Unix потоки скорее вредны.
                  Согласен, что в этом классе приложений они не нужны. Тем не менее, я говорил о мощности языка и платформы вообще.
                  > Yehuda Katz является контрибутором в такой проект, как jQuery Core
                  и?
                    0
                    Потоки вообще-то редко входят в основу языка, а обычно предоставляются библиотеками.

                    Доя Javascript уже есть стандартная библиотека www.whatwg.org/specs/web-workers/current-work/
                      0
                      >> Yehuda Katz является контрибутором в такой проект, как jQuery Core
                      > и?
                      И, следовательно, он есть в нашем сообществе.

                      > Они кривы в мелочах.

                      Ничто не мешает поправить видимые вам мелочи самостоятельно.

                      Всё ведь написано на том же Javascript.
                        0
                        Кривости и-за ограниченности языка, а не из-за багов. Это не исправить.
                        Yehuda пишет server-side JS?
                        jQuery на node.js неприменима.
                          +1
                          Прежде чем говорить о неприменимости, стоило бы изучить вопрос.

                          github.com/tmpvar/jsdom/blob/master/example/jquery/run.js

                          Вы недостаточно изучили предметную область (хотя бы сам язык), а уже считаете себя правее остальных :)
                            0
                            I'm sorry to report that it is going to take more work to get jQuery running on jsdom. Sizzle however does work! I really want to keep jsdom as light as possible, so adding in full browser emulation like env.js is not really a priority at this time.
                            stackoverflow.com/questions/1801160/can-i-use-jquery-with-node-js
                            Это от автора jsdom.

                            По поводу моего незнания, вывод абсолютно нелогичен. И неверен, кстати (полтора года хардкорного JS). ПРавее остальных себя не считаю. Привык оперировать аргументами.
                              +1
                              Речь в этой фразе о том, что часть jQuery, включая Sizzle, уже работает.

                              И надо приложить ещё усилия, чтобы заработали многие другие части API.

                              Кроме того, это всего-лишь один из подходов.

                              Например, env.js + rhino github.com/jeresig/env-js, нгш + node.js www.yuiblog.com/blog/2010/04/09/node-js-yui-3-dom-manipulation-oh-my/

                              Всё активно растёт в настоящее время.
                                –2
                                Тем не менее ваш выпад на «jQuery на node.js неприменима», простите, в лужу…
                                И по многим другим пунктам контраргументов пока не вижу.
                                  +1
                                  Так ведь применима. Движок селекторов — один из самых больших кусков jQuery.
                        0
                        движок от mozilla поддерживает Destructuring assignment и method_missing, может и v8 в будущем будет поддерживать
                          0
                          Хорошо бы… еще б им от примитивных типов отказаться…
                          * и будет тогда все тормозить пипецкак ;)
                            +2
                            как руби)
                      +4
                      знаете, а ведь обилие фишек — это не всегда плюс. Достаточно вспомнить хотя бы те же С++ или Perl.

                      Я сам питонист, но был при ближайшем рассмотрении очарован простотой и элегантностью Javascript. Откровенно говоря, прототипирование мне даже показалось более логичным, нежели привычный ООП с классами. Хотя, конечно, есть и в JS неувязки и неоднозначности.

                        +1
                        Простотой — да, но некоторые языковые вещи на нем принципиально невозможны, ввиду отсутствия method_missing, например, или наличия примитивных типов.
                          +1
                          ну и что? а что вообще значит «невозможны»? Невозможно Жигуль разогнать до скорости Порше. А сайт собрать можно на любом языке.

                          Отсутствие какой-либо фишки не значит, что в принципе чего-то сделать нельзя из функционала, а просто значит «это нельзя сделать так, как мы привыкли это делать в любимом языке».
                            0
                            некоторые языковые вещи…
                              +4
                              проблема вашей логики в том, что вы записываете в недостатки ДжаваСкрипта то, что он не такой как Руби. ДжаваСкрипт другой. Вот и все. И то, что в руби реализован какой-то синтаксический сахар не значит, что джаваскрипт плох из-за того, что в нем это реализуется другим способом.
                                +1
                                Джавакрипт не плох, просто он менее мощный ( в терминах Пола Грехама, www.paulgraham.com/avg.html ), чем руби.
                              +1
                              А сайт-то можно хоть на асме написать…
                                +1
                                Только не хочется…
                          +1
                          В js тоже можно сказать все объекты (есть примитивы, конечно типо number, string, но при вызове метода у примитива создается обертка-объект). Mix-in фактически это просто копирование методов и реализуется просто. Насчет destructuring это есть в js 1.7 — https://developer.mozilla.org/en/New_in_Javascript_1.7#Destructuring_assignment_(Merge_into_own_page.2fsection), а в ECMAscript Harmony (aka ECMAscript 6) это планируется внедрить также как и method_missing (в js это будет noSuchMethod). Также есть форк node.js с реализацией noSuchMethod. А комьюнити дело времени =)
                            0
                            > при вызове метода у примитива создается обертка-объект
                            Не во всех случаях.
                            10.times(function(){})
                            «preved».encode()

                            Mix-in — совсем не копирование методов. Сохраняется связь. Например, при добавлении метода в примешиваемый модуль он появится у всех объектов, с включенным этим модулем.
                              +1
                              10.times(function(){})
                              «preved».encode()

                              У number первая точка является отделением от дробной части числа, поэтому в случае с number нужно либо так: 10..times(function(){...}) либо так (10).times(function(){...}) (В спеке все описано). Про строку не понял. Достаточно добавить свой метод в прототип String и все работает. С mix-in верно, связи не будет, но не припомню случая, когда mix-in динамически менялся у меня.
                                +1
                                Да, я неправ. Где-то в другом месте у меня это стреляло. Тут все клёво.
                                Про mix-ins — манкипатчинг усложняется сильно если связи нет.
                    0
                    Отличный фреймворк, хотя и немного отстаёт от выхода новых версий Node.
                      +2
                      Кто-нибудь поделится опытом использования NodeJS в более-менее серьезных проектах? Интересно бы почитать плюсы, минусы…
                        0
                        Я уже перевёл один из проектов с Синатры на node.js, полёт нормальный.

                        Пока не хватает асинхронного биндинга к mysql, хотя есть три проекта, которые планируют таковыми стать (node-libmysqlclient, node-libdrizzleclient).
                          0
                          node-libdrizzleclient уже выложили в public? :-)
                            0
                            я просто не помнил имени. если точнее, речь об этой болванке — github.com/mme/my-nizzle
                              0
                              At the moment, it only supports asynchronous connecting and disconnecting…
                                0
                                > речь об этой болванке

                                Это уже много, кстати. Надо просто это добить до ума.
                                  0
                                  Это точно, как я свой биндинг не добью для MySQL 5.0 + CentOS, пока что падает.
                            0
                            Ой, а вы не скажете, что там с производительностью, сколько примерно запросов в секунду на типичную страницу с контроллером/моделькой/шаблоном получается?
                              0
                              У меня задача не упиралась в производительность. Сейчас померил — чуть более 4000 запросов в секунду держит, но надо бы ещё померять старое.
                                –2
                                Ну так это хорошо :) Жаль, в Javascript нет модулей, require_once, классов, наследования и *нативной* (не на яваскрипте) функции Object.extend(), e нас в PHP 50-100 запросов в секунду всего лишь :'(
                                  0
                                  Какая разница, если Javascript всё равно компилируется в нативный код?
                                  0
                                  И железо примерно какое, скажите пожалуйста? Я ж теперь спать спокойно не могу, пока у кого то 4000 запросов в секунлу выполняется.
                                    0
                                    На этом железе много чего висит, помимо данной задачи,

                                    Сейчас нагрузка выросла, скорость упала:
                                    Requests per second: 3151.96 [#/sec] (mean)

                                    Fedora Core 12 на Intel® Xeon(TM) CPU 2.80GHz

                                    cat /etc/cpuinfo показывает 4 процессора по 1 ядру.
                                      0
                                      У меня просто очень специфичная задача.

                                      На более классической работе вполне проседает до 50 запросов в секунду.

                                      К тому же node.js пока ещё в мастере не поддерживает префоркинг, что ограничивает производительность.
                              0
                              Интересно, почему в последнее время всё чаще упоминается Node.js, а Jaxer, напротив, упоминался лишь пару раз после выхода?
                                +1
                                node.js банально проще (меньше лишнего) и создан как событийный сервер.
                                0
                                все экшены вы предлагаете пихать в один файл?
                                  0
                                  можно разделить на группы и подключать через require
                                    0
                                    это неудобно. сделайте роуты запросов в файлы
                                      +1
                                      Это разные подходы.

                                      Express — является клоном Sinatra (http://www.sinatrarb.com), идеального каркаса для маленьких приложений.

                                      При желании можно использовать каркас, более близкий к Rails.

                                      Их сейчас более 14, рекомендую посмотреть на Geddy или Bomber.

                                      Кстати, wiki.github.com/ry/node/modules#web-frameworks-full
                                        0
                                        и когда приложение вырастает предлагаете всё нафиг переписывать?

                                        зачем клонировать глупости, предназначенные лишь для «привет мир»?
                                          +2
                                          Вы просто не знакомы с некоторыми идеями гибкого программирования.

                                          Одна из важнейших идей — не писать ничего на вырост. Когда приспичит, дописать необходимое, и отрефакторить.
                                            –1
                                            эта недальновидная идея слишком развращает неокрепшие умы программистом и позволяет им оправдывать свою безалаберность в разработке архитектуры, которая должна быть максимально гибкой и не приводить к экспоненциальному росту сложности по мере развития проекта
                                    +1
                                    Это обычный подход для большинства приложений.

                                    В тех же Rails маршруты обычно все прописываются в одном файле (config/routes.rb).
                                      –2
                                      это глупый подход, который усложняет приложение
                                        0
                                        это как? вообще все? или как в Джанго — принято расщеплять на куски?
                                          0
                                          Вариантов много.

                                          Обычно в одном файле, ибо этого достаточно.

                                          Но разные плагины и rails engines (модули типа Вики, блогов и т.д., к примеру), к примеру, могут дописывать свои маршруты.

                                      0
                                      А не в курсе сколько памяти ест сервер?
                                      Интересно в сравнении с пхп движками. Хостинг для пхп дешевый, порой для клиента это решающая роль.
                                        0
                                        Не могу сравнить, нет PHP на сервере :)

                                        соберите и запустите пример у себя, это просто (configire, make, make install).
                                          0
                                          да я собрал запустил. При простое жрет 9мб. При нагрузках серьезных до 50 доходит. Сравнил с синатрой с запущенным одним монгрелом, у синатры 50мб, как без нагрузки так и с ней. Вот только с пхп не знаю как сравнивать) Там куча вариантов и не знаю как тестить)
                                            0
                                            При наличии idle time сервер node.js агрессивно запускает сборку мусора.

                                            Так что потребление памяти будет плавать.
                                              0
                                              Сборщик мусора вообще порадовал. А то у всех остальных со временем бывает потребление памяти только растет.
                                              Я вот теперь думаю если писать сайты js + mongodb например, то теперь можно будет клиентам предлагать сайты с дешевым vps 128 или даже 96мб памяти. А то писать на рельсах визитки или на других руби фреймворках выходит затратно.
                                                +1
                                                Для визиток есть Jekyll etc. :)
                                        0
                                        Ребята! А напишите, пожалуйста, топик в духе «SSJS: первый HelloWorld» =] (гугл молчит)
                                        Очень хочется попробовать написать какой-то на серверном JS, но боюсь дальше освоения Денвера я не ушел :(
                                          0
                                          var sys = require('sys'),
                                          http = require('http');
                                          http.createServer(function (req, res) {
                                          res.writeHead(200, {'Content-Type': 'text/plain'});
                                          res.end('Hello World\n');
                                          }).listen(80, "0.0.0.0");
                                          sys.puts('Server running at 0.0.0.0:80/');
                                            0
                                            Вот я потому и попросил написать топик, чтобы избежать в комментах вопросов: «А где его запускать?», «А на че означает 3-я строчка?»…
                                            Потому что все эти вопросы сейчас роятся в моей голове (
                                              0
                                              Это всё есть здесь — nodejs.org
                                              Можно прям последовательно всю страничку прочитать :)

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

                                        Самое читаемое