一、require的作用
require是用来加载指定的模块的,如果这个模块之前加载过,并且在package.loaded表里面有,就不会重新加载模块,会直接返回package.loaded表里面的值。如果package.loaded表里面没有值,就会把这个模块中的全局变量和全局函数都加入到_G中,并且在package.loaded里面增加一个键值对{key=“test”, value=true}。如果模块有返回值的话,value就是返回值。
例如:
test.lua
function test_func()
print("hello package")
end
var = 1000
require(“test”),就会把test_func函数和var变量加入到**_G**中,并且在package.loaded[“test”] = true。
二、指定require的加载路径
// 指定需要加载的lua文件路径
// 如果存在LUA_PATH环境变量,就用LUA_PATH环境变量的值作为默认值
package.path = package.path ... ';xxx/?.lua'
//指定需要加载的C的库文件路径
// 如果存在LUA_CPATH环境变量,就用LUA_CPATH环境变量的值作为默认值
package.cpath = package.cpath ... ';xxx/?.so'
三、require在热更中的作用
用伪代码展示一个热更的解决方案
//这个全局的md5文件表需要放在一个不用热更的模块里面(增加一个static.lua,放入其中)
global_file_md5 = {}
//指定需要热更的动态文件
local dynamic_file =
{
"item",
"monster",
}
for _, file in ipairs(dynamic_file) do
//计算出模块文件的md5值
local file_md5 = md5(file)
//如果模块文件是新增的或者模块文件的md5值变化了,则需要重新加载这个模块
if not global_file_md5[file] or global_file_md5[file] ~= file_md5 then
//需要把package.loaded表里面的模块置空,要不然require会直接返回
package.loaded[file] = nil
//重新加载模块
require(file)
end
end