import-module-string
v2.0.3
Published
Use import('data:') and import(Blob) to execute arbitrary JavaScript strings
Downloads
2,688
Readme
import-module-string
Use import('data:') and import(Blob) to execute arbitrary JavaScript strings. A simpler alternative to node-retrieve-globals that works in more runtimes.
Installation
Available on npm as import-module-string.
npm install import-module-stringFeatures
- Multi-runtime: tested with Node (18+), Deno (limited), Chromium, Firefox, and WebKit.
- Defers to
exportwhen used, otherwise implicitlyexportall globals (viavar,let,const,function,ArrayorObjectdestructuring assignment,importspecifiers, etc) - Supports top-level async/await (as expected for ES modules)
- Emulates
import.meta.urlwhenfilePathoption is supplied addRequireoption adds support forrequire()(in Node)- Extremely limited dependency footprint (
acornfor JS parsing only) - Supports data object to pass in data (must be JSON.stringify friendly, more serialization options may be added later)
- Subject to URL content size maximums: Chrome
512MB, Safari2048MB, Firefox512MB, Firefox prior to v13732MB
|Feature|Server|Browser|
|---|---|---|
|import('./file.js')|✅|✅ (Import Map-friendly)|
|import('bare')|✅|✅ (Import Map-friendly)|
|import('built-in')|✅|N/A|
|require()|✅ with addRequire option|❌|
|import.meta.url|✅ with filePath option|✅ with filePath option|
Notes:
- built-in modules are provided by the JavaScript runtime.
node:fsis one example. barespecifiers are packages referenced by their bare name. In Node this might be a package installed from npm.
Usage
Import the script first!
import { importFromString } from "import-module-string";View the test suite file for more examples.
Export
await importFromString(`export var a = 1;
export const c = 3;
export let b = 2;`);
// Returns
{ a: 1, c: 3, b: 2 }No export
import { importFromString } from "import-module-string";
await importFromString(`var a = 1;
const c = 3;
let b = 2;`);
// Returns
{ a: 1, c: 3, b: 2 }Pass in data
await importFromString("const a = b;", { data: { b: 2 } });
// Returns
{ a: 2 }Pass in filePath
await importFromString("const a = import.meta.url;", { filePath: import.meta.url });
// Returns value for import.meta.url, example shown
{ a: `file:///…` }Imports (experimental feature)
Relative references
// `dependency.js` has the content `export default 2;`
await importFromString("import dep from './dependency.js';");
// Returns
{ dep: 2 }Bare references
Uses import.meta.resolve to resolve paths, which will also resolve using Import Maps (where available).
// maps with `import.meta.resolve("@zachleat/noop"))` in-browser (Import Map friendly)
await importFromString("import {noop} from '@zachleat/noop';");
// Returns
{ noop: function() {} }Builtins
await importFromString("import fs from 'node:fs';");
// Returns (where available: `node:fs` is not typically available in browser)
{ fs: { /* … */ } }As a side note, you can shim fs into the browser with memfs.
Changelog
v2.0.0removesadapter(no longer necessary!)v1.0.5bug fixesv1.0.4addadapteroption (addadapter: "fs"oradapter: "fetch") to resolve imports in various environments.
