Skip to main content

Overview

QuickJS supports both ES6 JavaScript modules and native C modules. The module system follows the ECMAScript specification and allows you to organize code into reusable components.

ES6 JavaScript modules

Module syntax

QuickJS supports standard ES6 module syntax:

Loading ES6 modules

From the command line:
From C code:

Module detection

QuickJS can automatically detect if code is a module:

Native C modules

Native modules allow you to expose C functionality to JavaScript.

Module structure

Every native module must have an initialization function:

Implementing exports

Complete example

Here’s a complete native module from the QuickJS examples:
Usage from JavaScript:

Built-in modules

QuickJS includes several built-in modules:

qjs:std module

qjs:os module

qjs:bjson module

Initializing built-in modules

From C code:

Module loading

Custom module loader

You can implement a custom module loader:

Default module loader

The default loader provided by quickjs-libc:

Dynamic imports

QuickJS supports dynamic import() expressions:
From C:

Module namespaces

Import entire module as namespace:
Default exports:

Module caching

QuickJS caches loaded modules:

Best practices

Use ES6 modules for JavaScript - They provide better tooling support and are standard JavaScript.
Keep native modules focused - Each C module should have a single, well-defined purpose.
Always export declared names - The names passed to JS_AddModuleExport() must match those in JS_SetModuleExport().
Module paths are resolved relative to the current module’s directory, similar to Node.js.

Example: Class-based module

Native modules can export classes with methods:

See also