diff --git a/package-lock.json b/package-lock.json index 26121305b..61c93aaec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@huggingface/jinja": "^0.3.3", "onnxruntime-node": "1.20.1", - "onnxruntime-web": "1.21.0-dev.20250206-d981b153d3", + "onnxruntime-web": "1.22.0-dev.20250306-aafa8d170a", "sharp": "^0.33.5" }, "devDependencies": { @@ -8783,23 +8783,23 @@ } }, "node_modules/onnxruntime-web": { - "version": "1.21.0-dev.20250206-d981b153d3", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.21.0-dev.20250206-d981b153d3.tgz", - "integrity": "sha512-esDVQdRic6J44VBMFLumYvcGfioMh80ceLmzF1yheJyuLKq/Th8VT2aj42XWQst+2bcWnAhw4IKmRQaqzU8ugg==", + "version": "1.22.0-dev.20250306-aafa8d170a", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250306-aafa8d170a.tgz", + "integrity": "sha512-g72WvR1IZFVZQe3fp7K4lk5Ka6zEnMkAVc1jpLK5TIzTc2anOIEYzGTjG2t0cM+BRKN2wxSS20zWtYOL+h5C6Q==", "license": "MIT", "dependencies": { "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", - "onnxruntime-common": "1.21.0-dev.20250206-d981b153d3", + "onnxruntime-common": "1.22.0-dev.20250306-aafa8d170a", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { - "version": "1.21.0-dev.20250206-d981b153d3", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0-dev.20250206-d981b153d3.tgz", - "integrity": "sha512-TwaE51xV9q2y8pM61q73rbywJnusw9ivTEHAJ39GVWNZqxCoDBpe/tQkh/w9S+o/g+zS7YeeL0I/2mEWd+dgyA==", + "version": "1.22.0-dev.20250306-aafa8d170a", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250306-aafa8d170a.tgz", + "integrity": "sha512-NfIQnW4lIk/8LnhnYqknYPeet0U0+AADgKQRlKex36QrNoVSCY+aNaX6wyy2VzQ4CNWxsYh0E203ajRD/zxn0g==", "license": "MIT" }, "node_modules/open": { diff --git a/package.json b/package.json index b6a1c786d..de519020c 100644 --- a/package.json +++ b/package.json @@ -9,16 +9,16 @@ "node": { "import": { "types": "./types/transformers.d.ts", - "default": "./dist/transformers.mjs" + "default": "./dist/transformers.node.mjs" }, "require": { "types": "./types/transformers.d.ts", - "default": "./dist/transformers.cjs" + "default": "./dist/transformers.node.cjs" } }, "default": { "types": "./types/transformers.d.ts", - "default": "./dist/transformers.js" + "default": "./dist/transformers.web.js" } }, "scripts": { @@ -57,7 +57,7 @@ "dependencies": { "@huggingface/jinja": "^0.3.3", "onnxruntime-node": "1.20.1", - "onnxruntime-web": "1.21.0-dev.20250206-d981b153d3", + "onnxruntime-web": "1.22.0-dev.20250306-aafa8d170a", "sharp": "^0.33.5" }, "devDependencies": { diff --git a/src/backends/onnx.js b/src/backends/onnx.js index 38cd71337..445582421 100644 --- a/src/backends/onnx.js +++ b/src/backends/onnx.js @@ -57,8 +57,8 @@ let ONNX; const ORT_SYMBOL = Symbol.for('onnxruntime'); if (ORT_SYMBOL in globalThis) { - // If the JS runtime exposes their own ONNX runtime, use it - ONNX = globalThis[ORT_SYMBOL]; + // If the JS runtime exposes their own ONNX runtime, use it + ONNX = globalThis[ORT_SYMBOL]; } else if (apis.IS_NODE_ENV) { ONNX = ONNX_NODE.default ?? ONNX_NODE; @@ -175,11 +175,15 @@ const ONNX_ENV = ONNX?.env; if (ONNX_ENV?.wasm) { // Initialize wasm backend with suitable default settings. - // (Optional) Set path to wasm files. This is needed when running in a web worker. - // https://onnxruntime.ai/docs/api/js/interfaces/Env.WebAssemblyFlags.html#wasmPaths - // We use remote wasm files by default to make it easier for newer users. - // In practice, users should probably self-host the necessary .wasm files. - ONNX_ENV.wasm.wasmPaths = `https://cdn.jsdelivr.net/npm/@huggingface/transformers@${env.version}/dist/`; + // (Optional) Set path to wasm files. This will override the default path search behavior of onnxruntime-web. + // By default, we only do this if we are not in a service worker and the wasmPaths are not already set. + if ( + // @ts-ignore Cannot find name 'ServiceWorkerGlobalScope'.ts(2304) + !(typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope) + && !ONNX_ENV.wasm.wasmPaths + ) { + ONNX_ENV.wasm.wasmPaths = `https://cdn.jsdelivr.net/npm/@huggingface/transformers@${env.version}/dist/`; + } // TODO: Add support for loading WASM files from cached buffer when we upgrade to onnxruntime-web@1.19.0 // https://github.com/microsoft/onnxruntime/pull/21534 @@ -187,11 +191,6 @@ if (ONNX_ENV?.wasm) { // Users may wish to proxy the WASM backend to prevent the UI from freezing, // However, this is not necessary when using WebGPU, so we default to false. ONNX_ENV.wasm.proxy = false; - - // https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated - if (typeof crossOriginIsolated === 'undefined' || !crossOriginIsolated) { - ONNX_ENV.wasm.numThreads = 1; - } } if (ONNX_ENV?.webgpu) { diff --git a/webpack.config.js b/webpack.config.js index 7ad880868..09611f1e4 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -24,36 +24,13 @@ class PostBuildPlugin { const file = path.join(dist, ORT_BUNDLE_FILE); if (fs.existsSync(file)) fs.unlinkSync(file); } - + // 2. Copy unbundled JSEP file { const src = path.join(__dirname, 'node_modules/onnxruntime-web/dist', ORT_JSEP_FILE); const dest = path.join(dist, ORT_JSEP_FILE); fs.copyFileSync(src, dest); } - - // 3. Replace strings in certain files - { - const files = ['transformers.js', 'transformers.min.js']; - for (const file of files) { - const filePath = path.join(dist, file); - let content = fs.readFileSync(filePath, 'utf8'); - content = content.replace( - // Replace all instances of `new URL("./", import.meta.url)` with `new URL(import.meta.url)`, - // as it causes several issues with build tools and bundlers. - // - // See the following issues for more information: - // - https://github.com/huggingface/transformers.js/issues/911 - // - https://github.com/huggingface/transformers.js/issues/984 - // - https://github.com/huggingface/transformers.js/issues/980 - // - https://github.com/huggingface/transformers.js/issues/1021 - // - https://github.com/huggingface/transformers.js/issues/1026 - new RegExp('new URL\\(["\']\\.\\\/["\'],\\s*import\\.meta\\.url\\)', 'gm'), - "new URL(import.meta.url)", - ); - fs.writeFileSync(filePath, content, 'utf8'); - } - } }); } } @@ -98,7 +75,7 @@ function buildConfig({ type, }, assetModuleFilename: "[name][ext]", - chunkFormat: "module", + chunkFormat: false, }, optimization: { minimize: true, @@ -157,6 +134,7 @@ const NODE_IGNORE_MODULES = ["onnxruntime-web"]; // NOTE: This is necessary for both type="module" and type="commonjs", // and will be ignored when building for web (only used for node/deno) const NODE_EXTERNAL_MODULES = [ + "onnxruntime-common", "onnxruntime-node", "sharp", "fs", @@ -164,8 +142,25 @@ const NODE_EXTERNAL_MODULES = [ "url", ]; +// Do not bundle onnxruntime-node when packaging for the web. +const WEB_IGNORE_MODULES = ["onnxruntime-node"]; + +// Do not bundle the following modules with webpack (mark as external) +const WEB_EXTERNAL_MODULES = [ + "onnxruntime-common", + "onnxruntime-web", +]; + // Web-only build const WEB_BUILD = buildConfig({ + name: ".web", + type: "module", + ignoreModules: WEB_IGNORE_MODULES, + externalModules: WEB_EXTERNAL_MODULES, +}); + +// Web-only build, bundled with onnxruntime-web +const BUNDLE_BUILD = buildConfig({ type: "module", plugins: [new PostBuildPlugin()], }); @@ -173,12 +168,14 @@ const WEB_BUILD = buildConfig({ // Node-compatible builds const NODE_BUILDS = [ buildConfig({ + name: ".node", suffix: ".mjs", type: "module", ignoreModules: NODE_IGNORE_MODULES, externalModules: NODE_EXTERNAL_MODULES, }), buildConfig({ + name: ".node", suffix: ".cjs", type: "commonjs", ignoreModules: NODE_IGNORE_MODULES, @@ -188,6 +185,6 @@ const NODE_BUILDS = [ // When running with `webpack serve`, only build the web target. const BUILDS = process.env.WEBPACK_SERVE - ? [WEB_BUILD] - : [WEB_BUILD, ...NODE_BUILDS]; + ? [BUNDLE_BUILD] + : [BUNDLE_BUILD, WEB_BUILD, ...NODE_BUILDS]; export default BUILDS;