【原理揭秘】Vite 是怎么兼容老旧浏览器的?你以为仅仅依靠 Babel?

原理,揭秘,vite,怎么,兼容,浏览器,以为,仅仅,依靠,babel · 浏览次数 : 345

小编点评

**Vite 如何实现兼容低版本浏览器?** Vite 通过以下几种方式实现了兼容低版本浏览器的支持: **1. 使用 @vitejs/plugin-legacy 插件** - 该插件允许开发者使用低版本浏览器支持原生 ES 模块和 SystemJS 模块。 - 开发者可以通过该插件配置,指定浏览器兼容的版本。 - 此插件使用 @babel/preset-env 转换工具,为每个生成的 ESM 模块生成一个 legacy chunk,并使用 @vitejs/plugin-vue 和 @vitejs/plugin-legacy 的其他功能来生成兼容低版本的 polyfill。 **2. 使用 @vitejs/plugin-legacy 插件的 legacy 模式** - 该模式允许开发者在使用 legacy 模式时使用浏览器原生的模块化能力。 - 开发者可以通过配置 `include.polyfills` 和 `exclude.polyfills` 属性来指定要加载的 polyfill文件。 **3. 使用 polyfill 包** - polyfill 包包含对 ES 模块的兼容代码。 - 开发者可以在 `rollup.config.js` 中指定要加载的 polyfill 包。

正文

作者:京东科技 孙凯

一、前言

对前端开发者来说,Vite 应该不算陌生了,它是一款基于 nobundle 和 bundleless 思想诞生的前端开发与构建工具,官网对它的概括和期待只有一句话:“下一代的前端工具链”。

Vite 最早的版本由尤雨溪发布于3年前,经历了3年多的发展,Vite 也已逐渐迭代成熟,它的稳定性、扩展性、周边生态足以在生产环境中支撑各种业务场景的落地。但是关于Vite的优劣势分析我们就戛然而止,不在深入展开了,这不是本文的重点。

本文的重点在于探究 Vite 如何实现兼容低版本浏览器,这一切还得从那个阳光明媚的午后说起🤔。

二、那个午后

本着尝鲜的态度,我在某一个项目中用了 Vite,当时还是3.x.x的版本,跟着文档配置,从项目启动到项目构建,一路都很“德芙”(纵享丝滑),在经历了 Vite 带来的短暂新鲜感后,就一直沉浸在业务模块的开发中了,因为在 Vite 刚发布后的那段时间曾看过相关原理解析,是基于浏览器原生的模块化能力按需构建BALABALA等,所以后来 Vite 的这种新鲜感对我而言并没有保持多久。

但直到有天下午我开始打包提测,审查页面元素后发现构建产物居然跟以往 webpack 的产物竟然有点不一样,在好奇心的驱使下,于是我开始尝试解谜。

三、跟webpack构建产物到底哪里不一样?

1. 准备工作

为了能更好的对比两者产物究竟有什么区别,我们首先要确保我们的业务代码基本一致,不一致的地方仅仅是使用不同工具( vite 和 webpack)进行构建,这样才能排除最大干扰因素。

于是我们分别使用最新版的 Vite 和 webpack 初始化了两个页面,为了做作区分,两个页面的仅标题和标题背景不一致,他们在浏览器中渲染后的分别长这个样子:

2. 构建工具版本说明

• Vite:v4.1.4

• webpack:v5.75.0

3. 构建工具配置项说明

• Vite (非常简单,啥也没有)

// vite.config.js
import { defineConfig } from 'vite'
import legacy from '@vitejs/plugin-legacy'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
    plugins: [
        vue(),
        legacy({
            targets: ['ios >= 9', 'android >= 4.2', '> 1%']
        })
    ],
    server: {
        host: '127.0.0.1'
    },
    build: {
        minify: false
    }
})



• webpack(太多了,也比较常规,就不在这里贴出来全部配置项了,仅在这里配置好跟 Vite 一样的需要兼容到最低的浏览器版本)

// .browserslistrc
ios >= 9
android >= 4.2
> 1%

至此,准备工作完毕,让我们看看两者的构建产物吧。

4. 构建产物

从产物的命名中,我们就能多少看出些许区别,webpack的产物比较简单,中规中矩,而 Vite 的 JS 文件不但比 webpack 多,而且部分文件命名中还多了一个单词:legacy,百度翻译对它的解释是:遗产;遗赠财物;遗留;后遗症;(计算机系统或产品)已停产的,通过翻译,或许你可以猜出来,名字中带 legacy 的文件大概率就是浏览器的兼容文件,那么事实到底是不是这样呢?

如果你足够细心,其实你应该可以从上面 Vite 的配置项代码中嗅到一丝端倪,在 Vite 的配置文件中,有一个名为 @vitejs/plugin-legacy 的插件,它的名字也包含 legacy,Vite 官网中对这个插件的解释是这样的:

传统浏览器可以通过插件 @vitejs/plugin-legacy 来支持,它将自动生成传统版本的 chunk 及与其相对应 ES 语言特性方面的 polyfill。兼容版的 chunk 只会在不支持原生 ESM 的浏览器中进行按需加载。

也就是说,这个插件它不但提供了低版本浏览器的兼容能力,还提供了检测是否支持原生 ESM 的能力。那么这个插件都做了哪些事?

主要是以下三点:

  1. 为最每个生成的 ESM 模块化方式的 chunk 也对应生成一个 legacy chunk,同时使用 @babel/preset-env 转换(没错,Vite 的内部集成了 Babel),生成一个 SystemJS 模块,关于 SystemJS 可以看点击这里查看,它在浏览器中实现了模块化,用来加载有依赖关系的各个 chunk。

  2. 生成 polyfill 包,包含 SystemJS 的运行时,同时包含由要兼容的目标浏览器版本和代码中的高级语法产生的 polyfill。

  3. 生成

与【原理揭秘】Vite 是怎么兼容老旧浏览器的?你以为仅仅依靠 Babel?相似的内容:

【原理揭秘】Vite 是怎么兼容老旧浏览器的?你以为仅仅依靠 Babel?

本文的重点在于探究 Vite 如何实现兼容低版本浏览器

表格集算表高性能原理:揭秘纯前端百万行数据秒级响应的魔法

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 集算表 (Table Sheet)是一个具备高性能渲染、数据绑定功能、公式计算能力的数据表格,通过全新构建的关系型数据管理器结合结构化公式,在高性能表格的基础上提供排序、筛选、样式、行列冻结、自

逻辑漏洞挖掘之XSS漏洞原理分析及实战演练

本系列文章旨在揭秘逻辑漏洞的范围、原理及预防措施,逐步提升大家的安全意识。作为开篇第一章,本文选取了广为熟知的XSS逻辑漏洞进行介绍。

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理

本文将深入揭示TCP/IP滑动窗口的工作原理,探讨其在确保数据准确性和实现高效通信方面的重要性。

揭秘Karmada百倍集群规模多云基础设施体系

摘要:本文结合Karmada社区对大规模场景的思考,揭示Karmada稳定支持100个大规模集群、管理超过50万个节点和200万个Pod背后的原理 本文分享自华为云社区《Karmada百倍集群规模多云基础设施体系揭秘》,作者: 云容器大未来 。 随着云原生技术在越来越多的企业和组织中的大规模落地,如

图解算法,原理逐步揭开「GitHub 热点速览」

想必每个面过大厂的小伙伴都被考过算法,那么有没有更快了解算法的方式呢?这是一个老项目,hello-algo 用图解的方式让你了解运行原理。此外,SQL 闯关自学项目也是一个让你能好好掌握 SQL 技术的仓库。说回到面试,这个一周获得近 10k star 的 devops-exercises 定能让你好好刷一场面经。

[转帖]揭密Java常用性能调优工具的底层实现原理

https://zhuanlan.zhihu.com/p/547081135 本文来自于社区专家鸠摩【《深入剖析Java虚拟机:源码剖析与实例详解》作者】的独家干货,更多文章可去专家主页:鸠摩主页 | HeapDump性能社区 正文: 当Java虚拟机出现故障和性能问题时,我们通常会借助一些业界知名

揭秘报表新玩法!标配插件不再单调,如何用柱形图插件让你的报表瞬间高大上!

> 摘要:本文由葡萄城技术团队于博客园原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 # 前言 图表作为一款用于可视化数据的工具,可以帮助我们更好的分析和理解数据,并发现数据之间的关系和趋势。下面以柱形图为例介绍如何使用JavaScript在报表中引入图表。 本文使用软件

详解TCP网络协议栈的工作原理

深入探索Linux TCP网络协议栈的内部机制,揭开其背后的神秘面纱。

prometheus描点原理

> 大家好,我是蓝胖子,关于prometheus的入门教程有很多,拿我之前学prometheus的经历来讲,看了很多教程,还是会对prometheus的描点以及背后的统计原理感到迷惑,所以今天我们就来分析下这部分,来揭开其神秘的面纱。 我们先来看看prometheus里的数据模型是怎么样的,只有知道