Skip to content

[feat] migrate userscript loader to ESM #2791

@loynoir

Description

@loynoir

feat

migrate userscript loader

from

  • assuming legacy global IIFE userscript and dependency
// foo.user.js

@require https://legacy-global-iife-cdn/bar
@require https://legacy-global-iife-cdn/baz

legacy global IIFE

to

  • assuming modern ESM userscript and dependency
// foo.user.mjs

// like vscode extension `import vscode from 'vscode``
import { gm } from 'https://modern-esm-cdn/@xxx-monkey/runtime'

// `importShim` if impl is using shim mode
import { importShim } from 'https://modern-esm-cdn/@xxx-monkey/runtime'

import bar from 'https://modern-esm-cdn/bar'
import baz from 'https://modern-esm-cdn/baz'

// or like https://developers.cloudflare.com/dynamic-workers/api-reference/
// export default { fetch }
export default { userscript }

// or like vscode extesion style
// export { activate, deactivate }
export { userscript }

Maybe impl using

modules

There are many JS modules.

  • ESM: import/export
  • CJS: require
  • legacy: window/globalThis/self/...
  • UMD
  • AMD
  • SystemJS

library

  • Since 2021, famous dev sindresorhus move all his 1K+ packages to ESM only, see The ESM move sindresorhus/meta#15

  • In 2026, popular library I known are ALL written ESM format.

  • In 2026, ZERO popular library I known is written CJS format, or legacy global IIFE format, ...

CDN

Many CDN support ESM

frontend

<script type="module" src="module.js"></script>

import pkg from 'https://url/pkg'

  • Since maybe 2018, firefox maybe v60, support ESM

  • Since maybe 2017, chrome maybe v61, support ESM

backend

import pkg from 'pkg'

import pkg from 'https://url/pkg'

  • Since maybe 2018, deno born, support ESM

  • Since maybe 2021, bun born, support ESM

embed

  • Since maybe 2020, quickjs born, support ESM

editor

userscript

  • AFAIK, non userscript loader assuming ESM and support ESM yet.

workaround/polyfill/shim

related

FR matrix in lines ascending order

greasemonkey/greasemonkey#3229

#2791

violentmonkey/violentmonkey#2528

upstream

  • votes for firefox

https://connect.mozilla.org/t5/ideas/enable-consuming-of-es-modules-in-content-scripts-and/idi-p/125953

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions