Skip to content

非 ESM 输出格式

Rolldown 支持非 ESM 输出格式。ESM 中的一些特性在非 ESM 格式中不受支持,Rolldown 会为这些特性发出消息或提供 polyfill。

顶层 Await

顶层 await 在非 ESM 格式中不受支持。当输出格式不是 ESM 时,如果 Rolldown 遇到顶层 await,会输出错误。

import.meta

import.meta 在非 ESM 格式中是语法错误。为避免这种情况发生,Rolldown 会用其他值替换 import.meta

已知的 import.meta 属性

Rolldown 支持以下已知的 import.meta 属性:

  • import.meta.url
  • import.meta.dirname
  • import.meta.filename

这些属性在输出格式为 CJS 时会进行 polyfill。在其他格式中,其处理方式与其他属性相同。

在 IIFE 和 UMD 中为 import.meta.url 提供 polyfill

Rollup 支持在 IIFE 和 UMD 格式中为 import.meta.url 提供 polyfill。但是,Rolldown 不支持此功能。如果你需要为其提供 polyfill,可以使用以下配置:

ts
import { defineConfig } from 'rolldown';

const importMetaUrlPolyfillVariableName = '__import_meta_url__';

export default defineConfig({
  transform: {
    define: {
      'import.meta.url': importMetaUrlPolyfillVariableName,
    },
  },
  output: {
    format: 'iife',
    intro:
      "var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;" +
      `var ${importMetaUrlPolyfillVariableName} = (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('main.js', document.baseURI).href)`,
  },
});
ts
import { defineConfig } from 'rolldown';

const importMetaUrlPolyfillVariableName = '__import_meta_url__';

export default defineConfig({
  transform: {
    define: {
      'import.meta.url': importMetaUrlPolyfillVariableName,
    },
  },
  output: {
    format: 'umd',
    intro:
      "var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;" +
      `var ${importMetaUrlPolyfillVariableName} = (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('main.js', document.baseURI).href))`,
  },
});

其他属性以及 import.meta 对象本身

其他属性以及 import.meta 对象本身会被替换为 {}。由于这不会保留原始值,Rolldown 在这种情况下会发出警告。