バンドラー
decidekit/browser はワーカーを new Worker(new URL("./worker.js", import.meta.url), { type: "module" }) で起動します。Vite、webpack 5、esbuild ベースのツールが認識するパターンです。
Vite
Vite 7.1 でテストしました。ビルドしてクロスオリジン分離で配信し、ヘッドレス Chrome 156 で実行しました(ゼロショットと訓練)。
// vite.config.js
export default {
worker: { format: "es" },
optimizeDeps: { exclude: ["decidekit"] },
resolve: {
// Halves the wasm download (23.6 MB to 12.9 MB; 5.8 MB to 3.3 MB gzipped). decidekit runs on wasm by default,
// so it doesn't need the WebGPU build. Leave this out if you pass device: "webgpu".
alias: { "onnxruntime-web/webgpu": "onnxruntime-web/wasm" },
},
};クロスオリジン分離のヘッダーを開発サーバーとホストに追加してください。
server: { headers: { "Cross-Origin-Opener-Policy": "same-origin", "Cross-Origin-Embedder-Policy": "credentialless" } },webpack 5
webpack 5.112 で、パック済みのパッケージからテストしました。クロスオリジン分離で配信し、ヘッドレス Chrome で実行しました(ゼロショットと訓練)。設定なしで動き、webpack がワーカーを別のチャンクに分けます。エイリアスで wasm は 22.5 MiB から 12.3 MiB になります。
// webpack.config.js
export default {
experiments: { topLevelAwait: true }, // only if your own code awaits at the top level
resolve: { alias: { "onnxruntime-web/webgpu$": "onnxruntime-web/wasm" } },
};Next.js
Next.js 16.4(Turbopack、App Router)で、next build と next start のあとヘッドレス Chrome でテストしました。decidekit/browser はクライアントコンポーネントの中で、ブラウザでのみインポートしてください。useEffect の中で動的 import() を使えば、サーバーレンダリングに入りません。
// next.config.mjs
export default {
turbopack: { resolveAlias: { "onnxruntime-web/webgpu": "onnxruntime-web/wasm" } },
async headers() {
return [{ source: "/:path*", headers: [
{ key: "Cross-Origin-Opener-Policy", value: "same-origin" },
{ key: "Cross-Origin-Embedder-Policy", value: "credentialless" },
] }];
},
};"use client";
useEffect(() => {
import("decidekit/browser").then(async ({ createWorkerDecider }) => {
const d = await createWorkerDecider();
// ...
});
}, []);webpack を使う Next.js(next build --webpack)はテストしていません。上の webpack のエイリアスが当てはまるはずです。
バンドラーなしで
npm run bench は esbuild(同じエイリアス)で bench/browser.js と bench/worker.js をビルドします。これをコピーして静的ファイルとして配信できます。