以下是一个完整的、可运行的 Lua 热更新实现代码示例。它包括基础模块定义、热更新功能、状态管理,以及简单的文件监控功能。
1. 模块文件:mymodule.lua
这是需要热更新的模块文件,定义了一些简单的逻辑和状态。
- -- mymodule.lua
- local M = {}
- -- 模块的状态
- M.state = {
- counter = 0
- }
- -- 打印问候语
- function M.say_hello()
- print("Hello, World!")
- end
- -- 累加计数器
- function M.increment()
- M.state.counter = M.state.counter + 1
- print("Counter:", M.state.counter)
- end
- return M
复制代码
2. 主程序:main.lua
主程序负责加载模块、调用模块逻辑,以及实现热更新功能。
- -- main.lua
- local lfs = require("lfs") -- LuaFileSystem,用于监控文件变化
- -- 文件修改时间缓存
- local file_mod_times = {}
- -- 检查文件是否更新
- local function check_file_updated(file)
- local mod_time = lfs.attributes(file, "modification")
- if file_mod_times[file] ~= mod_time then
- file_mod_times[file] = mod_time
- return true
- end
- return false
- end
- -- 热更新函数
- local function reload_module(name)
- -- 保存模块的状态
- local old_module = package.loaded[name]
- local old_state = old_module and old_module.state or nil
- -- 重新加载模块
- package.loaded[name] = nil
- local new_module = require(name)
- -- 恢复模块状态
- if old_state then
- new_module.state = old_state
- end
- print("Module [" .. name .. "] has been reloaded.")
- return new_module
- end
- -- 自动检测并热更新模块
- local function auto_reload(file, module_name)
- if check_file_updated(file) then
- return reload_module(module_name)
- end
- return package.loaded[module_name]
- end
- -- 初始化主程序
- local function main()
- local module_name = "mymodule"
- local module_file = "mymodule.lua"
- -- 加载模块
- local mymodule = require(module_name)
- -- 主循环
- while true do
- -- 模拟业务逻辑
- mymodule.say_hello()
- mymodule.increment()
- -- 等待 5 秒钟
- os.execute("sleep 5")
- -- 自动热更新模块
- mymodule = auto_reload(module_file, module_name)
- end
- end
- main()
复制代码
热更新步骤
1. 运行程序:
启动主程序 main.lua:
程序会每隔 5 秒调用一次模块中的方法 say_hello 和 increment,并打印计数器值。
2. 修改模块:
在程序运行时,编辑 mymodule.lua 文件,例如修改 say_hello 的实现:
- function M.say_hello()
- print("Hello, Lua! (Updated)")
- end
复制代码
保存文件。
3. 观察热更新生效:
程序会检测到 mymodule.lua 文件的变化,自动重新加载模块,并保留计数器的状态。