[READ-ONLY] Mirror of https://github.com/sxzz/rolldown-plugin-wasm. Rolldown plugin for WASM.
TypeScript 91%
JavaScript 6%
Shell 2%
Rust <1%

README.md

rolldown-plugin-wasm #

npm version npm downloads Unit Test

Rolldown plugin for WASM.

This project is heavily referenced from @rollup/plugin-wasm and vite-plugin-wasm.

Install #

npm i rolldown-plugin-wasm

Usage #

// rolldown.config.ts
import { defineConfig } from 'rolldown'
import { wasm } from 'rolldown-plugin-wasm'

export default defineConfig({
  plugins: [
    wasm({
      // ...options
    }),
  ],
})

Importing WASM Modules #

import { add } from './add.wasm'

add(1, 2)

Asynchronous Init #

import init from './add.wasm?init'

const instance = await init(
  imports, // optional
)

instance.exports.add(1, 2)

Synchronous Init #

import initSync from './add.wasm?init&sync'

const instance = initSync(
  imports, // optional
)

instance.exports.add(1, 2)

wasm-bindgen Support #

import { add } from 'some-pkg'

add(1, 2)

Target web #

Node.js #
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(wasmUrl),
})

add(1, 2)
Browser #
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)

Note

Other targets such as nodejs and no-modules are not supported.

TypeScript Support #

// tsconfig.json
{
  "compilerOptions": {
    "types": ["rolldown-plugin-wasm/types"],
  },
}

Options #

/**
 * - `"auto"` will determine the environment at runtime and invoke the correct methods accordingly
 * - `"auto-inline"` always inlines the WASM and will decode it according to the environment
 * - `"browser"` omits emitting code that requires node.js builtin modules
 * - `"node"` omits emitting code that requires `fetch`, but requires Node.js 20.16.0 or higher
 */
export type TargetEnv = 'auto' | 'auto-inline' | 'browser' | 'node'

export interface Options {
  /**
   * The maximum file size for inline files. If a file exceeds this limit, it will be copied to the destination folder and loaded from a separate file at runtime.
   * If `maxFileSize` is set to `0` all files will be copied.
   * Files specified in `sync` to load synchronously are always inlined, regardless of size.
   *
   * @default 14 * 1024
   */
  maxFileSize?: number
  /**
   * String used to rename the emitted Wasm files.
   * @default '[hash][extname]'
   */
  fileName?: string
  /**
   * Configures what code is emitted to instantiate the Wasm (both inline and separate)
   */
  targetEnv?: TargetEnv
}

Sponsors #

License #

MIT License © 2026-PRESENT Kevin Deng

MIT Copyright (c) 2022 Menci

MIT License Copyright (c) 2019 RollupJS Plugin Contributors