2012-01-09 23 views
2

这个问题的答案归结为两件事情: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中执行?

+0

看来我现在正在运行这个版本。 requireJS模块可以接受,并且可以在浏览器和节点中运行。JS。它没有花费太多的工作来适当地注入依赖关系,以便浏览器和node.js客户端运行相同的代码。 另外,http://socket.io/已经实现了一个似乎可以工作的服务器端web套接字客户端(https://github.com/LearnBoost/socket.io-client)。 – 2012-01-10 00:31:55

+0

我很自信相信requireJS是在浏览器和node.js之间共享代码的最佳方式。我只是不确定我是否用socket.io投注了正确的马。我为此折磨自己的原因是因为HTML5 websockets示例非常简单,所有这些增加的复杂性似乎都没有必要。 – 2012-01-10 00:36:46

回答

0

如果需要一点点努力才能让Web套接字套接字运行,不要担心,因为奖励远远不止于此。

在网络套接字之前,所有真正的基于浏览器的产品都依赖于浏览器连续轮询服务器,这对浏览器,网络和服务器来说都是沉重的负担。

即使是基于HTTP轮询的系统中的简单消息“hello”也可能导致需要处理的千字节数据。

在网络套接字中,最坏情况下的开销数量是15个字节附近的数量。

另一件事是,网络套接字是事件驱动的,所以你的浏览器可以自由地保持闲置,或者做其他任务直到发生实际的通信事件。

至于你的代码运行良好前端和后端的问题,这将是一个问题,让你的JavaScript类模块化,并使用服务器端的require()类型的功能,也许模拟相同的功能在客户端注入您创建的脚本。

有很多演示下载和修补,所以像任何新的编码领域,只是跳进去,让你的手脏。它很快就会有道理。

+0

我的手很脏。 node.js使用commonJS作为模块格式,在浏览器中播放不好。我实际上考虑黑客节点能够处理浏览器样式的JavaScript包括使用vm.runInContext,但我尝试了RequireJS,它已经足够好了。 – 2012-01-11 14:37:32

+0

真正的痛苦是在网络套接字中。如果我因为标准成熟而与BOSH合作,我本来会有更快的启动。我尝试了至少5个图书馆,直到我得到我想要的东西。大多数信息,评论和教程指向的图书馆开始变得生疏,但如果你看,你会发现一个分支可能是更新的,但也有越野车。 我试过socket.io,因为它承诺通过任何协议连接,我喜欢它的API,但尽管我的浏览器websocket客户端工作起来很容易,但我无法获得节点websocket客户端的工作。 – 2012-01-11 14:46:50

+0

有工作接受了标准的浏览器WebSockets的服务器和客户端的实现,最成熟的代码库似乎是这样的: https://github.com/einaros/ws 然而,这个项目更好地记录,所以我用它去: https://github.com/Worlize/WebSocket-Node – 2012-01-11 14:48:06

相关问题