Skip to content

These docs are for Miniflare 2 which is no longer supported apart from critical security updates.
Please see the migration guide to upgrade to Miniflare 3, and the updated API docs.

Visit Miniflare on GitHub
Set theme to dark (โ‡ง+D)

๐Ÿ“š Modules

Enabling Modules

Miniflare supports both the traditional service-worker and newer modules formats for writing workers. To use the modules format, enable it with:

$ miniflare --modules # or -m
format = "modules"
const mf = new Miniflare({
modules: true,

When using the API you must also pass the --experimental-vm-modules flag to Node.js. This is added automatically when using the CLI.

You can now use modules worker scripts like the following:

export default {
async fetch(request, env, ctx) {
// - `request` is the incoming `Request` instance
// - `env` contains bindings, KV namespaces, Durable Objects, etc
// - `ctx` contains `waitUntil` and `passThroughOnException` methods
return new Response("Hello Miniflare!");
async scheduled(controller, env, ctx) {
// - `controller` contains `scheduledTime` and `cron` properties
// - `env` contains bindings, KV namespaces, Durable Objects, etc
// - `ctx` contains the `waitUntil` method
console.log("Doing something scheduled...");

Module Rules

Miniflare supports all module types: ESModule, CommonJS, Text, Data and CompiledWasm. You can specify additional module resolution rules as follows:

# Note all rules implicitly have the `fallthrough` option set to true
$ miniflare --modules-rule "ESModule=**/*.js" --modules-rule "Text=**/*.txt"
type = "ESModule"
globs = ["**/*.js"]
type = "Text"
globs = ["**/*.txt"]
const mf = new Miniflare({
modulesRules: [
{ type: "ESModule", include: ["**/*.js"], fallthrough: true },
{ type: "Text", include: ["**/*.txt"] },

Default Rules

The following rules are automatically added to the end of your modules rules list. You can override them by specifying rules matching the same globs:

type = "ESModule"
globs = ["**/*.mjs"]
type = "CommonJS"
globs = ["**/*.js", "**/*.cjs"]