Lua 的 require 函数是模块加载系统的核心功能,用于动态加载和执行 Lua 模块。它的工作机制和特点如下:
- 基本功能
require首先会在package.loaded表中检查模块是否已加载- 如果未加载,则会依次在
package.path(用于.lua文件)和package.cpath(用于C库)指定的路径中搜索模块 - 找到模块后会执行模块代码,并将返回值存储在 package.loaded 表中
- 搜索路径
package.path默认包含以下路径:- 当前目录(./?.lua)
- Lua库目录(/usr/local/share/lua/5.3/?.lua)
- 用户目录(~/.luarocks/share/lua/5.3/?.lua)
- 路径中的问号会被替换为模块名
- 可以通过修改
package.path来添加自定义搜索路径
- 缓存机制
- 成功加载的模块会被缓存在
package.loaded表中 - 后续调用
require会直接返回缓存值 - 可通过
package.loaded[modname] = nil强制重新加载
- 典型用法示例
lua
-- 加载标准库模块
local math = require("math")
-- 加载自定义模块
local mymodule = require("mymodule")
-- 加载子模块
local utils = require("mylib.utils")
- 高级特性
- 可以自定义
package.searchers表来扩展模块搜索逻辑 - 支持加载二进制扩展模块(.so/.dll文件)
- 模块可以返回一个表或函数作为接口
- 注意事项
- 模块名中的点会被转换为路径分隔符(如 "a.b" 会查找 a/b.lua)
- 循环依赖需要特殊处理
- 在沙盒环境中可能需要限制
require的功能
require 的这种设计使得 Lua 的模块系统既灵活又高效,是 Lua 生态的重要组成部分。