Using esbuild for Moodle Plugin AMD Modules
Use esbuild to modernise AMD module workflows in a Moodle plugin while staying compatible with Moodle’s runtime expectations.
Purpose
To compile modern JavaScript source files in amd/src/ into AMD-compatible .min.js files in amd/build/ using esbuild, in a way that’s fully Moodle-compliant but avoids Grunt.
Directory Structure
Your Moodle plugin should contain:
mod/yourplugin/
├── amd/
│ ├── src/
│ │ ├── editor.js
│ │ └── runtime.js
│ └── build/ ← (created automatically by esbuild)
Each source file should begin with a valid AMD define() block:
// amd/src/editor.js
define(['jquery'], function($) {
return {init: function(cfg) {
console.log('Hello from editor.js', cfg);
}};
});
Step 1: Initialize NPM (once)
From your plugin root:
npm init -y
This creates a package.json file.
Step 2: Install esbuild
npm install --save-dev esbuildThis installs esbuild locally into your plugin.
Step 3: Create build.js file
Create a file named build.js in the plugin root:
touch build.js
Paste in:
// build.js
const esbuild = require('esbuild');
esbuild.build({entryPoints: [‘amd/src/editor.js’, ‘amd/src/runtime.js’],
outdir: ‘amd/build’,
outExtension: { ‘.js’: ‘.min.js’ },
format: ‘iife’, // Moodle-compatible format
bundle: false,
minify: true,
target: [‘es2015’]
}).then) => {
console.log(' JS build complete.');}).catcherr) => {
console.error(' Build failed:', err);
process.exit(1);});
Step 4: Run the build
From your plugin root:
node build.js
You should see:
JS build complete.
Then verify:
ls amd/build/
You should see:
editor.min.js
runtime.min.js
⚙️ Optional: Add NPM build script
Edit package.json to add:
“scripts”: {
“build”: “node build.js”
}Now you can build with:
npm run build
TL;DR Summary
-
npm init -y
-
Create build.js with AMD-compatible config
-
Run node build.js or npm run build
-
Moodle will load your AMD modules from amd/build/*.min.js
npm install --save-dev esbuild
Solin supports modern front-end build workflows in Moodle plugins, including AMD, bundling, and deployment-safe tooling. Need help? Contact us.
Contact us