记录对lua require时内部的执行流程和自定义加载器方法
更详细的说明参考手册:http://cloudwu.github.io/lua53doc/manual.html#pdf-require
当调用require(modname)时,lua执行相当于如下流程
local function myrequire(modname)
local val = package.loaded[modname] -- loaded里已有,直接返回
if package.loaded[modname] then
return val
end
for _,loader in ipairs(package.searchers) do -- 遍历searchers查找加载器
local func,msg = loader(modname) -- 传入modname调用加载器
local t = type(func)
if t == "function" then -- 加载器返回的是函数,表示找到
local ret = func(modname,msg) -- 用modname和加载器返回的另一个参数调用func
if ret == nil then
ret = true
end
package.loaded[modname] = ret
break
elseif t == "string" then -- 返回的是字符串,表示找不到的提示信息,输出
print(func)
else -- 返回的其它值都表示找不到,不提示
end
end
end
package.searchers里存的是加载器,加载器以modname传入调用,其返回值有
1.函数(func)+参数(msg),表示找到,参数可以没有,以func(modname,msg)调用,其返回值存到package.loaded里
2.字符串,表求找不到,输出字符串表示找不到的提示信息
3.nil,表示找不到,没有提示

本文详细探讨了Lua中require函数的内部执行流程,包括默认的四个加载器:preload、lua、c以及all-in-one。当你调用require时,它会依次尝试这四个加载器来寻找并加载模块。同时,文章提到了如何自定义加载器以及quick-cocos2dx-3.3框架如何利用preload加载器实现跨平台支持。
1810

被折叠的 条评论
为什么被折叠?



