0Pricing
Lua Academy · Pelajaran

Fungsi require

Muat modul eksternal dengan require dan pahami caching modul.

Fungsi require adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Cara Kerja require

require(modname) memuat dan mengembalikan sebuah modul. Fungsi ini mencari package.path untuk menemukan file .lua dan package.cpath untuk menemukan pustaka C. Hasilnya disimpan dalam cache di package.loaded[modname]—panggilan berikutnya mengembalikan nilai dari cache tanpa menjalankan ulang file.

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

Nilai Kembalian Modul

File modul seharusnya mengembalikan sebuah nilai—biasanya tabel berisi fungsi. Nilai kembalian inilah yang diberikan require kepada pemanggil. Jika file tidak mengembalikan apa pun (atau true), itulah yang dikembalikan require.

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

Caching dalam package.loaded

package.loaded adalah tabel yang memetakan nama modul ke nilai yang telah dimuat. Anda dapat mengatur entri secara manual untuk memuat mock terlebih dahulu, atau mengaturnya menjadi nil untuk memaksa pemuatan ulang (file modul akan dijalankan kembali pada require berikutnya).

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

Format package.path

package.path adalah daftar pola yang dipisahkan titik koma. Placeholder ? digantikan oleh nama modul (dengan titik diganti menjadi pemisah jalur). Anda dapat menambahkan direktori pencarian dengan menempatkannya di awal 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 vs dofile vs loadfile

require: menyimpan cache dan mencari di package.path. dofile(path): segera menjalankan file, tanpa cache, dan menerima jalur langsung. loadfile(path): mengompilasi tetapi tidak menjalankan file, lalu mengembalikan fungsi. Gunakan require untuk modul; dofile untuk skrip sekali jalan.

-- 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 dengan Titik untuk Direktori

Gunakan titik dalam nama modul untuk merujuk file di subdirektori. require("utils.string") dipetakan ke utils/string.lua (dengan ? dalam pola jalur). Inilah cara pustaka yang terdiri dari banyak file diatur.

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

Efek Samping Inisialisasi Modul

File modul dijalankan sekali saat pertama kali diperlukan. Kode apa pun pada tingkat teratas (di luar fungsi) berjalan saat require dipanggil. Ini berguna untuk inisialisasi satu kali, tetapi berhati-hatilah—efek samping seperti koneksi jaringan atau operasi file berjalan saat impor.

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

Penanganan Error dalam require

Jika file modul memiliki error sintaks atau menghasilkan error saat dimuat, require menghasilkan error. Pesan error tersebut menyertakan nama modul dan error dari dalam file. Gunakan pcall untuk menangani kegagalan pemuatan modul dengan baik.

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 adalah tabel tempat Anda dapat mendaftarkan fungsi pemuat berdasarkan nama modul. Saat require("name") dipanggil, Lua memeriksa preload terlebih dahulu. Dengan demikian, Anda dapat mendaftarkan modul tanpa berkas—berguna untuk Lua tertanam atau pengujian.

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

Require Sirkular

Dependensi sirkular (A memerlukan B, B memerlukan A) ditangani sebagian: Lua menyimpan penanda true di package.loaded sebelum menjalankan modul. Jika B mencoba menggunakan tabel A yang belum selesai, hasil yang diperoleh mungkin tidak lengkap. Hindari dependensi sirkular dalam desain modul.

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

Pemeriksaan Cepat

Apa yang terjadi saat Anda memanggil require("mod") untuk kedua kalinya?

Rangkuman: require

Ringkasan:

  • require(name) memuat satu kali dan menyimpannya di package.loaded
  • Berkas modul mengembalikan antarmuka publiknya (biasanya berupa tabel)
  • Hapus package.loaded[name] untuk memaksa pemuatan ulang
  • Tambahkan ke package.path untuk direktori pencarian khusus
  • Gunakan package.preload untuk modul dalam memori
  • Hindari dependensi sirkular

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Fungsi require” gratis?

Ya — teks lengkap “Fungsi require” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Fungsi require”?

Muat modul eksternal dengan require dan pahami caching modul. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Fungsi require” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Fungsi require
  2. Menulis Berkas Modul
  3. package.path dan package.cpath
  4. Pola Modul dan Praktik Terbaik
← Kembali ke Lua Academy