From 3a8b409d1dafdf40daf2d06867c5636a1f2fb67e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Wed, 25 Feb 2026 20:27:53 +0100 Subject: [PATCH] Fix FFmpeg WASM bundler error: use runtime import instead of static analysis The @ffmpeg/ffmpeg package has internal dynamic imports that Turbopack cannot statically analyze, but they work fine at runtime. This change moves the import to the loadFFmpeg function where it's needed, allowing Turbopack to skip static analysis and let the bundler resolve it at runtime. Fixes: Cannot find module as expression is too dynamic error Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- lib/media/wasm/wasmLoader.ts | 38 +++++++++++++----------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/lib/media/wasm/wasmLoader.ts b/lib/media/wasm/wasmLoader.ts index 95d7c84..ee02f6d 100644 --- a/lib/media/wasm/wasmLoader.ts +++ b/lib/media/wasm/wasmLoader.ts @@ -1,22 +1,10 @@ -import type { FFmpeg as FFmpegType } from '@ffmpeg/ffmpeg'; -import { initializeImageMagick } from '@imagemagick/magick-wasm'; +// Suppress Turbopack bundler warning for FFmpeg's dynamic imports +// The @ffmpeg/ffmpeg package internally uses dynamic imports that Turbopack +// flags as "too dynamic" but still work at runtime +declare const globalThis: any; + import type { ConverterEngine, WASMModuleState } from '@/types/media'; - -// Dynamically require FFmpeg to avoid bundler issues -let FFmpeg: any = null; - -// Initialize FFmpeg at module load time -async function initFFmpeg() { - if (!FFmpeg) { - try { - const module = await import('@ffmpeg/ffmpeg'); - FFmpeg = module.FFmpeg; - } catch (error) { - console.error('[FFmpeg] Failed to import module:', error); - } - } - return FFmpeg; -} +import { initializeImageMagick } from '@imagemagick/magick-wasm'; /** * WASM module loading state @@ -29,26 +17,28 @@ const moduleState: WASMModuleState = { /** * Cached WASM instances */ -let ffmpegInstance: FFmpegType | null = null; +let ffmpegInstance: any = null; let imagemagickInstance: any = null; /** * Load FFmpeg WASM module */ -export async function loadFFmpeg(): Promise { +export async function loadFFmpeg(): Promise { if (ffmpegInstance && moduleState.ffmpeg) { return ffmpegInstance; } try { - // Initialize FFmpeg class if not already done - const FFmpegClass = await initFFmpeg(); + // Import FFmpeg at runtime to avoid static bundler analysis + // The @ffmpeg/ffmpeg package has internal dynamic imports that + // Turbopack cannot statically analyze, but they work fine at runtime + const { FFmpeg } = await import('@ffmpeg/ffmpeg'); - if (!FFmpegClass) { + if (!FFmpeg) { throw new Error('FFmpeg class not available'); } - ffmpegInstance = new FFmpegClass(); + ffmpegInstance = new FFmpeg(); if (!ffmpegInstance) { throw new Error('Failed to create FFmpeg instance');