System modules

The WasmEdge QuickJS runtime supports ES6 and NPM modules for application developers. However, those approaches are too cumbersome for system developers. They need an easier way to add multiple JavaScript modules and APIs into the runtime without having to go through build tools like rollup.js. The WasmEdge QuickJS modules system allow developers to just drop JavaScript files into a modules folder, and have the JavaScript functions defined in the files immediately available to all JavaScript programs in the runtime. A good use case for this modules system is to support Node.js APIs in WasmEdge.

The module system is just a collection of JavaScript files in the modules directory in the WasmEdge QuickJS distribution. To use the JavaScript functions and APIs defined in those modules, you just need to map this directory to the /modules directory inside the WasmEdge Runtime instance. The following example shows how to do this on the WasmEdge CLI. You can do this with any of the host language SDKs that support embedded use of WasmEdge.

  1. ls modules
  2. buffer.js encoding.js events.js http.js
  3. ... JavaScript files for the modules ...
  4. wasmedge --dir .:. target/wasm32-wasi/release/wasmedge_quickjs.wasm example_js/hello.js WasmEdge Runtime

The module_demo shows how you can use the modules system to add your own JavaScript APIs. To run the demo, first copy the two files in the demo’s modules directory to your WasmEdge QuickJS’s modules directory.

  1. cp example_js/module_demo/modules/* modules/

The two JavaScript files in the modules directory provide two simple functions. Below is the modules/my_mod_1.js file.

  1. export function hello_mod_1(){
  2. console.log('hello from "my_mod_1.js"')
  3. }

And the modules/my_mod_2.js file.

  1. export function hello_mod_2(){
  2. console.log('hello from "my_mod_2.js"')
  3. }

Then, just run the demo.js file to call the two exported functions from the modules.

  1. import { hello_mod_1 } from 'my_mod_1'
  2. import { hello_mod_2 } from 'my_mod_2'
  3. hello_mod_1()
  4. hello_mod_2()

Here is the command to run the demo and the output.

  1. wasmedge --dir .:. target/wasm32-wasi/release/wasmedge_quickjs.wasm example_js/module_demo/demo.js
  2. hello from "my_mod_1.js"
  3. hello from "my_mod_2.js"

Following the above tutorials, you can easily add third-party JavaScript functions and APIs into your WasmEdge QuickJS runtime. For the official distribution, we included JavaScript files to support Node.js APIs. You can use those files as further examples.