Intro to Module Scripts

Intro to Module Scripts

Modular Programming

Copying the same functions between multiple scripts can be time consuming and hard to manage. For example, in a game with a currency game system, you’ll find yourself using the same functions in many game mechanics, like rewarding players for finishing quests or buying items in a shop.

A better way to organize and reuse code is with module scripts, a unique type of script that stores a set of functions and variables designed to meet a shared purpose, like managing player money or enemies.

Code within module scripts can be used by other scripts. That way, you can call the same function that gives coins from multiple different scripts whenever a player finishes a quest or finds a pickup.

By storing commonly used code in module scripts, it makes maintaining and organizing code easier since changes only need to be made to one module script, rather than updating multiple scripts.

Module Script Basics

Create a ModuleScript in ServerStorage.

ModuleScripts are commonly placed in ServerScriptService when used by server-side scripts and ReplicatedStorage when used by client-side local scripts.

Structure of Module Scripts

When created, every module script starts out with the code below:

The line local module = {} creates a table, or container of code, where the module’s shared functions and variables can be stored. This table should be renamed to the module’s purpose, such as MoneyManager or ParticleController. As opposed to other variables which are pascal case (myVariable), module tables are recommended to start capitalized.

So other scripts can use a module’s non-local functions or variables, every module ends with return myModule. Whenever another script tries to get code from the module, return lets that script access code stored inside the module table.

Adding to Module Scripts

To add a function or variable to the module which can be used in another script, type the module table’s name, followed by a dot, and the name of the function or variable, like in TestModule.myVariable. Using the dot operator is another way of adding code into a table, allowing other scripts to access that code whenever the module table is returned.

Type Between the Table and Return

Anything added to the module table must be typed between local myModule = {} and return myModule, or else the code will create an error.

Scope in Module Scripts

For a module function or variable to be used in an outside script, don’t type local.

Typing local in front of variables and functions means they are only usable by that script. While this is a good practice for most scripts for reducing errors and troubleshooting, you cannot make module script functions and variables local.

Any code used only by that module script should still include local. For instance, the code below includes the local variable questReward, which can only be used in that module script, and the function finishQuest(), which can be used in scripts outside the module.

Using Modules In Others Scripts

By itself, a module script can’t run code — it needs to be loaded in another script using the keyword require(). The function require() accepts one argument, the location of the module script in the Explorer.

To use a module, in a separate script, set a variable equal to require(moduleScript).

Now, the variable myModule contains the module table created in that module script. To use functions and variables from that table, type the variable name, followed by a dot, and the exact name of what to use in that module script, like myModule.myFunction(). When the script runs and reaches that line, it’ll access that specific function or variable stored in the module table.

Module Script - MoneyManager
local MoneyManager = {}

function MoneyManager.giveMoney(player, questReward)
    player.Money = player.Money + questReward

return MoneyManager
Normal Script - Coin Pickup
-- Load module script
local MoneyManager = require(ServerStorage.ModuleScript)
local coinValue = 100

if player then
    --Calls function from module script
    MoneyManager.giveMoney(player, coinValue)
Check Spelling When Typing in Other Scripts

If you’re in another script, make sure that the module script function or variable is spelled exactly the same as found in that module. To help, you can copy the exact function or variable name from the module and then just paste it in the normal script where it’ll be used.

General Troubleshooting

Some of the tips here address common issues when working with module scripts. Keep in mind that module scripts can be a complicated topic with more nuance. For more details, see this more technical guide on Module Scripts.

Issue: Get an error message including: "Infinite yield possible" or "not a valid member".

  • Check the spelling of the module script where it’s loaded. require() must include the exact path and spelling of the module script, which may be named differently than the module table.

Issue: Get an error message including: "attempt to index global".

  • In any scripts using a module script, make sure it’s loaded using the function require(). If not, that script cannot use functions and variables from the module script.