百科狗-知识改变命运!
--

vite + vue3 + ts 安装 @vitejs/plugin-legacy 兼容旧版浏览器 - vue3 项目实战

乐乐1年前 (2023-11-21)阅读数 55#技术干货
文章标签浏览器

vite + vue3 + ts 安装 @vitejs/plugin-legacy 兼容旧版浏览器

安装浏览器兼容插件@vitejs/plugin-legacy:

npm install @vitejs/plugin-legacy -D

必须安装Terser压缩器,因为插件Legacy,使用Terser进行压缩。

npm install terser -D

打开vite.config.ts,配置插件。

import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import legacy from "@vitejs/plugin-legacy";

import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import Icons from "unplugin-icons/vite";
import IconsResolver from "unplugin-icons/resolver";

import path from "path";
const pathSrc = path.resolve(__dirname, "src"); export default defineConfig({
  plugins: [
    vue(),
    legacy({
      targets: ["defaults", "not IE 11"],
    }),
    AutoImport({
      resolvers: [
        ElementPlusResolver(),
        IconsResolver({
          prefix: "Icon",
        }),
      ],
      dts: path.resolve(pathSrc, "auto-imports.d.ts"),
    }),
    Components({
      resolvers: [
        ElementPlusResolver(),
        IconsResolver({
          enabledCollections: ["ep"],
        }),
      ],
      dts: path.resolve(pathSrc, "components.d.ts"),
    }),
    Icons({
      autoInstall: true,
    }),
  ], build: { target: "modules", // 默认 "modules" }, resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
});

build.target选项是构建生产环境下代码的设置,此值应该与兼容legacy.target兼容。

vite + vue3 + ts 安装 @vitejs/plugin-legacy 兼容旧版浏览器 - vue3 项目实战


build.target

  • 类型:string|string[]
  • 默认:modules
  • 作用:浏览器兼容性
build.target 取值范围
modules设置最终构建的浏览器兼容目标。默认值是一个 Vite 特有的值:modules,这是指支持原生 ES 模块的浏览器。
esnext自 es2015 以后,所有 es 的版本,2022年6月将要发布的标准。即假设有原生动态导入支持,并且将会转译得尽可能小:如果 build.minify 选项为terser,esnext将会强制降级为es2019。其他情况下将完全不会执行转译。
自定义版本自定义目标也可以是一个 ES 版本(例如:es2015)、一个浏览器版本(例如:chrome58)或是多个目标组成的一个数组。最低:es2015

转换过程将会由 esbuild 执行,并且此值应该是一个合法的 esbuild 目标选项。注意:如果代码包含不能被 esbuild 安全地编译的特性,那么构建将会失败。


build.minify

  • 类型:boolean|terser|esbuild
  • 默认:esbuild

设置为false可以禁用最小化压缩,或是用来指定使用哪种压缩器。默认为esbuild,它比terser快 20-40 倍,压缩率只差 1%-2%。

注意,在 lib 模式下使用'es'时,build.minify 选项将失效。

当设置为terser时,必须先安装Terser。



ECMAScript 2015

ECMAScript 2015(又称为 es6),在 2015 年发布,有重大意义的里程碑。发展到现在的版本:es2015、es2016、es2017、es2018、es2019、es2020。对于浏览器实现支持ES6+ JavaScript 语法的浏览器,被称呼为现代浏览器。不支持的,称呼为传统旧版浏览器。

es6 支持状况


  • chrome 51+,全部支持。2016 年开始支持。
  • Safari 10+,全部支持。2016 年开始支持。
  • Opera 38+,全部支持。2016 年开始支持。
  • firefox 54+,全部支持。2017 年开始支持。
  • ie 6 ~ 10,都不支持。ie 11 支持部分语法。
  • edage 15+,全部支持。2017 年开始支持。
  • QQ Browser 10.4+,全部支持。2020 年开始支持。
  • Android Browser 5+,全部支持。它是 2015 年开始支持。
  • Safari on iOS 10+,全部支持。它是 2016 年开始支持。

ES6+ JavaScript 语法的支持率,在移动端,支持广泛,在 pc 端,略逊色。


浏览器内核

浏览器内核(Rendering Engine),是指浏览器最核心的部分,负责对网页语法的解释(对HTML、XML、图像、JavaScript、CSS 等等)并渲染(显示)网页。所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果的原因。

Webkit苹果公司研发内核,也是苹果的 Safari 浏览器使用的内核。Webkit 开放源代码。
Chromium谷歌 Google 公司开发主导。Chromium 内核是基于开源 webkit 内核,是 Webkit 内核的分支之一。Chromium 开放源代码。2020 年之前 Chrome 浏览器,采用此内核,2020 年之后,Edge 浏览器,采用 Chromium 内核。而谷歌 Chrome 浏览器改用 Blink 内核。
Blink由 Google 和 Opera Software 开发,在 Webkit 的基础上演变而来,应用于 Chromium 项目上,是 Webkit 内核的分支之一。现在 Chrome 浏览器、Opera 浏览器,都使用Blink内核
Trident微软 IE 浏览器内核,并沿用到 IE11。Trident 实际上是一款开放的内核,有许多采用 IE 内核而非IE的浏览器(壳浏览器)涌现。
GeckoMozilla 基金会的火狐浏览器 Mozilla Firefox 内核。
Presto欧朋 Opera 浏览器内核。现在已废弃。Opera 浏览器改用 Blink 内核。



vite 运行需要浏览器基准

使用 vite 构建 vue3 项目,其构建的生产环境,需要目标浏览器支持现代 JavaScript 语法:原生 ES 模块(es2015)、原生 ESM 动态导入(es2020)以及import.meta(es2020)。即浏览器需要支持type="module" script 标签、export导出、import静态导入、import()动态导入、import.meta元属性。

浏览器版本要求:

  • Chrome >=87
  • Firefox >=78
  • Safari >=13
  • Edge >=88

若构建的项目,绝大部分客户能满足上述要求,只有非常很少部分用户不能满足条件,那么需要@vitejs/plugin-legacy插件来做兼容,它会自动生成兼容性(legacy)chunk 以及相应的 ES 语言功能的polyfill。


支持原生 ESM script 标签


支持原生 ESM 动态导入 import()


import.meta 元属性



vite 使用create-vite搭建的项目:

  • vue、vue-ts
  • react、react-ts
  • vanilla、vanilla-ts
  • preact、preact-ts
  • lit、lit-ts
  • svelte、svelte-ts


vue3 兼容性

vue2 项目,浏览器兼容,最低 ie8,vue3项目,不兼任何版本 ie。vite + vue3 搭建的项目,除去上面要求的 vite 现代浏览器标准之外,vue3 要求浏览器必须支持Proxy。Element Plus 也放弃了对 ie 支持,并且要求浏览器支持ES2018和ResizeObserver。

Proxy 兼容性



移动 APP 应用中,vue3 支持率

IOS:9.3 是 2016 年发布,现在市场上 10.0 以上;安卓 5.0 是 2015 年发布的,现在市场上也都在 5.0 以上。所以客户端对 vue3,支持率约 99%,不支持约 1%。对于不支持的,使用@vitejs/plugin-legacy做兼容性处理。


ESM 模块化

历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。开发社区制定了一些模块加载方案:用于服务器nodejs环境,有CommonJS;用于浏览器环境,有AMD等。

SystemJS诞生于 2015 年,那个时候 ES Module 还未成为标准,在浏览器端只能通过 requirejs、seajs 等方案实现模块加载,随着 npm 在前端界的流行,一个项目中可能存在多种模块规范,所以我认为 SystemJS 最初诞生的目的是为了做一个通用的模块加载器,在浏览器端实现对 CommonJS、AMD、UMD 等各种模块的加载。后来,随着 ES6 的普及,越来越多的浏览器开始支持 ES Module,SystemJS 能够跑在旧版本的浏览器当中。


es2015(ES6)增加了模块化的功能(ESM),支持 nodejs 环境和浏览器环境。ESM(模块功能):

  • export:用于规定模块的对外接口。
  • import:用于输入其他模块提供的功能。
  • module:用于浏览器加载。在 HTML 中加载使用传统的 JavaScript 脚本,加载ES6模块,就得在 script 标签上增加type="module"属性



@vitejs/plugin-legacy

在不支持ESM模块化的旧版浏览器中,vite 官方插件@vitejs/plugin-legacy来实现。默认情况下,其所做的事:

  • legacy chunk:使用@babel/preset-env,把开发项目中,用es6+语法书写的代码,转变为相应es5语法的兼容性代码(legacy chunk),仍然支持代码拆分。使之能在SystemJS模块化功能下,运行。兼容版的legacy chunk只会在不支持原生 ESM 的浏览器中进行按需加载。
  • polyfill chunk:生成polyfill代码块。运行于目标浏览器,所需要polyfill;以及 SystemJS 运行时,所需polyfill。polyfill:术语。一块代码(通常是 Web 上的 JavaScript),用来为旧浏览器提供它没有原生支持的较新的功能。是针对目标浏览器而实现的模拟环境代码。
  • script nomodule:将标记,注入生成的 HTML 中,以便仅在不支持原生 ESM 的浏览器中,有条件地加载polyfill chunk和legacy chunk。
  • import.meta.env.LEGACY:注入import.meta.env.LEGACYenv变量,在旧版生产版本中,其值为true,在所有其他情况下,其值为false。


  • @vitejs/plugin-legacy
  • @babel/preset-env
  • SystemJS
  • Polyfill.io
  • 什么是 polyfill


那些版本较低的浏览器不支持 ES6+的语法和新 API,而@babel/preset-env只转换新的 JavaScript 句法,不转换新的 API,比如 Proxy、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法都不会转码。


配置选项

targets

设置目标浏览器兼容的范围。

  • 类型:string|string[]|{[key: string]: string}
  • 默认值:defaults

如果显式设置,则将其传递给@babel/preset-env。该选项与Browserslist 兼容。默认值:defaults,是 Browserslist 推荐的值。


Browserslist 在不同前端工具之间共享目标浏览器和 Node.js 版本的配置(不区分大小写)。
defaultsBrowserslist 的默认浏览器(> 0.5%,last 2 versions,Firefox ESR,not dead)。
dead没有官方支持或更新的浏览器 24 个月。现在它是IE 11, IE_Mob 11, BlackBerry 10, BlackBerry 7, Samsung 4 和 OperaMobile 12.1,所有版本的 Baidu 浏览器。
not ie 5%:全球使用统计选择的浏览器版本。还可以使用>= 5% in alt-AS:使用亚洲地区的使用统计。所有地区代码的列表,可以在caniuse-lite/data/regions中找到。
  • > 5% in my stats:使用自定义使用数据。
  • > 5% in browserslist-config-mycompany stats:使用来自 browserslist-config-mycompany/browserslist-stats.json 自定义数据。
  • cover 99.5%:提供覆盖范围的最流行的浏览器。
  • cover 99.5% in US:同上,两个字母的国家代码。
  • cover 99.5% in my stats:使用自定义数据。
  • 最新版本
    • last 2 versions:每个浏览器的最后 2 个版本。
    • last 2 Chrome versions: Chrome 浏览器的最后 2 个版本。
    • last 2 major versions或last 2 iOS major versions:最近 2 个主要版本的所有次要/补丁版本。
    浏览器版本
    • iOS 7:直接iOS浏览器版本7。
    • Firefox > 20: Firefox 20 之后的版本。还可以使用>=

    鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

    免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

    图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)