# WASM Support Bundle WebAssembly modules in your TypeScript/JavaScript project. ## Overview tsdown supports WASM through [`rolldown-plugin-wasm`](https://github.com/sxzz/rolldown-plugin-wasm), enabling direct `.wasm` imports with synchronous and asynchronous instantiation. ## Setup ### Install ```bash pnpm add -D rolldown-plugin-wasm ``` ### Configure ```ts import { wasm } from 'rolldown-plugin-wasm'; import { defineConfig } from 'tsdown'; export default defineConfig({ entry: ['./src/index.ts'], plugins: [wasm()], }); ``` ### TypeScript Support Add type declarations to `tsconfig.json`: ```jsonc { "compilerOptions": { "types": ["rolldown-plugin-wasm/types"], }, } ``` ## Importing WASM Modules ### Direct Import ```ts import { add } from './add.wasm'; add(1, 2); ``` ### Async Init Use `?init` query for async initialization: ```ts import init from './add.wasm?init'; const instance = await init(imports); // imports optional instance.exports.add(1, 2); ``` ### Sync Init Use `?init&sync` query for synchronous initialization: ```ts import initSync from './add.wasm?init&sync'; const instance = initSync(imports); // imports optional instance.exports.add(1, 2); ``` ## wasm-bindgen Support ### Target `bundler` (Recommended) ```ts import { add } from 'some-pkg'; add(1, 2); ``` ### Target `web` (Node.js) ```ts import { readFile } from 'node:fs/promises'; import init, { add } from 'some-pkg'; import wasmUrl from 'some-pkg/add_bg.wasm?url'; await init({ module_or_path: readFile(new URL(wasmUrl, import.meta.url)), }); add(1, 2); ``` ### Target `web` (Browser) ```ts import init, { add } from 'some-pkg/add.js'; import wasmUrl from 'some-pkg/add_bg.wasm?url'; await init({ module_or_path: wasmUrl }); add(1, 2); ``` `nodejs` and `no-modules` wasm-bindgen targets are not supported. ## Plugin Options ```ts wasm({ maxFileSize: 14 * 1024, // Max size for inline (default: 14KB) fileName: '[hash][extname]', // Output file name pattern publicPath: '', // Prefix for non-inlined file paths targetEnv: 'auto', // 'auto' | 'auto-inline' | 'browser' | 'node' }); ``` | Option | Default | Description | | ------------- | ------------------- | ---------------------------------------------------------------------------------- | | `maxFileSize` | `14 * 1024` | Max file size for inlining. Set to `0` to always copy. | | `fileName` | `'[hash][extname]'` | Pattern for emitted WASM files | | `publicPath` | — | Prefix for non-inlined WASM file paths | | `targetEnv` | `'auto'` | `'auto'` detects at runtime; `'browser'` omits Node builtins; `'node'` omits fetch | ## Related Options - [Plugins](advanced-plugins.md) - Plugin system overview - [Platform](option-platform.md) - Target platform configuration