Skip to content
bruce edited this page Jun 13, 2022 · 5 revisions

lua作为脚本语言,一个优势就是可以做热更新,在不重启进程的情况下,用新版本的函数替换旧版本函数。但由于lua的灵活性,实现100%的热更又不太可能。 在一定的限制条件下并兼顾性能,moon提供了一种热更方案:

  1. 按模块来更新(一个lua脚本文件),只处理内部的table和函数
  2. 非函数类型upvalue保留
  3. Table的函数value和函数类型upvalue替换为新版本
  4. 模块内不能新增函数
    local moon = require("moon")

    ---Upvalues(not function type) will Reserved
    local a = 100
    local b = 200

    local M = {}

    M.__index = M

    function M.new()
        local obj = {
            n = 0,
            m = "hello"
        }
        return setmetatable(obj,M)
    end

    ---Function type upvalue will replaced by new version
    local function tmp(self)
        self.n=self.n+1000
    end

    ---Function fields will replaced by new version
    function M:func()
        tmp(self)
        print("before", self.n, self.m, a-b)
        moon.sleep(1000)
    end

    return M

Clone this wiki locally