这个问题的答案归结为两件事情:1)考虑到node.js的限制,使用BOSH或Web套接字会更简单吗?2)如何构造代码,以便相同的JavaScript文件同样运行良好在Chrome浏览器(或其他浏览器)中使用浏览器。简洁地描述问题很难。如何编写将在chrome和node.js中运行的JavaScript Web代码?
真正的问题是想要代码在浏览器中运行得如同在node.js中一样,同时具有外部依赖性。
背景
我有这个想法,我要为了好玩小的JavaScript项目。我打电话给jsFun的想法,其核心思想是我可以花30分钟到一个小时制作一些有趣的东西,并与我的朋友分享。
我从一开始就看到能否在一小时内写出俄罗斯方块,除了Notepad ++,Chrome和Dropbox之外别无他法。我没有成功,但很有趣。
对我来说,“有趣”可能意味着一个游戏,它可能意味着多人游戏。后面的餐巾素描看起来像这样:
- 我可以从任何计算机进行更改,并通过Dropbox将其推出。 (检查!)
- 我可以使用我的dropbox公共URL来提供静态页面。 (check!)
- Web客户端可以使用HTML5 Web套接字或BOSH通过node.js聊天服务器路由消息。
- 游戏服务器脚本也可以连接到聊天服务器并实现某种游戏逻辑。
- 游戏服务器脚本既可以在浏览器中运行,也可以在node.js中运行。
下面是一个使用HTML5的网络套接字交谈时的node.js聊天服务器的一个很好的例子: http://html5demos.com/web-socket
比方说,我做的多人井字棋。我的项目需要3个部分:
- 游戏客户端脚本 - 这是在浏览器中运行并为用户呈现游戏的JavaScript。
- 一个聊天中心脚本 - 这是一个在游戏客户端和游戏服务器之间传递消息的聊天服务器。它作为node.js进程运行。
- 游戏服务器端的脚本 - 这个脚本可以在浏览器中进行测试和调试运行,或在node.js中
现在,为了使井字棋,我会确保聊天服务器运行,创建游戏服务器脚本和游戏客户端脚本,并打开三个Web浏览器 - 两个客户端和一个服务器。在那个时候,我可以使用Chrome的真棒调试工具解决任何问题,在记事本++中更新我的更新,并且像疯狂一样刷新浏览器30到60分钟。也许我在那个时候有一个工作游戏。
这是复杂的步骤: 那个游戏服务器脚本我在浏览器中运行,我现在想从node.js运行。实际上,我希望聊天服务器监控我的保管箱服务器脚本目录中的更改,并自动运行这些脚本。
Node.js使用CommonJS模块,浏览器无法加载。我认为我可以使用RequireJS并从理论上在两种环境中加载代码,但问题变成这样一个事实,即浏览器和服务器将使用不同的库来执行Web套接字 - 我如何使代码以任何一种方式运行? websockets甚至是要走的路,因为它似乎是一个不断变化的标准,也许我不能依赖node.js websocket服务器来长期工作。
用于node.js的唯一可用的WebSockets服务器看起来像它可能是一项正在进行的工作: https://github.com/miksago/node-websocket-server
也许我应该使用像波什更成熟的API?
此外,websocket客户端也没有内置到node.js中,所以我必须使用这个: (作为一个新的计算器用户,我无法正常粘贴链接,它是https://github.com/pgriess/node-websocket-client)
我不得不面对挑战,我的游戏服务器代码,使聊天服务器的web客户端连接,将在node.js运行时使用不同的库环境比在Chrome浏览器环境中。
也许不使用require.js,我可以在浏览器中使用标准JavaScript脚本并使用node.js vm.runInContext - 它看起来像我可以在调用脚本之前使用类似函数设置全局变量在node.js或使用标准JavaScript代码的浏览器中的工作方式几乎相同。
重述问题
(假设我已经建立了全球环境事先在任何情况下为用户提供一个通用的接口脚本。)有我写的JavaScript文件中的实际方式访问websocket-client-like功能,可以在浏览器或node.js中执行?
看来我现在正在运行这个版本。 requireJS模块可以接受,并且可以在浏览器和节点中运行。JS。它没有花费太多的工作来适当地注入依赖关系,以便浏览器和node.js客户端运行相同的代码。 另外,http://socket.io/已经实现了一个似乎可以工作的服务器端web套接字客户端(https://github.com/LearnBoost/socket.io-client)。 – 2012-01-10 00:31:55
我很自信相信requireJS是在浏览器和node.js之间共享代码的最佳方式。我只是不确定我是否用socket.io投注了正确的马。我为此折磨自己的原因是因为HTML5 websockets示例非常简单,所有这些增加的复杂性似乎都没有必要。 – 2012-01-10 00:36:46