服務端模組熱更新
fibjs
的http server 是常駐記憶體的獨立伺服器程序,這意味著有版本更新的時候往往需要重啟服務程序。
假設有以下服務程序:
web.js
http handlerapp.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);
}
// update svr.handler every 1 second.
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
重新掛載handler
。當web.js
中的內容需要更新的時候,只需替換該文件,即可實現服務端程式的平滑更新。
👉 【高效能Web 應用程式實務】