精华 需要添加一下 Node.js 模块热替换方面的机制
发布于 1天前 作者 jiyinyiyong 197 次浏览 来自 分享

目前不能投入太多时间, 简单说一下 前面看了 Webpack 在前端做热替换的方案, 而且在前端的效果也比较明显的 后端的话, 为了做到修改代码不会重启 WebSocket, 这个功能最近非常想要 Webpack 用的模块化方案基于 CommonJS, 大致的思路是构建模块的 tree 然后 tree 的节点可以冒泡, 跟 DOM 类似, 然后每个模块的 module.hot 上加入了一些代码 这个代码可以用来检测子模块的更新事件, 决定是否热替换代码 比如这样: http://segmentfault.com/a/1190000003879041

var requestHandler = require("./handler.js");
var server = require("http").createServer();
server.on("request", requestHandler);
server.listen(8080);

// check if HMR is enabled
if(module.hot) {
    // accept update of dependency
    module.hot.accept("./handler.js", function() {
        // replace request handler of server
        server.removeListener("request", requestHandler);
        requestHandler = require("./handler.js");
        server.on("request", requestHandler);
    });
}

在 Node 方面, 现在看的的一个是百度有一篇文章, 可以手动替换一下代码, 短期可以尝试一下: http://fex.baidu.com/blog/2015/05/nodejs-hot-swapping/ 另外找到个 hotswap 模块, 还不清楚具体机制是怎样的, 也打算尝试一下: https://github.com/rlidwka/node-hotswap 单纯从原理上讲, 在 Node 上实现一套热替换的难度并不会比 Webpack 大, 我就奇怪为什么没人做 也许对些 HTTP 无状态请求的同学来说整个服务器重启无所谓吧, node-dev nodemon supervisor 还够用 但是考虑一下, 修改代码, WebSocket 不受影响, 后端的代码直接更新了, 新的请求直接用新的代码 打算花点时间研究一下

7 回复

这个对于nodejs提供不中断服务很有用!

Webpack 作者回复我了, 直接用 Webpack 热替换后端, 晚上看下 https://github.com/webpack/docs/issues/45

内存泄漏!内存泄漏!内存泄漏!

对于无状态的http请求来说,确实没有太大价值。对于长连接的socket请求来说,做到连接和逻辑完全分离,也就变成无状态请求了,也变得没多大价值,反观热部署模块或者热部署服务,要么手动触发要么定时器逻辑开销比较大,所以github上才没有相应的包吧

@JacksonTian 文章里提的代码解决不掉类似的问题吗?

@haozxuan 在部署方面不了解, 大概确实效果不好吧. 我主要在意的是开发过程, 存在大量推送的消息, 而且内存当中也保存着数据状态, 这部分需求的比较明显. …听楼上这么说, 后端开发人员是铁了心要把状态存储放到数据库之类的外部服务区做了?

把 Webpack 的热替换方案的例子跑通了, 写了笔记: http://segmentfault.com/a/1190000003888845

回到顶部