如何从Node.js应用程序访问浏览器的窗口对象?

Dav*_*tti 6 javascript browser node.js web

我正在尝试编写一个简单的应用程序来监视文件更改并自动在浏览器中重新加载更新的代码。我知道livereload nodeamon和其他软件的存在,我只想编写自己的。我已经创建了服务器,让它读取我想要读取的文件,称为观察程序,当监视文件中发生更改时,该监视程序将杀死并重新启动服务器。最后一部分:应刷新浏览器。这怎么可能?

Rea*_*lar 5

NodeJS 没有window代表全局命名空间的变量。相反,它有一个名为global.

NodeJS 中没有浏览器、窗口或 URL 位置。

它是一个纯粹的服务器端工具。


jfr*_*d00 5

正如其他人所解释的那样,浏览器编程环境因此window.location.reload()完全与node.js分离,因此您不能直接从node.js调用它。服务器端代码在node.js中的服务器上运行。浏览器中的客户端代码仅在浏览器中运行。两者可以通过Ajax请求或通过webSocket连接发送的消息进行通信,但它们不能直接在彼此之间调用代码。


为了使浏览器根据服务器上的更改进行刷新,有两种基本方法。

  1. 浏览器中的Javascript可以定期询问服务器是否有新内容(通常是通过传递时间戳的Ajax调用)。如果服务器说自该时间戳记以来有新内容,则浏览器中的Javascript可以请求新数据/文件。这种“轮询”方法并不是特别有效,因为如果数据不经常更改,那么大多数对新事物的请求只会返回没有新事物。对于电池寿命也不友好。

  2. 浏览器可以与服务器建立持久的webSocket连接。然后,当服务器发现服务器上发生了某些更改时,它可以直接向每个连接的浏览器发送通知,通知它有新内容。然后,接收到此消息的所有连接的客户端都可以进行常规的Ajax调用以检索新数据。或者,可以仅通过webSocket将新信息直接发送到客户端。无论哪种情况,这种直接通知通常都比“轮询”解决方案更有效。

使用webSocket选项,您将不希望服务器重新启动,因为这将删除所有webSocket连接。我不确定为什么当某些更改时您当前正在重新启动服务器,但是您必须将其更改为使用webSocket解决方案。