这个问题的答案可以归结为两件事:1)考虑到node.js的限制,使用BOSH或web套接字会更简单吗?2)如何构建代码,使同一个javascript文件在浏览器中运行得与在Chrome(或其他浏览器)中一样好。很难简明扼要地描述这个问题。
真正的问题是希望代码在浏览器中像在node.js中一样运行良好,同时具有外部依赖关系。
背景
我有这样的想法,我想做一些有趣的小javascript项目。我把这个想法称为jsFun,核心想法是我可以花30分钟到一个小时做一些有趣的事情,并与我的朋友分享。
我一开始就想看看我是否能在一个小时内写出俄罗斯方块,只使用Notepad++、Chrome和Dropbox。我没有成功,但很有趣。
对我来说,"有趣"可能意味着一场游戏,也可能意味着多人游戏。餐巾纸的背面是这样的:
- 我可以在任何一台电脑上进行更改,并通过投递箱将其推出。(检查!)
- 我可以使用我的dropbox公共URL来提供静态页面。(检查!)
- 网络客户端可以使用HTML5网络套接字或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运行。事实上,我想让聊天服务器监控我的dropbox服务器脚本目录的更改,并自动运行这些脚本。
Node.js使用CommonJS模块,浏览器无法加载这些模块。我认为我可以使用RequireJS,理论上可以在任何一种环境中加载代码,但问题变成了浏览器和服务器将使用不同的库来执行web套接字——我如何生成以任何一种方式运行的代码?websocket甚至是一条路吗,因为它似乎是一个不断变化的标准,也许我不能依赖node.js websocket服务器来长期工作。
node.js唯一可用的websockets服务器看起来可能正在进行中:https://github.com/miksago/node-websocket-server
也许我应该使用更成熟的API,比如博世?
此外,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中执行?
如果运行web套接字需要一点努力,不要担心,因为回报远比努力的价值高。
在web套接字出现之前,所有真正基于浏览器的产品都依赖于浏览器不断轮询服务器,这对浏览器、网络和服务器来说都是一个沉重的负担。
在基于HTTP轮询的系统中,即使是简单的消息"hello"也可能导致需要处理千字节的数据。
在网络套接字中,开销在最坏的情况下大约在15字节左右。
另一件事是,网络套接字是事件驱动的,所以你的浏览器可以自由地保持空闲,或者执行其他任务,直到发生实际的通信事件。
至于让代码在前端和后端都能很好地运行的问题,这将是一个让javascript类模块化的问题,并在服务器端使用require()类型的函数,也许在客户端模拟相同的函数来注入您创建的脚本。
有很多演示可以下载和修改,所以就像任何新的编码领域一样,只要跳进去就可以了。这很快就会有意义。