【问题标题】:Node: Automatically refresh browser on file change节点:文件更改时自动刷新浏览器
【发布时间】:2016-05-26 23:50:53
【问题描述】:

我希望我的节点应用程序在文件更改时自动刷新我的浏览器(无外部应用程序)。

我想避免使用 webpack 开发服务器,因为它不允许我使用自己的 koa 服务器,而且通常使用起来很麻烦。

如何在文件更改时自动刷新浏览器?

【问题讨论】:

  • 你试过browserify.org吗?
  • @jack.the.ripper 是的。
  • 尝试实时重新加载,我喜欢 sublime 的扩展包,这对你有用吗? stackoverflow.com/questions/25886011/…
  • @jack.the.ripper 谢谢,但理想情况下,它应该是应用程序中包含的一个包或原始代码,以便新开发人员可以在几乎没有设置的情况下使用它。

标签: node.js socket.io npm webpack


【解决方案1】:

尝试使用watchr:

koa-app.js

/.../
var watchr = require('watchr');
watchr.watch({
    paths: [__dirname], listeners: {
        change: function() {
            // Emits an event to all connected clients 
            io.sockets.emit('browserReload');
        }
    }
})

client-side.js

  /.../
  socket.on('browserReload', function () {
     // Reload without using cache
     document.location.reload(true);
  });

【讨论】:

  • 这看起来不错,但实施后页面将无法加载。为此需要哪些软件包?
  • Watchr 阻止服务器接收和响应请求。奇数。
  • @Elegant.Scripting 你能用koa-socket 代替socket.io 吗? [github.com/mattstyles/koa-socket]
  • 同样的问题。我认为问题出在watchr,而不是socket.io
  • @Elegant.Scripting 你能更新问题并分享解决方案吗?
【解决方案2】:

所以我想通了。

事实证明 koa-socket 的 API 可能适用于某些人,但它通常是一堆不必要的臃肿。此外,观看过程很棒,但如果您已经有节点脚本这样做,那就是多余的,并且会破坏您的代码。

我最终使用一些非常简单的代码将 socket.io 附加到我的 Koa 服务器:

server.js

var app = require('koa')();
var server = require('http').createServer(app.callback());
var io = require('socket.io')(server);
io.on('connection', function(){ /* … */ });
server.listen(3000);

这很好用。下一步是在客户端连接到我的 Koa 服务器。这段代码也很简单:

client.js

var socket = require("socket.io-client")("http://localhost:3000");

所以现在 socket.io 正在我的服务器上运行,客户端可以连接到它。由于节点包和脚本(如 supervisor/nodemon),我的服务器在任何文件更改时都会重新启动。

下一步很简单:当文件更改时,服务器重新启动,当服务器重新启动时,向所有客户端发出 socket.io 事件,强制重新加载页面。代码如下所示:

server.js

var serverRestarted = true;

if (serverRestarted === true) {
    io.emit("browserReload");
    serverRestarted = false;
}

client.js

socket.on("browserReload", function() {
    document.location.reload(true);
});

就是这样。当然,解决没有按预期工作的包或对我习惯使用的 API 进行未记录更改的包是一件很痛苦的事情......所以我没有使用它们。

我最终得到了一些在开发过程中效果很好的东西。

【讨论】:

  • 您还在使用您的自定义解决方案还是找到了一个包? (感谢您的提问和自我回答。)
  • @brillout.com 我使用 Webpack,并将客户端与服务器完全分离。减少头痛。
  • 这里相同,但我必须将 webpack-dev-server 与 API 而非 CLI 一起使用,并且 API 存在问题。 IMO 只有自动重新加载功能才有用。在我看来,热模块替换和在控制台中显示编译错误都是矫枉过正的功能。
猜你喜欢
  • 2017-06-02
  • 1970-01-01
  • 2011-03-19
  • 2020-05-07
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
相关资源
最近更新 更多