VM - HydraFramework/Hydra GitHub Wiki
--Draft--
旧版本每个APP都有一个独立的VM,每个Page也有一个独立的VM,新版本同一个APP的VM合并,共享使用同一个VM,不同Page的运行环境做隔离处理,并且共享APP的公共资源
initialize.lua 的调用环境是APP级别
pagexxx.lua 调用环境是Page级别, 每个page的环境独立
- 在当前Page的全局表中查找是否存在该成员变量
- 如果不存在,在APP的全局表中查找该成员变量
只在Page的全局表上赋值,如果和APP全局变量名相同,则隐藏APP的全局变量,不会对APP的全局变量有影响。
例如,如果需要多个page共享某个sqlite的db变量,只需要在APP环境创建该变量,其他Page就可以直接使用。 默认APP环境有个共享表 _S, 方便多个page之间交换数据。
-- page1
_S.something = "xxx"
-- page2
print(_S.something)- 同一个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