VM - HydraFramework/Hydra GitHub Wiki

--Draft--

VM划分

旧版本每个APP都有一个独立的VM,每个Page也有一个独立的VM,新版本同一个APP的VM合并,共享使用同一个VM,不同Page的运行环境做隔离处理,并且共享APP的公共资源
initialize.lua 的调用环境是APP级别
pagexxx.lua 调用环境是Page级别, 每个page的环境独立

Page全局成员变量查找规则是:

  1. 在当前Page的全局表中查找是否存在该成员变量
  2. 如果不存在,在APP的全局表中查找该成员变量

Page全局变量的赋值

只在Page的全局表上赋值,如果和APP全局变量名相同,则隐藏APP的全局变量,不会对APP的全局变量有影响。

例如,如果需要多个page共享某个sqlite的db变量,只需要在APP环境创建该变量,其他Page就可以直接使用。 默认APP环境有个共享表 _S, 方便多个page之间交换数据。

-- page1
_S.something = "xxx"

-- page2
print(_S.something)

一些优化建议

  1. 同一个sqlite db文件在整个生命周期里不应该被打开关闭多次
    基于现在同一个app的所有page的vm合并,现在可以在第一次打开db后保留引用在app环境上
    例如:
-- 所有userid公用同一个db的情况
-- initialize.lua
function onReady()
    sharedb = sqlite3.open(somepath) -- sharedb 在APP的全局表上
end

-- somepage.lua
local db = sharedb -- 根据查找规则,page全局表上没有sharedb,找到了APP全局表上的sharedb,并保存引用到本地,减少下次查找时间
function someFunction()
    -- 直接使用db
    db:exec("select * from sometable")
end

-- 每个userid一个db的情况
-- initialize.lua
local dbmap = {}
function getDatabaseByUserID(userid) -- getDatabaseByUserID方法在APP的全局表上
    -- 参考实现,仅提供思路
    if not dbmap[userid] then
        dbmap[userid] = sqlite3.open(somepathbyuserid)
    end
    return dbmap[userid]
end

-- somepage.lua
local getDatabaseByUserID = getDatabaseByUserID

function someFunction()
    -- 先取db再用
    local db = getDatabaseByUserID(userid)
    db:exec("select * from sometable")
end
⚠️ **GitHub.com Fallback** ⚠️