格式为'es'时如何处理全局?

How to handle global when format is 'es'?

我已将 Javascript 库(增量-dom)确定为全局库和外部库。我正在脚本标签中加载库。

当汇总格式为 'iife' 时,将库注入到 iife 中,一切正常。

然而,当我使用 'es' 格式时,全局变量从未被引用并且浏览器抛出类型错误:

Uncaught TypeError: Failed to resolve module specifier 'incremental-dom'

这是我的 rollup.config.js 文件:

const path = require('path');
const root = process.cwd();
const string = require('rollup-plugin-string');
const superviews = require('rollup-plugin-superviews');

export default [
  {
    input: path.resolve(root, 'src', 'idx-admin-tab', 'component.js'),
    plugins: [
      superviews({include: 'src/**/*.html'}),
      string({include: ['src/**/*.css', 'src/**/*.svg']})
    ],
    globals: {'incremental-dom': 'IncrementalDOM'},
    external: ['incremental-dom'],
    output: {
      file: path.resolve(root, 'dist', 'idx-admin-tab.es.js'),
      format: 'es'
    }
  }
];

globals 仅适用于 iifeumd 输出的上下文 — 如果您正在创建 es 包,它将被忽略。

如果您只想使用浏览器的本机 import 支持,则必须将模块说明符 incremental-dom 转换为浏览器可以解析的说明符 — 如下所示:

export default [
  {
    // ...
    external: ['incremental-dom'],
    paths: {
      'incremental-dom': '/node_modules/incremental-dom/dist/incremental-dom.js'
    },
    // ...
  }
];

不幸的是,incremental-dom 没有 ESM 构建,所以你不能 import 它。所以如果你不想捆绑它,即使在 es 模式下,你也必须欺骗 Rollup 使用全局 IncrementalDOM

你应该可以用 rollup-plugin-virtual:

export default [
  {
    // ...
    plugins: [
      superviews({include: 'src/**/*.html'}),
      string({include: ['src/**/*.css', 'src/**/*.svg']}),
      virtual({
        'incremental-dom': 'export default window.IncrementalDOM'
      })
    ],
    // ...
  }
];