1. 程式人生 > 其它 >Lua 模組載入規則

Lua 模組載入規則

起因

同事寫了行載入模組的程式碼,在 PC 上可以載入得到,在真機上卻不行。於是我猜可能是因為查詢路徑有什麼差異。
local Bitmap = require"Assets.Lua.game.modules.helper.common.Bitmap"

解決

因為打包時,會把 Lua 目錄下的檔案另外打包放在工程外,因此真機執行時,Lua 就是根目錄(載入模組時,會搜尋根目錄是否有這個 lua 檔案),並沒有 Assets/Lua 這層目錄關係,自然也就載入不到了。路徑改成 .game.modules.helper.common.Bitmap 即可。

延展

Lua 通過 require 全域性函式來載入模組。

require 載入過程

  • 查詢全域性快取表 package.loaded[modname] 。所有載入過的模組都會被儲存在這個表裡,避免重複載入。
  • 通過 package.searchers 查詢載入器並呼叫載入。除了 package.preload 不回返回值意外,其他載入器都會返回找到的模組的檔名。
    1. package.preload[modname] 中查詢載入器。
    2. 使用儲存在 package.path 中的路徑來查詢 Lua 模組。這個路徑是一個用分號分隔的模板構成的字串。把模板中的問號替換成 modname替換為系統的目錄分隔符
    3. 使用儲存在 package.cpath 中的路徑來查詢 C庫
    4. 一體化載入器。從 C 路徑中查詢指定模組的根名字。
      Lua熱更原理以及載入規則
      ulua 路徑小記 以及 lua require 機制整理

Lua 執行時熱過載

大體就是重新載入模組(package.loaded[modname] = nil),替換舊模組的成員,資料保留,方法替換(替換前要通過 debug.setupvalue debug.getupvalue將舊方法的 upvalue 取出複製到新方法中)。
【Lua執行時熱過載②】過載Lua模組、替換函式
lua面試題:熱更新簡介、原理及示例