BabylonJS/Babylon.js · error · Error
Required extension ${name} is disabled
Error message
Required extension ${name} is disabled What it means
The glTF asset declares an extension in its 'extensionsRequired' list, and an extension with that name is registered and enabled, but the user explicitly disabled it via loader extensionOptions. Because the asset cannot be correctly loaded without a required extension, the loader refuses to proceed.
Source
Thrown at packages/dev/loaders/src/glTF/2.0/glTFLoader.pure.ts:734
this._parent.onExtensionLoadedObservable.notifyObservers(extension);
return extension;
})()
);
}
});
this._extensions.push(...(await Promise.all(extensionPromises)));
this._extensions.sort((a, b) => (a.order || Number.MAX_VALUE) - (b.order || Number.MAX_VALUE));
this._parent.onExtensionLoadedObservable.clear();
if (this._gltf.extensionsRequired) {
for (const name of this._gltf.extensionsRequired) {
const available = this._extensions.some((extension) => extension.name === name && extension.enabled);
if (!available) {
if (this.parent.extensionOptions[name]?.enabled === false) {
throw new Error(`Required extension ${name} is disabled`);
}
throw new Error(`Required extension ${name} is not available`);
}
}
}
}
private _createRootNode(): INode {
if (this._parent.customRootNode !== undefined) {
this._rootBabylonMesh = this._parent.customRootNode;
return {
_babylonTransformNode: this._rootBabylonMesh === null ? undefined : this._rootBabylonMesh,
index: -1,
};
}
this._babylonScene._blockEntityCollection = !!this._assetContainer;
const rootMesh = new Mesh("__root__", this._babylonScene);
this._rootBabylonMesh = rootMesh;
View on GitHub (pinned to 0592b347b8)
Solutions
- Remove the enabled:false override for the required extension in extensionOptions
- Register the needed extension plugin (e.g. GLTFLoaderDracoCompression) and ensure it is enabled
- Re-export the glTF asset without the required extension if you cannot support it
- Check this._gltf.extensionsRequired in the asset to see which extensions must be enabled
Example fix
// before
const loader = new GLTFLoader();
loader.extensionOptions["KHR_draco_mesh_compression"] = { enabled: false };
// after
const loader = new GLTFLoader();
// do not disable an extension that the asset lists in extensionsRequired
loader.extensionOptions["KHR_draco_mesh_compression"] = { enabled: true }; Defensive patterns
Strategy: validation
Validate before calling
// Check required extensions against your loader config before loading
const required = gltf.extensionsRequired ?? [];
for (const name of required) {
if (loader.extensionOptions[name]?.enabled === false) {
throw new Error(`Re-enable ${name}: asset requires it`);
}
} Type guard
function isExtensionEnabled(loader, name) {
return loader.extensionOptions[name]?.enabled !== false;
} Try / catch
try {
await loader.loadAsync(url);
} catch (e) {
if (/is disabled$/.test(e.message)) {
const ext = e.message.match(/Required extension (\S+) is disabled/)?.[1];
console.warn(`Enable extensionOptions[${ext}] to load this asset`);
} else throw e;
} Prevention
- Never set enabled:false on extensions your assets declare in extensionsRequired
- Audit loader configuration after copy-pasting from other projects
When it happens
Trigger: loader.extensionOptions['KHR_draco_mesh_compression'].enabled = false (or similar) combined with loading a .glb/.gltf whose extensionsRequired includes that extension.
Common situations: Disabling extensions to test fallbacks or reduce bundle size; copy-pasted loader configuration from another project; a shared loader factory that disables certain extensions by default.
Related errors
- nodeIndex not found in configuration
- nodeIndex not found in configuration
- Error parsing node configuration
- Cannot get the last selected variant on a glTF mesh that doe
- ${extensionContext}: Texture type not supported
AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30).
Data as JSON: /api/errors/7196653275ea08a6.
Report an issue: GitHub.