[npm]: https://img.shields.io/npm/v/@rollup/plugin-wasm
[npm-url]: https://www.npmjs.com/package/@rollup/plugin-wasm
[size]: https://packagephobia.now.sh/badge?p=@rollup/plugin-wasm
[size-url]: https://packagephobia.now.sh/result?p=@rollup/plugin-wasm
[![npm][npm]][npm-url]
[![size][size]][size-url]
[](https://liberamanifesto.com)
# @rollup/plugin-wasm
🍣 A Rollup which allows importing and bundling [WebAssembly modules](http://webassembly.org).
WebAssembly Modules are imported asynchronous as base64 strings. Small modules [can be imported synchronously](#synchronous-modules).
## Requirements
This plugin requires an [LTS](https://github.com/nodejs/Release) Node version (v14.0.0+) and Rollup v1.20.0+.
## Install
Using npm:
```console
npm install @rollup/plugin-wasm --save-dev
```
## Usage
Create a `rollup.config.js` [configuration file](https://www.rollupjs.org/guide/en/#configuration-files) and import the plugin:
```js
import { wasm } from '@rollup/plugin-wasm';
export default {
input: 'src/index.js',
output: {
dir: 'output',
format: 'cjs'
},
plugins: [wasm()]
};
```
Then call `rollup` either via the [CLI](https://www.rollupjs.org/guide/en/#command-line-reference) or the [API](https://www.rollupjs.org/guide/en/#javascript-api).
## Options
### `sync`
Type: `Array[...String]`
Default: `null`
Specifies an array of strings that each represent a WebAssembly file to load synchronously. See [Synchronous Modules](#synchronous-modules) for a functional example.
### `maxFileSize`
Type: `Number`
Default: `14336` (14kb)
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.
### `fileName`
Type: `String`
Default: `'[hash][extname]'`
This option can be used to rename the emitted Wasm files. It accepts the following string replacements:
- `[hash]` - The hash value of the file's contents
- `[name]` - The name of the imported file (without its file extension)
- `[extname]` - The extension of the imported file (including the leading `.`)
### `publicPath`
Type: `String`
Default: (empty string)
A string which will be added in front of filenames when they are not inlined but are copied.
### `targetEnv`
Type: `"auto" | "browser" | "node"`
Default: `"auto"`
Configures what code is emitted to instantiate the Wasm (both inline and separate):
- `"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 that may play havoc on downstream bundlers
- `"node"` omits emitting code that requires `fetch`
## WebAssembly Example
Given the following simple C file:
```c
int main() {
return 42;
}
```
Compile the file using `emscripten`, or the online [WasmFiddle](https://wasdk.github.io/WasmFiddle//) tool. Then import and instantiate the resulting file:
```js
import sample from './sample.wasm';
sample({ ...imports }).then(({ instance }) => {
console.log(instance.exports.main());
});
```
The WebAssembly is inlined as a base64 encoded string. At runtime the string is decoded and a module is returned.
_Note: The base64 string that represents the WebAssembly within the bundle will be ~33% larger than the original file._
### Synchronous Modules
Small modules (< 4KB) can be compiled synchronously by specifying them in the configuration.
```js
wasm({
sync: ['web/sample.wasm', 'web/foobar.wasm']
});
```
This means that the exports can be accessed immediately.
```js
import sample from './sample.wasm';
const instance = sample({ ...imports });
console.log(instance.exports.main());
```
## Meta
[CONTRIBUTING](/.github/CONTRIBUTING.md)
[LICENSE (MIT)](/LICENSE)