1. require(modName)
require
會加載給定的模塊瞎惫,首先檢查表package.loaded
來判定模塊是否已經(jīng)存在。若存在則加載返回package.loaded[modName]
所存儲的值驻龟,否則嘗試為模塊找到一個加載器闽巩。
要找到一個加載器糯俗,require
首先查詢package.preload[modName]
饶唤,若有值且是一個函數(shù)則斷定就是一個加載。若沒有值require
使用package.path
中存儲的路徑查找一個Lua
的加載器铡买。若該查找也失敗更鲁,則使用package.cpath
中存儲的路徑查找一個C
語言加載,若仍然失敗則嘗試使用all-in-one
加載器奇钞。
當(dāng)加載一個C
語言庫時澡为,require
首先使用動態(tài)鏈接工具將應(yīng)用程序與庫連接起來,之后嘗試找到該庫中的C
函數(shù)景埃,該函數(shù)要被當(dāng)做加載器使用媒至。這個C
函數(shù)的名字是字符串luaopen_
連接著復(fù)制的模塊名。此外谷徙,若模塊名稱中函數(shù)連字符-
拒啰,則第一個連字符的前綴包括連字符都會被移除。
若require
既沒有為模塊查找到一個Lua
庫完慧,也沒有為模塊找到一個C
庫谋旦,它將調(diào)用all-in-one
加載器。該加載器為給定模塊的根名稱,查找C
路徑并找到對應(yīng)的庫册着。
一旦找到一個加載器拴孤,require
會使用單個參數(shù)modName
調(diào)用加載器。若加載器返回任何值甲捏,則require
會將其賦值給package.loaded[modName]
演熟。若加載器無返回值且沒有給package.loaded[modName]
賦與任何值,則require
為該條目賦值為true
司顿。無論如何芒粹,require
返回package.loaded[modName]
的最終值。
若加載或運行模塊有任何錯誤或不能為模塊尋找一個加載器大溜,則require
會發(fā)出一個錯誤信號化漆。
2. LuaLoadChunksFromZIP
require
和LuaLoadChunksFromZIP
的區(qū)別:
-
require
加載包的順序是package.loaded
、package.preload
... -
LuaLoadChunksFromZIP
會解壓包并加載數(shù)據(jù)到內(nèi)存中猎提,可在package.preload
中查看使用LuaLoadChunksFromZIP
加載的包package
获三。
若加載到內(nèi)存中的包旁蔼,使用
require
就只能是完全能對應(yīng)的包名锨苏,但若是文件的話可以在package.path
中查找。