How import.meta Works in Browser JavaScript

The import.meta object is a native ES module feature in JavaScript that exposes context-specific metadata to the executing script. In browser environments, it acts as an extensible, host-populated object providing vital information about the module itself, such as its exact URL and mechanisms to resolve relative paths. This allows modules to access runtime details without relying on global variables or external configuration.

The Mechanics of import.meta

When a browser encounters a script declared with type="module", it instantiates an ES module context. The JavaScript engine creates an import.meta object unique to that specific module.

Because import.meta is evaluated at runtime per module, different module files within the same application will each have distinct import.meta instances containing values relevant only to their own file locations.

Key Browser Properties

1. import.meta.url

The primary standard property available in browsers is import.meta.url. It contains the absolute URL from which the current module script was fetched.

// Inside https://example.com/js/utils.js
console.log(import.meta.url); 
// Output: "https://example.com/js/utils.js"

This property solves the long-standing issue of loading assets relative to the JavaScript file rather than the HTML document’s base URL.

// Resolving an image relative to the current module
const iconUrl = new URL('./icons/settings.svg', import.meta.url).href;

const image = new Image();
image.src = iconUrl;
document.body.appendChild(image);

2. import.meta.resolve()

Modern browsers support import.meta.resolve(), a built-in method that resolves a module specifier relative to the current module, returning the absolute URL as a string.

const workerUrl = import.meta.resolve('./worker.js');
const worker = new Worker(workerUrl, { type: 'module' });

This method automatically accounts for configured Import Maps, ensuring that bare module specifiers are correctly resolved to their mapped endpoints.

Primary Use Cases

Scope and Restrictions

The import.meta syntax is strictly valid within ES modules. Attempting to use import.meta inside a classic script (one loaded without type="module") or inside a standard eval() call will result in a syntax error during parsing.