0Pricing
Lua Academy · 课时

发现和加载插件

扫描目录中的插件文件,并使用 require 或 loadfile 加载它们。

发现和加载插件 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

插件架构是什么?

插件架构允许第三方代码扩展应用程序,而无需修改其核心。Lua 的 require 和动态加载机制使这种方式十分自然。

按约定发现插件

扫描目录,查找符合命名约定的 *.lua 文件,然后将每个文件加载为插件。

local function discoverPlugins(dir)
  local plugins = {}
  -- platform-specific dir scan; here a mock example
  for _, name in ipairs({"logger", "cache", "auth"}) do
    local ok, mod = pcall(require, dir .. "." .. name)
    if ok then plugins[name] = mod end
  end
  return plugins
end

使用 package.path 进行发现

扩展 package.path,使 require 能够在自定义目录中找到插件。

package.path = package.path .. ";./plugins/?.lua"
local plugin = require("myplugin")

使用 loadfile 进行动态加载

loadfile(path) 会将 Lua 文件编译为代码块,但不会执行它。使用 () 执行该代码块,即可获得插件的模块表。

local function loadPlugin(path)
  local chunk, err = loadfile(path)
  if not chunk then return nil, err end
  local ok, result = pcall(chunk)
  if not ok then return nil, result end
  return result
end

插件清单

每个插件都会导出一个清单表,用于描述其名称、版本和依赖项。

-- plugins/logger.lua
return {
  name    = "logger",
  version = "1.0",
  deps    = {},
  init    = function(app) app:on("log", print) end,
}

依赖解析

初始化插件之前,请检查其所有依赖项是否已经加载。

local function initPlugin(app, plugins, name)
  local p = plugins[name]
  if not p then error("Plugin not found: " .. name) end
  for _, dep in ipairs(p.deps or {}) do
    if not plugins[dep] then
      error(("Plugin %s requires %s"):format(name, dep))
    end
  end
  if p.init then p.init(app) end
end

热重载插件

要重新加载插件:将其从 package.loaded 中移除,使用 require 重新加载,然后重新注册钩子。

package.loaded["plugins.logger"] = nil
plugins.logger = require("plugins.logger")
plugins.logger.init(app)

插件注册表

维护一个已加载插件的注册表,以防止重复加载并支持依赖检查。

错误隔离

使用 pcall 加载插件,这样损坏的插件就不会导致整个应用程序崩溃。

local ok, err = pcall(function()
  plugins[name] = loadPlugin(path)
  initPlugin(app, plugins, name)
end)
if not ok then
  print("Plugin load failed:", name, err)
end

插件元数据

存储额外的元数据:描述、作者和配置架构。您可以使用这些信息进行界面展示或自动配置。

延迟加载

只在插件第一次需要时加载它,而不是在启动时立即加载。可以通过带有 __index 元方法的代理表来实现,该元方法会触发加载。

插件加载问题

加载插件时使用 pcall 有什么优势?

回顾:插件发现与加载

通过扫描目录或使用命名约定来发现插件。使用 loadfile 或 require 加载插件。验证清单并解析依赖项。始终使用 pcall 隔离加载失败。

常见问题解答

「发现和加载插件」课时是免费的吗?

是的 — 「发现和加载插件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「发现和加载插件」这节课中我会学到什么?

扫描目录中的插件文件,并使用 require 或 loadfile 加载它们。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「发现和加载插件」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 发现和加载插件
  2. 插件 API 和钩子系统
  3. 沙箱化插件执行
  4. 版本管理和依赖管理
← 返回 Lua Academy