Skip to content

ModuleScript

Supported Class Scripting & Networking

A script type that runs once when Global.LuaGlobals.require() is called with it. Returns exactly one value, usually a table of functions, to used by other scripts. Useful for compartmentalizing code.

Description

A ModuleScript is a script type that returns exactly one value by a call to Global.LuaGlobals.require(). ModuleScripts run once and only once per Luau environment and return the exact same value for subsequent calls to Global.LuaGlobals.require().

ModuleScripts are essential objects for adhering to the "Don't Repeat Yourself" (DRY) principle, allowing you to write a function only once and use it everywhere. Having multiple copies of a function is problematic when you need to change their behavior, so you should define functions or groups of functions in ModuleScripts and have your Scripts and LocalScripts call Global.LuaGlobals.require() on those modules.

It's important to know that return values from ModuleScripts are independent with regards to Scripts and LocalScripts, and other environments like the Command Bar. Using Global.LuaGlobals.require() on a ModuleScript in a LocalScript will run the code on the client, even if a Script did so already on the server. Therefore, be careful if you're using a ModuleScript on the client and server at the same time, or debugging it within Studio.

Note that the first call to Global.LuaGlobals.require() will not yield (halt) unless the ModuleScript yields (calls task.wait() for example), in which case the current thread that called Global.LuaGlobals.require() will yield until the ModuleScript returns a value. If a ModuleScript is attempting to Global.LuaGlobals.require() another ModuleScript that in turn tries to Global.LuaGlobals.require() it, the thread will hang and never halt (cyclic Global.LuaGlobals.require() calls do not generate errors). Be mindful of your module dependencies in large projects!

If a ModuleScript is uploaded to Roblox and the root module has the name set to MainModule, it can be uploaded as a model and required using Global.LuaGlobals.require() with the model's asset ID. Then it can be loaded into your experience, although this logic only works on the server and will error on the client. If other users want to use the module, it must be public.

Inheritance

Object → Instance → LuaSourceContainer → ModuleScript

Nova inheritance: Instance → LuaSourceContainer → ModuleScript

Properties

LinkedSource Supported Property Deprecated Used to store a URL that points to an online script source. Binds the online code to the script's Script.Source.
LinkedSource: Content

Used to store a URL that points to an online script source. Binds the online code to the script's Script.Source.

Roblox reference signature
LinkedSource: ContentId

Roblox documentation

Source Supported Property The code to be executed.
Source: ProtectedString

The code to be executed.

If you want to read or modify a script that the user has open, consider using the ScriptEditorService to interact with the Script Editor instead.

Security: PluginSecurity

Roblox documentation

Inherited members

Inherited from LuaSourceContainer: 8 properties, 36 methods, 7 events. They are documented on the base class page.

Roblox reference: ModuleScript

Generated from Nova's API dump and Roblox creator-docs. Nova-only members come from the engine's reflection metadata.