如何使用Node.js从服务器端刷新浏览器?

7

在开发过程中,由于html-webpack-plugin和webpack-dev-middleware(webpack-hot-middleware)之间的HMR bug问题,我希望当我的html文件更改时重新加载页面。

以下是我遇到问题的两个存储库,两者都存在问题。


如何使用以下工具重新加载页面?

  • Node.js
  • Express
  • webpack-dev-middleware

我并不真正需要解决问题,我将通过手动刷新来完成,但我还不知道如何从服务器刷新浏览器。 - zerdox
也许我可以创建一些事件并将其传递给客户端JS,在那里我将刷新页面? - zerdox
我猜你正在寻找nodemon。尝试使用NPM安装nodemon。如果我误解了你,请纠正我。 - Vipul Patil
1
不是的,我需要刷新浏览器,而不是重新启动服务器。 - zerdox
1个回答

11

有几种方法可以从服务器刷新客户端的浏览器。

服务器发送事件:

一种适用于各种浏览器和服务器的简单方法是使用服务器发送事件。最小化的过程为:

  1. 客户端使用EventSource()向服务器发送订阅请求:
var evtSource = new EventSource("<server_URL>/subscribe");

客户端设置监听器以接收传入的消息:
evtSource.onmessage = function () { myPageRefresh() };

在服务器端,设置一个处理程序来处理GET /subscribe请求,并跟踪订阅的客户端。
const express = require('express');
const app = express();

var client = null;

app.get('/subscribe', (req, res) => {
  // send headers to keep connection alive
  const headers = {
    'Content-Type': 'text/event-stream',
    'Connection': 'keep-alive',
    'Cache-Control': 'no-cache'
  };
  res.writeHead(200, headers);

  // send client a simple response
  res.write('you are subscribed');

  // store `res` of client to let us send events at will
  client = res;

  // listen for client 'close' requests
  req.on('close', () => { client = null; }
});

// send refresh event (must start with 'data: ')
function sendRefresh() {
  client.write('data: refresh');
}

现在服务器只需调用sendRefresh()即可随时发送刷新事件。

lite-server:

如果您的开发计算机上本地运行服务器,那么刷新浏览器非常容易。 lite-server是一个模块,每当检测到源文件更改时就会刷新浏览器。非常方便。


1
我今天会尝试这个。非常感谢,我猜这就是我需要的。是的,我需要在我的本地服务器上进行开发。 - zerdox
这个方法对你有用吗?如果有用的话,你能接受我的答案吗? - terrymorse
抱歉..我忘了。准备好了。非常感谢。 - zerdox
2
请确保在每条消息的末尾使用双\n,因为它需要一个空行来检测消息是否已完全发送:res.write('you are subscribed\n\n');res.write('data: refresh\n\n');https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#sending_events_from_the_server - Typhon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接