Guide 開髮指南

服務端模塊熱更新

fibjs 的http server 是常駐內存的獨立服務器程序,這意味著有版本更新的時候往往需要重啟服務程序。

假設有以下服務程序:

  • web.js http handler
  • app.js 應用入口
1 2 3 4 5 6
// web.js var _ver = new Date(); module.exports = function (r) { r.response.write("Hello, new word @ " + _ver); }
1 2 3 4 5 6 7 8 9
// app.js var http = require("http"); var vm = require("vm"); var coroutine = require("coroutine"); var webServer = require("./web"); var svr = new http.Server(8080, webServer); svr.start();

app.js直接引用web.js,當每次更新應用的時候,都必須重啟app.js,有沒有辦法可以在更新代碼的同時,讓app.js自動加載最新的web.js呢?

我們可以通過fibjs 的原生 SandBox模塊來實現平滑的熱更新。app.js做一些更改:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// app.js var http = require("http"); var vm = require("vm"); var coroutine = require("coroutine"); // var webServer = require("./web"); function new_web() { return new vm.SandBox({ mq: require("mq") }).require("./web.js", __dirname); } // 每 1s 重新载入一遍 ./web.js 文件以更新 srv 的 handler coroutine.start(function() { while (true) { coroutine.sleep(1000); svr.handler = new_web(); } }) var svr = new http.Server(8080, new_web()); svr.start();

app.js中啟動了一個循環,每隔1s重新require一次web.js中的內容生成安全的模塊,用於為svr重新掛載handlerweb.js中的內容需要更新的時候,只需替換該文件,即可實現服務端程序的平滑更新。

👉 【域名路由