{"record":{"id":"28cb63cb49484f51","repo":"BabylonJS/Babylon.js","slug":"no-plugin-or-fallback-for-pluginextension-fil","errorCode":null,"errorMessage":"No plugin or fallback for ${pluginExtension ?? fileInfo.url}","messagePattern":"No plugin or fallback for (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/dev/core/src/Loading/sceneLoader.ts","lineNumber":704,"sourceCode":"          : getPluginForExtension(fileExtension, false);\r\n\r\n    if (!registeredPlugin && fileExtension) {\r\n        if (fileInfo.url && !fileInfo.url.startsWith(\"blob:\")) {\r\n            // Fetching head content to get the mime type\r\n            const response = await _FetchAsync(fileInfo.url, { method: \"HEAD\", responseHeaders: [\"Content-Type\"] });\r\n            const mimeType = response.headerValues ? response.headerValues[\"Content-Type\"] : \"\";\r\n            if (mimeType) {\r\n                registeredPlugin = getPluginForMimeType(mimeType);\r\n            }\r\n        }\r\n\r\n        if (!registeredPlugin) {\r\n            registeredPlugin = getDefaultPlugin();\r\n        }\r\n    }\r\n\r\n    if (!registeredPlugin) {\r\n        throw new Error(`No plugin or fallback for ${pluginExtension ?? fileInfo.url}`);\r\n    }\r\n\r\n    if (pluginOptions?.[registeredPlugin.plugin.name]?.enabled === false) {\r\n        throw new Error(`The '${registeredPlugin.plugin.name}' plugin is disabled via the loader options passed to the loading operation.`);\r\n    }\r\n\r\n    if (fileInfo.rawData && !registeredPlugin.isBinary) {\r\n        throw new Error(\"Loading from ArrayBufferView can not be used with plugins that don't support binary loading.\");\r\n    }\r\n\r\n    // For plugin factories, the plugin is instantiated on each SceneLoader operation. This makes options handling\r\n    // much simpler as we can just pass the options to the factory, rather than passing options through to every possible\r\n    // plugin call. Given this, options are only supported for plugins that provide a factory function.\r\n    let plugin: SceneLoaderPlugin;\r\n    if (IsFactory(registeredPlugin.plugin)) {\r\n        const pluginFactory = registeredPlugin.plugin;\r\n        try {\r\n            // Only await when the factory is actually asynchronous, so that for synchronous factories the plugin is\r","sourceCodeStart":686,"sourceCodeEnd":722,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/core/src/Loading/sceneLoader.ts#L686-L722","documentation":"SceneLoader resolved the requested file extension (or the URL) but found no registered loader plugin for it, and no default fallback plugin is registered either. SceneLoader only supports formats whose plugins (e.g. .glb, .obj, .stl) have been registered/imported into the scene.","triggerScenarios":"Loading a file whose extension has no registered plugin (e.g. \".usdz\", \".fbx\") or calling with a pluginExtension that was never registered, when no default plugin fallback exists.","commonSituations":"Forgetting to import the side-effect module (e.g. @babylonjs/loaders/glTF) in ES6/webpack builds; typos in the extension; loading a format Babylon.js does not support at all.","solutions":["Import the loader plugin for the format before loading, e.g. import \"@babylonjs/loaders/glTF\".","Verify the file extension / pluginExtension string matches a supported format (gltf, glb, obj, stl, dae...).","Register the plugin manually via SceneLoader.RegisterPlugin if using a custom loader."],"exampleFix":"// before\nimport { SceneLoader } from \"@babylonjs/core\";\nawait SceneLoader.ImportMeshAsync(\"\", url, \"model.glb\", scene); // no plugin registered\n\n// after\nimport \"@babylonjs/loaders/glTF\";\nawait SceneLoader.ImportMeshAsync(\"\", url, \"model.glb\", scene);","handlingStrategy":"fallback","validationCode":"const supported = [\".gltf\", \".glb\", \".obj\", \".stl\", \".dae\", \".splat\"];\nconst ext = url.slice(url.lastIndexOf(\".\"));\nif (!supported.includes(ext)) console.warn(\"No known Babylon.js loader for\", ext);","typeGuard":null,"tryCatchPattern":"try {\n  await BABYLON.SceneLoader.ImportMeshAsync(\"\", root, file, scene);\n} catch (e) {\n  if ((e as Error).message.startsWith(\"No plugin or fallback\")) {\n    console.error(\"Loader plugin missing for\", file, \"— import @babylonjs/loaders/* side-effect module\");\n  }\n}","preventionTips":["Import the loaders side-effect modules early (e.g. import \"@babylonjs/loaders/glTF\") in the app entry point.","Validate file extensions against supported formats before calling SceneLoader.","Convert unsupported formats (fbx, usdz) to glTF in an asset pipeline step."],"tags":["loading","scene-loader","plugin","missing-import"],"backgroundTag":"missing-loader-plugin","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}