vitejs/plugin-legacy 作用与使用方法

文章目录

      • 一、核心作用
      • 二、快速使用步骤
        • [1. 安装依赖](#1. 安装依赖)
        • [2. 配置 vite.config.js](#2. 配置 vite.config.js)
        • [3. 常用配置项说明](#3. 常用配置项说明)
        • [4. 构建与效果](#4. 构建与效果)
      • 三、常见场景示例
        • [兼容 IE11](#兼容 IE11)
        • [只兼容现代浏览器(排除 IE)](#只兼容现代浏览器(排除 IE))
        • [自定义 Polyfill](#自定义 Polyfill)
      • 四、注意事项

@vitejs/plugin-legacy 是 Vite 官方提供的旧版浏览器兼容插件,核心作用是让你用现代 ES 语法开发,同时自动生成兼容 IE11、旧版 Chrome/Safari 等不支持原生 ESM 的浏览器的代码包。

一、核心作用

Vite 默认只支持原生 ESM、动态 import、import.meta 的现代浏览器。启用该插件后,生产构建时会自动:

  1. 双包构建 :为每个 chunk 生成两套代码
    • 现代包:原生 ESM,给新浏览器用(<script type="module">
    • 旧版包:用 @babel/preset-env 转译 + SystemJS 模块,给老浏览器用
  2. 自动 Polyfill :根据目标浏览器和代码实际使用,自动注入 core-jsregenerator-runtime、SystemJS 运行时
  3. 条件加载 :在 HTML 注入 <script nomodule>,老浏览器只加载旧版包 + polyfill,新浏览器只加载现代包
  4. 环境变量 :注入 import.meta.env.LEGACY,旧版包中为 true,可做分支逻辑

二、快速使用步骤

1. 安装依赖
bash 复制代码
# 安装插件与必要依赖
npm add -D @vitejs/plugin-legacy terser
# 或 yarn/pnpm
yarn add -D @vitejs/plugin-legacy terser
pnpm add -D @vitejs/plugin-legacy terser

必须装 terser,插件依赖它做代码压缩

2. 配置 vite.config.js
js 复制代码
import { defineConfig } from 'vite'
import legacy from '@vitejs/plugin-legacy'

export default defineConfig({
  plugins: [
    legacy({
      // 目标浏览器(browserslist 格式)
      targets: ['defaults', 'not IE 11'],
      // 额外 polyfill(可选)
      additionalLegacyPolyfills: ['regenerator-runtime/runtime'],
      // 是否生成 SystemJS 运行时(默认 true)
      renderLegacyChunks: true,
      // 现代包是否也做 polyfill(默认 false)
      modernPolyfills: false,
    }),
  ],
})
3. 常用配置项说明
配置项 类型 默认值 说明
targets string[] ['defaults'] 兼容目标,browserslist 语法
additionalLegacyPolyfills string[] [] 额外注入的 polyfill
modernPolyfills boolean false 现代包是否也加 polyfill
renderLegacyChunks boolean true 是否生成旧版包
polyfills boolean/string[] true 自定义 polyfill 列表
4. 构建与效果

执行 vite build,产物会包含:

  • 现代包:index-xxx.js<script type="module">
  • 旧版包:index-legacy-xxx.js<script nomodule>
  • Polyfill 包:polyfills-legacy-xxx.js

HTML 中自动插入:

html 复制代码
<!-- 现代浏览器 -->
<script type="module" src="/assets/index-xxx.js"></script>
<!-- 旧版浏览器 -->
<script nomodule src="/assets/polyfills-legacy-xxx.js"></script>
<script nomodule src="/assets/index-legacy-xxx.js"></script>

三、常见场景示例

兼容 IE11
js 复制代码
legacy({
  targets: ['ie >= 11', 'last 2 versions', '> 1%'],
  additionalLegacyPolyfills: ['regenerator-runtime/runtime'],
})
只兼容现代浏览器(排除 IE)
js 复制代码
legacy({
  targets: ['defaults', 'not IE 11', 'not IE < 11'],
})
自定义 Polyfill
js 复制代码
legacy({
  targets: ['chrome 58', 'ios 11'],
  // 只加指定 polyfill
  polyfills: ['es.promise.finally', 'es.array.flat'],
})

四、注意事项

  1. 只在生产构建生效 :开发模式(vite dev)不生成旧版包
  2. 体积增加:旧版包 + polyfill 会增大产物,按需开启
  3. 动态 import:旧版包用 SystemJS 实现代码分割,现代包用原生 ESM
  4. 环境变量import.meta.env.LEGACY 仅在旧版包中为 true,可用于分支逻辑
相关推荐
Anesthesia丶3 天前
Vite + Svelte + shadcn-svelte 最小化 Demo+Vue3语法对比总结
vue·vite·svelte·shadcn-svelte
曲幽8 天前
写页面时别再把 Element Plus 整个搬进来啦!Vue3按需加载的坑我帮你踩平了
vue3·web·vite·icon·element plus·vs code·import·unplugin
Linsk11 天前
一个案例教你彻底搞明白`AbortController` 、`AbortSignal`
vite·前端工程化
ZengLiangYi11 天前
Tailwind CSS v4 + Vite:现代前端样式方案
前端·css·vite
发现一只大呆瓜12 天前
超全 Vite 性能优化指南:网络、资源、预渲染三维落地方案
前端·面试·vite
发现一只大呆瓜12 天前
Vite 兼容降级全解:语法降级、Polyfill 原理与 legacy 插件底层机制
前端·面试·vite
发现一只大呆瓜13 天前
Vite 开发预构建机制详解,搞懂 esbuild 与 Rollup 分工差异
前端·面试·vite
__zRainy__14 天前
uni-app 全局容器实战系列(一):全局容器的实现
uni-app·vite
发现一只大呆瓜14 天前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Hello--_--World15 天前
利用CDN进行首屏优化。能不能看CDN与本地服务器谁快用谁?
运维·服务器·前端·javascript·vite