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,可用于分支逻辑
相关推荐
Sheldon一蓑烟雨任平生6 小时前
Vite 深度剖析(四)
性能优化·vite·图片压缩·gzip压缩·代码压缩·摇树·dns-prefetch
Sheldon一蓑烟雨任平生14 小时前
Vite 深度剖析(二)
vite·静态资源处理·hmr·css工程化处理·模块热替换·vite 插件
Sheldon一蓑烟雨任平生15 小时前
Vite 深度剖析(一)
vue·react·vite·环境变量·esbuild·vite.config.ts·依赖预构建
walking9572 天前
Vite 打包优化终极指南:从 30MB 到 800KB 的性能飞跃
前端·vue.js·vite
whyfail3 天前
CVE-2026-39363-Vite开发服务器安全漏洞深度分析
安全·vite
江上清风山间明月3 天前
Vite现代化的前端构建工具详解
前端·webpack·nodejs·vite
发现一只大呆瓜6 天前
深入浅出 Tree Shaking:Rollup 是如何“摇”掉死代码的?
前端·性能优化·vite
发现一只大呆瓜6 天前
深度起底 Vite:从打包流程到插件钩子执行时序的全链路解析
前端·vite
发现一只大呆瓜7 天前
深度解密 Rollup 插件开发:核心钩子函数全生命周期图鉴
前端·vite
发现一只大呆瓜7 天前
深度解析 Rollup 配置与 Vite 生产构建流程
前端·vite