Ответ на этот вопрос сводится к двум вещам: 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?