Как мне написать код веб-сокета javascript, который будет работать в chrome и в node.js? - PullRequest
2 голосов
/ 09 января 2012

Ответ на этот вопрос сводится к двум вещам: 1) Будет ли проще использовать BOSH или веб-сокеты, учитывая ограничения node.js, и 2) Как я могу структурировать код так, чтобы один и тот же файл javascript работал одинаково хорошо в браузере, как в Chrome (или другом браузере). Трудно описать проблему кратко.

Настоящая проблема заключается в том, что код должен работать в браузере одинаково хорошо, как и в node.js, и при этом иметь внешние зависимости.

Фон

Мне пришло в голову, что я хочу делать небольшие проекты javascript для развлечения. Я называю идею jsFun, и основная идея заключается в том, что я могу потратить от 30 минут до часа на то, чтобы сделать что-то веселое и поделиться им с друзьями.

Я начал с того, что смогу написать тетрис за час, используя только Notepad ++, Chrome и Dropbox. Мне не удалось, но это было весело.

Для меня «веселье», вероятно, означает игру, и, вероятно, мультиплеер. Эскиз на обороте салфетки выглядит так:

  • Я могу вносить свои изменения с любого компьютера и выгружать их через Dropbox. (Проверьте!)
  • Я могу использовать свой общедоступный URL-адрес dropbox для показа статических страниц. (Проверьте!)
  • Веб-клиенты могут использовать веб-сокеты HTML5 или BOSH для маршрутизации сообщений через чат-сервер node.js.
  • Скрипты игрового сервера также могут подключаться к серверу чата и реализовывать какую-то игровую логику.
  • Сценарии игрового сервера могут выполняться в браузере или в файле node.js.

Вот отличный пример использования веб-сокетов HTML5 для общения с сервером чата node.js: http://html5demos.com/web-socket

Допустим, я делаю многопользовательские крестики-нолики. Моему проекту нужно 3 части:

  • Скрипт игрового клиента - это javascript, который запускается в браузере и отображает игру для пользователя.
  • Скрипт чата - это чат-сервер, который передает сообщения между игровыми клиентами и игровым сервером. Он запускается как процесс node.js.
  • Скрипт игрового сервера - этот скрипт можно запустить в браузере для тестирования и отладки или в файле node.js

Теперь, чтобы сделать крестики-нолики, я позабочусь о том, чтобы сервер чата работал, создаю сценарий игрового сервера и сценарий игрового клиента и открою три веб-браузера - два клиента и один сервер. В этот момент я могу использовать потрясающие инструменты отладки Chrome для решения любых проблем, делать свои обновления в notepad ++ и обновлять браузеры как сумасшедшие в течение 30–60 минут. И, может быть, в этот момент у меня есть рабочая игра.

Это сложный шаг: Тот сценарий игрового сервера, который я запускал в браузере, теперь я хочу запустить из node.js. На самом деле я хочу, чтобы чат-сервер следил за изменениями в каталоге сценариев моего сервера Dropbox и автоматически запускал эти сценарии.

Node.js использует модули CommonJS, которые браузер не может загрузить. Я думаю, что могу использовать RequireJS и теоретически загрузить код в любой среде, но тогда проблема заключается в том, что браузер и сервер будут использовать разные библиотеки для веб-сокетов - как мне сделать код, который выполняется в любом случае? Является ли веб-сокеты даже подходящим вариантом, так как кажется, что это стандарт в потоке, и, возможно, я не могу рассчитывать на долгосрочную работу сервера веб-сокетов node.js.

Единственный доступный сервер websockets для node.js выглядит так, как будто он находится в стадии разработки: https://github.com/miksago/node-websocket-server

Может быть, мне стоит использовать более зрелый API, такой как BOSH?

Кроме того, клиент websocket также не встроен в node.js, поэтому мне придется использовать это: (Как новый пользователь stackoverflow, я не могу вставить ссылку как обычно. Это https: // github.com / pgriess / node-websocket-client)

Мне пришлось бы столкнуться с проблемой, заключающейся в том, что код моего игрового сервера, устанавливающий подключения веб-клиента к серверу чата, будет использовать другие библиотеки в среде выполнения node.js, чем в среде браузера Chrome.

И, возможно, вместо использования require.js, я мог бы использовать стандартные скрипты javascript в браузере и использовать node.js vm.runInContext - похоже, я мог бы настроить глобальную переменную с похожими функциями перед вызовом скриптов, и это работают почти так же, как в node.js или в браузере, используя стандартный код JavaScript.

Повторный вопрос

(Предполагая, что в любом случае я заранее настрою глобальную среду, чтобы предоставить сценарию общий интерфейс.) Есть ли практический способ для меня написать файл javascript, который обращается к функциям, подобным клиенту websocket, которые могут выполнить в браузере или в node.js?

1 Ответ

0 голосов
/ 11 января 2012

Если для запуска сокетов веб-сокетов требуется немного усилий, не бойтесь, поскольку награда стоит гораздо больше, чем усилия.

До появления веб-сокетов все действительно браузерные предложения основывались на том, что браузер непрерывно опрашивает сервер, что является большой нагрузкой для браузера, сети и сервера.

Даже простое сообщение "привет" в системе, основанной на HTTP-опросе, может привести к необходимости обрабатывать килобайты данных.

В веб-сокетах объем служебной информации в худшем случае составляет около 15 байтов.

Другое дело, что веб-сокеты управляются событиями, поэтому ваш браузер может свободно работать или выполнять другие задачи, пока не произойдет фактическое коммуникационное событие.

Что касается вашего вопроса о том, как сделать код хорошо работающим на переднем и заднем планах, то это будет вопрос о том, чтобы сделать ваши классы javascript модульными и использовать функции типа require () на стороне сервера и, возможно, симулировать ту же функцию на стороне клиента, чтобы внедрить сценарии, которые вы создаете.

Есть много демоверсий, которые можно скачать и переделать, поэтому, как и в любой новой области кодирования, просто запрыгивайте и пачкайте руки. Это скоро будет иметь смысл.

...