Funktionen require
Läs in externa moduler med require och förstå cachning av moduler.
Funktionen require är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.
Så fungerar require
require(modname) läser in och returnerar en modul. Den söker efter en .lua-fil i package.path och efter ett C-bibliotek i package.cpath. Resultatet cachas i package.loaded[modname] — efterföljande anrop returnerar det cachade värdet utan att köra filen igen.
-- First require: loads and executes math_utils.lua
local math_utils = require("math_utils")
-- Second require: returns cached value (file not re-run)
local math_utils2 = require("math_utils")
print(math_utils == math_utils2) -- true (same object)
print(package.loaded["math_utils"] == math_utils) -- trueModulens returvärde
En modulfil bör returnera ett värde — vanligtvis en tabell med funktioner. Detta returvärde är det som require lämnar tillbaka till anroparen. Om filen inte returnerar något (eller true) är det vad require returnerar.
-- mymodule.lua:
-- local M = {}
-- function M.hello() print("Hello from module!") end
-- return M
-- In main script:
local m = require("mymodule")
m.hello() -- Hello from module!
-- The module table is the interfaceCachning i package.loaded
package.loaded är en tabell som kopplar modulnamn till deras inlästa värden. Ni kan manuellt ange ett värde för att förinläsa en mock, eller ange nil för att tvinga fram en ny inläsning (modulfilen körs då igen vid nästa require).
-- Force reload by clearing cache
package.loaded["mymodule"] = nil
local fresh = require("mymodule") -- re-executes the file
-- Preload a mock for testing
package.loaded["db"] = {
query = function() return {} end,
close = function() end,
}
local db = require("db") -- gets the mockFormatet för package.path
package.path är en semikolonseparerad lista med mönster. Platshållaren ? ersätts av modulnamnet (där punkter ersätts med sökvägsavgränsare). Ni kan lägga till kataloger att söka i genom att lägga till dem först i package.path.
print(package.path)
-- typically: ./?.lua;./?.luac;/usr/share/lua/5.4/?.lua;...
-- Add local lib directory
package.path = "./lib/?.lua;" .. package.path
-- Now require("utils") will look in ./lib/utils.luarequire jämfört med dofile och loadfile
require: cachar och söker i package.path. dofile(path): kör en fil omedelbart, utan cachning, och tar en direkt sökväg. loadfile(path): kompilerar men kör inte filen och returnerar en funktion. Använd require för moduler och dofile för skript som körs en gång.
-- dofile: no caching, direct path
dofile("./scripts/setup.lua")
-- loadfile: compile only, returns function
local fn, err = loadfile("./config.lua")
if fn then
local result = fn() -- execute when ready
end
-- require: best for modules
local json = require("json")require med punkter för kataloger
Använd punkter i modulnamn för att referera till filer i underkataloger. require("utils.string") motsvarar utils/string.lua (med ? i sökvägsmönstret). Det är så bibliotek med flera filer organiseras.
-- Directory structure:
-- lib/
-- utils/
-- string.lua
-- table.lua
-- init.lua
package.path = "./lib/?.lua;" .. package.path
local strUtils = require("utils.string") -- loads lib/utils/string.lua
local tblUtils = require("utils.table") -- loads lib/utils/table.luaBiverkningar vid modulinitiering
Modulfiler körs en gång när de först läses in med require. Kod på toppnivå (utanför funktioner) körs när require anropas. Detta är användbart för initiering som ska ske en gång, men var försiktig — biverkningar som nätverksanslutningar eller filåtgärder körs vid importen.
-- counter.lua:
-- local count = 0 -- initialized once on first require
-- local M = {}
-- function M.increment() count = count + 1 end
-- function M.get() return count end
-- return M
local c = require("counter")
c.increment()
c.increment()
print(c.get()) -- 2
local c2 = require("counter")
print(c2.get()) -- 2 (same instance, cached)Felhantering i require
Om en modulfil innehåller ett syntaxfel eller utlöser ett fel under inläsningen ger require ett fel. Felmeddelandet innehåller modulnamnet och felet från filen. Använd pcall för att hantera misslyckad modulinläsning på ett bra sätt.
local ok, mod = pcall(require, "possibly_missing")
if not ok then
print("Module not available:", mod)
-- fall back to alternative or default implementation
mod = {feature = function() return "fallback" end}
end
print(mod.feature())package.preload
package.preload är en tabell där du kan registrera laddningsfunktioner efter modulnamn. När require("name") anropas kontrollerar Lua först preload-tabellen. Det gör att du kan registrera moduler utan filer – användbart för inbäddad Lua eller testning.
package.preload["mymath"] = function()
return {
double = function(n) return n * 2 end,
triple = function(n) return n * 3 end,
}
end
local m = require("mymath")
print(m.double(5)) -- 10
print(m.triple(5)) -- 15Cirkulärt require
Cirkulära beroenden (A kräver B, B kräver A) hanteras delvis: Lua lagrar en platshållare med värdet true i package.loaded innan modulen körs. Om B försöker använda As ofärdiga tabell kan resultatet vara ofullständigt. Undvik cirkulära beroenden när du utformar moduler.
-- a.lua: local b = require("b"); local M = {}; M.name = "A"; return M
-- b.lua: local a = require("a"); print("a.name:", a.name); return {}
-- When a.lua is loaded:
-- 1. a starts executing
-- 2. requires b -> b starts executing
-- 3. b requires a -> gets partial a (still loading!)
-- 4. a.name may be nil at step 3
print("Avoid circular requires in module design")Snabbkontroll
Vad händer när du anropar require("mod") en andra gång?
Sammanfattning: require
Sammanfattning:
require(name)laddar modulen en gång och cachelagrar den ipackage.loaded- Modulfilen returnerar sitt publika gränssnitt (vanligtvis en tabell)
- Rensa
package.loaded[name]för att tvinga fram en omladdning - Lägg till sökvägar i
package.pathför anpassade sökmappar - Använd
package.preloadför moduler i minnet - Undvik cirkulära beroenden
Lär dig Lua med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 40
- Lektioner
- 159
Vanliga frågor
Är lektionen ”Funktionen require” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”Funktionen require”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Funktionen require”?
Läs in externa moduler med require och förstå cachning av moduler. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Lua Academy?
Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Funktionen require”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Lua Academy-lektionen?
Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.