Codectionary / Developer documentation / Luau

ModuleScripts and exported types

A ModuleScript returns a value for require to use. Keep reusable calculations in modules and choose storage based on who may require them. Requiring the same module on the client and server does not create shared memory between those environments.

Syntax

local Lessons = require(game:GetService("ReplicatedStorage"):WaitForChild("Lessons"))

Examples

Define the shared module

Roblox Studio: create a ModuleScript named Lessons in ReplicatedStorage. Its public type describes a record; its returned table exposes the function. This module contains no secrets.

--!strict
export type Lesson = { title: string, minutes: number }
local Lessons = {}
function Lessons.describe(lesson: Lesson): string
    return `{lesson.title}: {lesson.minutes} minutes`
end
return Lessons

Require and use it

Script in ServerScriptService, with the Lessons ModuleScript above already present. A LocalScript may also require this shared module, but its runtime state is separate.

--!strict
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Lessons = require(ReplicatedStorage:WaitForChild("Lessons"))
local lesson: Lessons.Lesson = { title = "Types", minutes = 12 }
print(Lessons.describe(lesson))

Best practices

  • Keep server-only rules and secrets in server-only containers.
  • Avoid cyclic require chains; move shared types or small helpers to a dependency both modules can use.
  • Return a constructor when callers need fresh mutable state instead of sharing the module table.

At a glance

Purpose
Typed scripting and Roblox development
File extension
.luau
Runs in
Luau host; Roblox engine examples require Roblox Studio
Usually used with
Roblox APIs and Studio

Specifications & further reading

Related Luau documentation