Ответ на этот вопрос сводится к двум вещам: 1) будет ли проще использовать BOSH или веб-сокеты, учитывая ограничения node.js, и 2) как мне структурировать код, чтобы один и тот же файл javascript одинаково хорошо работал в браузер, как в Chrome (или другом браузере). Кратко описать проблему сложно.
Настоящая проблема заключается в желании, чтобы код одинаково хорошо работал в браузере, как и в node.js, но при этом имел внешние зависимости.
Фон
У меня возникла идея, что я хочу делать небольшие проекты javascript для развлечения. Я называю эту идею jsFun, и основная идея заключается в том, что я могу потратить от 30 минут до часа, делая что-то веселое и делясь этим с друзьями.
Я начал с того, что посмотрел, смогу ли я написать Tetris за час, используя только 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 для решения любых проблем, делать обновления в блокноте ++ и обновлять браузеры как сумасшедшие в течение 30–60 минут. И, возможно, у меня есть рабочая игра на тот момент.
Это усложняющий шаг: тот скрипт игрового сервера, который я запускал в браузере, теперь я хочу запустить из node.js. На самом деле, я хочу, чтобы чат-сервер контролировал мой каталог сценариев сервера Dropbox на наличие изменений и автоматически запускал эти сценарии.
Node.js использует модули CommonJS, которые браузер не может загрузить. Я думаю, что могу использовать RequireJS и теоретически загружать код в любой среде, но тогда проблема заключается в том, что браузер и сервер будут использовать разные библиотеки для работы с веб-сокетами — как мне сделать код, который работает в любом случае? Можно ли использовать веб-сокеты, поскольку кажется, что это постоянно меняющийся стандарт, и, возможно, я не могу зависеть от сервера веб-сокетов node.js для работы в долгосрочной перспективе.
Единственный доступный сервер веб-сокетов для node.js, похоже, находится в стадии разработки: https://github.com/miksago/node-websocket-server
Может быть, мне следует использовать более зрелый API, такой как BOSH?
Кроме того, клиент websocket также не встроен в node.js, поэтому мне пришлось бы использовать это: (Как новый пользователь stackoverflow, я не могу нормально вставить ссылку. Это https://github.com/ pgriess/узел-websocket-клиент)
Мне пришлось бы столкнуться с проблемой, что мой код игрового сервера, выполняющий подключение веб-клиента к серверу чата, будет использовать другие библиотеки в среде выполнения node.js, чем в среде браузера Chrome.
И, может быть, вместо использования require.js я мог бы использовать стандартные скрипты javascript в браузере и использовать node.js vm.runInContext — похоже, я мог бы настроить глобальную переменную с аналогичными функциями перед вызовом скриптов, и это будет работать в значительной степени точно так же в node.js или браузере, используя стандартный код javascript.
Повторная формулировка вопроса
(Предполагая, что я заранее настроил глобальную среду в любом случае, чтобы предоставить скрипту общий интерфейс.) Есть ли для меня практический способ написать файл javascript, который обращается к функциям, подобным веб-клиенту, который может выполняться в браузер или в node.js?