Lua Academy · Lektion

Funktionen require

Läs in externa moduler med require och förstå cachning av moduler.

Lektion 1 av 412 steg

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)  -- true

Modulens 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 interface

Cachning 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 mock

Formatet 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.lua

require 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.lua

Biverkningar 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))   -- 15

Cirkulä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 i package.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.path för anpassade sökmappar
  • Använd package.preload för moduler i minnet
  • Undvik cirkulära beroenden
Gratis att börja

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.

Alla lektioner i den här kursen

  1. Funktionen require
  2. Skriva en modulfilsfil
  3. package.path och package.cpath
  4. Modulmönster och bästa praxis
← Tillbaka till Lua Academy