插件窝 干货文章 Vite构建UMD库后,如何避免全局污染直接在HTML中调用导出方法?

Vite构建UMD库后,如何避免全局污染直接在HTML中调用导出方法?

导出 HTML 全局 使用 86    来源:    2025-03-20

在使用 Vite 构建 UMD 库时,默认情况下,UMD 模块会将导出的内容挂载到全局对象(如 window)上,这可能会导致全局命名空间的污染。为了避免全局污染,你可以通过以下方式在 HTML 中直接调用导出的方法:

1. 使用 librarylibraryTarget 配置

在 Vite 配置中,你可以通过 build.lib 选项来指定库的名称和导出方式。通过设置 librarylibraryTarget,你可以控制库的导出行为。

// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    lib: {
      entry: './src/main.js', // 你的入口文件
      name: 'MyLibrary', // 库的全局变量名
      formats: ['umd'], // 输出格式为 UMD
      fileName: 'my-library', // 输出的文件名
    },
  },
});

2. 使用 IIFE 包裹

为了避免全局污染,你可以将 UMD 模块包裹在一个立即调用的函数表达式(IIFE)中。这样,库的导出内容不会直接暴露在全局对象上。

// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    lib: {
      entry: './src/main.js',
      name: 'MyLibrary',
      formats: ['umd'],
      fileName: 'my-library',
    },
    rollupOptions: {
      output: {
        // 使用 IIFE 包裹 UMD 模块
        intro: '(function() {',
        outro: '})();',
      },
    },
  },
});

3. 在 HTML 中调用导出方法

在 HTML 中,你可以通过 script 标签引入构建后的 UMD 文件,并通过库的名称来调用导出的方法。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vite UMD Library</title>
</head>
<body>
  <script src="dist/my-library.umd.js"></script>
  <script>
    // 调用导出的方法
    MyLibrary.myExportedFunction();
  </script>
</body>
</html>

4. 使用 exportimport 语法

如果你希望在 HTML 中使用 ES 模块的方式导入库,可以将库构建为 ES 模块格式,并在 HTML 中使用 type="module"script 标签。

// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    lib: {
      entry: './src/main.js',
      name: 'MyLibrary',
      formats: ['es'], // 输出格式为 ES 模块
      fileName: 'my-library',
    },
  },
});

然后在 HTML 中使用 ES 模块的方式导入:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vite ES Module Library</title>
</head>
<body>
  <script type="module">
    import { myExportedFunction } from './dist/my-library.es.js';
    myExportedFunction();
  </script>
</body>
</html>

总结

通过以上方法,你可以避免 UMD 库在全局命名空间中的污染,并在 HTML 中直接调用导出的方法。如果你希望进一步减少全局污染,可以考虑使用 ES 模块格式,并在 HTML 中使用 type="module"script 标签。