如何编写将在Chrome和Node.js中运行的JavaScript Web代码?

这个问题的答案归结为两件事情:1)考虑到node.js的局限性,使用BOSH还是web套接字会更简单一些?2)如何构造代码,以便相同的JavaScript文件在浏览器,因为它在Chrome浏览器(或其他浏览器)。 简洁地描述问题是很难的。

真正的问题是,想要代码在浏览器中运行的同样在node.js中,同时具有外部依赖性。

背景

我有这个想法,我想要做的小javascript项目的乐趣。 我打电话给jsFun的想法,其核心思想是我可以花30分钟到一个小时做一些有趣的事情,并与我的朋友分享。

我从一开始就看到能否在一小时内写出俄罗斯方块,除了Notepad ++,Chrome和Dropbox以外,什么都不用。 我没有成功,但很有趣。

对我来说,“乐趣”可能意味着一场游戏,而这可能意味着多人游戏。 后面的餐巾素描看起来像这样:

  • 我可以通过任何一台计算机进行更改,并通过Dropbox将其推出。 (检查!)
  • 我可以使用我的Dropbox公共URL来提供静态页面。 (检查!)
  • Web客户端可以使用HTML5 Web套接字或BOSH通过node.js聊天服务器路由消息。
  • 游戏服务器脚本也可以连接到聊天服务器并实现某种游戏逻辑。
  • 游戏服务器脚本既可以在浏览器中运行,也可以在node.js中运行。

以下是使用HTML5 Web套接字与node.js聊天服务器对话的一个很好的例子: http : //html5demos.com/web-socket

比方说,我制作了多人游戏。 我的项目需要3个部分:

  • 游戏客户端脚本 – 这是在浏览器中运行并为用户呈现游戏的JavaScript。
  • 聊天中心脚本 – 这是一个聊天服务器,在游戏客户端和游戏服务器之间传递消息。 它作为一个node.js进程运行。
  • 游戏服务器脚本 – 此脚本可以在浏览器中运行以进行testing和debugging,也可以在node.js中运行

现在,为了制作井字游戏,我将确保聊天服务器正在运行,创build游戏服务器脚本和游戏客户端脚本,并打开三个Web浏览器 – 两个客户端和一个服务器。 在这一点上,我可以使用Chrome的令人敬畏的debugging工具来解决任何问题,使记事本+ +的更新,并刷新浏览器像疯了,30至60分钟。 也许我现在有一个工作的游戏。

这是一个复杂的步骤:我在浏览器中运行的那个游戏服务器脚本,现在我想从node.js运行。 实际上,我希望聊天服务器监视我的保pipe箱服务器脚本目录中的更改,并自动运行这些脚本。

Node.js使用CommonJS模块,浏览器无法加载。 我想我可以使用RequireJS,并在理论上在任一环境下加载代码,但这个问题变成了事实,即浏览器和服务器将使用不同的库来完成Web套接字 – 我如何使代码以任何一种方式运行? websockets甚至是要走的路,因为它似乎是一个不断变化的标准,也许我不能依赖于node.js websocket服务器来长期工作。

node.js唯一可用的websockets服务器看起来可能是一个正在进行的工作: https : //github.com/miksago/node-websocket-server

也许我应该使用像BOSH这样更成熟的API?

此外,websocket客户端也不会内置到node.js中,所以我必须使用这个:(作为一个新的stackoverflow用户,我不能正常粘贴链接,它是https:// github.com / pgriess /节点的WebSocket客户端)

我不得不面对这样一个挑战:我的游戏服务器代码与聊天服务器的web客户端连接将在node.js运行时环境中使用不同的库,而不是在Chrome浏览器环境中。

也许不使用require.js,我可以在浏览器中使用标准的JavaScript脚本,并使用node.js vm.runInContext – 它看起来像我可以在调用脚本之前设置具有类似function的全局variables,它几乎可以工作在node.js或浏览器使用标准的JavaScript代码的方式相同。

重述问题

(假设我会事先build立全球环境,以提供一个通用的接口的脚本)。有没有一个实际的方法,我写一个JavaScript文件,访问类似websocket客户端的function,可以执行浏览器或在node.js?

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

在networking套接字之前,所有真正基于浏览器的产品都依赖于浏览器不断地轮询服务器,这对浏览器,networking和服务器来说都是一个沉重的负担。

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

在networking套接字中,最坏情况下的开销是15字节左右。

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

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

有很多演示下载和鼓捣,所以像任何新的编码领域,只是跳进去,让你的手脏。 这将很快有道理。