lua中使用require来加载对应的模块。html
好比我有个一个文件test.lua,内容以下:node
test = {}
test.fun1 = function() return 1 end
return test;
复制代码
而后在main.lua中使用require引入:shell
require('test')
print(test.fun1()) --> 1
复制代码
跟node加载模块同样,lua中的模块加载过程也须要一个查找过程。在使用require加载lua模块的时候,lua首先会查看package.loaded表中是否存在该模块,若是存在,说明该模块以前已经加载过了,那么久直接返回这个表中的对应模块。缓存
其实就是模块的全局缓存的效果,保证每一个模块只需加载一次就够了。函数
若是package.loaded表中没有该模块,则会先针对这个模块寻找一个loader,这个loader工做你懂得,就是用来加载这个模块的。ui
因此如今的流程就是,lua
若是以上的流程中查找到了模块的loader,则require会调用这个加载程序,而且将模块名称和一个额外的参数传递给该loader(若是这个loader来自一个文件,则该参数的值为文件名)。若是loader没有给package.loaded添加任何值并且也没有返回任何的非零值,则讲package.loaded[moduleName]设置为true。而后require会返回package.loaded[moduleName]给到调用方。spa
在上面的加载过程当中,若是出现了失败或者错误,require就会抛出一个错误。code
用来存储一些特殊的模块,个人理解就是用来存储一些自定义的loader的。htm
这个配置用来告诉lua去哪里查找模块的loader。 在启动时,Lua使用环境变量LUA_PATH_5_3或环境变量LUA_PATH的值或使用luaconf.h中定义的默认路径初始化此变量(若是未定义这些环境变量)。任何 ”;;”在环境变量的值中由默认路径替换。
跟path差很少,主要用来加载C语言的库,这个就不说了。
package.searchers是lua用来控制如何加载以及去哪里加载对应模块的表。这个表里面的每个属性都是一个查找函数,lua会按升序排序,而后根据这个顺序来调用查找函数,将require函数传递过来的参数给到查找函数,而后去执行对应的查找。
lua在初始化package.searchers表的时候,会添加如下4个查找函数:
package.searchpath (name, path [, sep [, rep]])
复制代码
举个例子: 若是path中配置了下面这个路径:
"./?.lua;./?.lc;/usr/local/?/init.lua"
复制代码
而后须要查找一个foo.a模块的话,则会去寻找这些路径的文件:
./foo/a.lua
./foo/a.lc
/usr/local/foo/a/init.lua
复制代码
返回第一个查找的结果,若是没有找到,则返回nil和错误信息(尝试打开的全部文件)。