vue3+vite實(shí)現(xiàn)低版本瀏覽器兼容的解決方案(出現(xiàn)白屏問(wèn)題)
前言
項(xiàng)目全線(xiàn)使用vue3的時(shí)候,自然使用的是配套更加契合的vite打包工具,于是自然而然會(huì)用到很多新的語(yǔ)法,比如這兩年開(kāi)始普及的可選鏈語(yǔ)法,這個(gè)語(yǔ)法都已經(jīng)納入聲吶的代碼規(guī)范中了,但是vite自身打包的時(shí)候,并不會(huì)做過(guò)多的兼容處理。
默認(rèn)情況vite的兼容目標(biāo)是支持原生ES模塊,原生ESM動(dòng)態(tài)導(dǎo)入和import.meta的瀏覽器,官方預(yù)設(shè)的兼容目標(biāo)如下:
- es2020
- edge 88
- firefox 78
- chrome 87
- safari 14
而我們的可選鏈正是es2020版本才有的,所以vite在打包后不會(huì)做任何兼容處理,這就導(dǎo)致了一些瀏覽器版本低一點(diǎn)的設(shè)備,打開(kāi)網(wǎng)站就會(huì)出現(xiàn)白屏的情況。
顯然這么新的版本在大部分的目標(biāo)用戶(hù)中,也是很超前的,所以做一些適當(dāng)?shù)募嫒萏幚磉€是有必要的。
教程
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
build: { target: "es2015" }
})
通過(guò)指定打包后的目標(biāo)版本就行了,vite會(huì)將新的語(yǔ)法通過(guò)esbuild進(jìn)行轉(zhuǎn)換,此時(shí)我們?cè)?strong>支持esm的瀏覽器上訪(fǎng)問(wèn)時(shí)正常的。(注意只有打包后的代碼才會(huì)有效)
這里我特意大寫(xiě)了 支持ESM的瀏覽器是有用意的,我們看下打包后的index.html文件。

可以看到script標(biāo)簽上使用了type="module"屬性,顯然即便我們的腳本里面已經(jīng)兼容到了es2015,但是如果瀏覽器稍微低一點(diǎn)的版本的,它是支持es2015但是它不支持ESM模塊啊。
我們看一下對(duì)應(yīng)的支持統(tǒng)計(jì):
es2015
es6版本最經(jīng)典的就是proxy的支持

ESM模塊

可以看到和es2015的支持度還是有一些差別的。
那么就進(jìn)入到第二個(gè)問(wèn)題,如何兼容不支持esm的瀏覽器!
兼容ESM瀏覽器
官方提供了一個(gè)插件:legacy
官方對(duì)它的定義是:為打包后的文件提供傳統(tǒng)瀏覽器兼容性支持
其實(shí)就是對(duì)不支持esm的瀏覽器的支持,同時(shí)還有語(yǔ)法降級(jí)處理。
先進(jìn)行安裝:
pnpm i @vitejs/plugin-legacy@4.1.1 terser -D
需要注意的是vite4的legacy插件最高目前是4.1.1,再高的版本只支持vite5了,使用起來(lái)會(huì)報(bào)錯(cuò)。
legacy插件需要依賴(lài)terser對(duì)代碼進(jìn)行壓縮。
使用起來(lái)也很簡(jiǎn)單,我們直接引入插件并啟用即可:
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import legacy from "@vitejs/plugin-legacy";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
legacy()
],
build: {
target: "es2015"
}
})
官方定義,在沒(méi)有明確指定插件配置參數(shù)targets時(shí),他會(huì)去讀取項(xiàng)目中的.browserslistrc文件,我們知道這個(gè)文件是一個(gè)用于配置支持的瀏覽器范圍的文件,通常會(huì)被Babel、Autoprefixer等插件使用。
我個(gè)人根據(jù)es2015的支持版本書(shū)寫(xiě)了一下內(nèi)容:
.browserslistrc
Chrome >= 51 Edge >= 15 Safari >= 10 Firefox >= 54 Opera >= 38 iOS >= 10 not ie <= 11 Android >= 5 not IE <= 11
然后我們?cè)偃ゴ虬?xiàng)目,可以發(fā)現(xiàn)index.html的腳本引入發(fā)生了變化。

可以看到script發(fā)生了變化,除了type="module"還有一個(gè)nomodule腳本,nomodule這個(gè)屬性表示在支持esm的瀏覽器不運(yùn)行里面的代碼,而不支持esm的瀏覽器又無(wú)法識(shí)別type="module",反而會(huì)去運(yùn)行nomodule的script,從而實(shí)現(xiàn)了降級(jí)區(qū)分。
而降級(jí)的腳本都會(huì)攜帶一個(gè)legacy文本

這個(gè)就是用于兼容不支持esm模塊的瀏覽器降級(jí)方案。
這個(gè)方式的好處在較新的瀏覽器中可以使用新的特性,舊的瀏覽器使用legacy降級(jí)腳本,從而避免了以前打包時(shí)一刀切的兼容方式,所有的代碼全部降級(jí)處理,使得一些新設(shè)備沒(méi)法體現(xiàn)出新語(yǔ)法的性能。
以上就是vue3+vite實(shí)現(xiàn)低版本瀏覽器兼容的解決方案(出現(xiàn)白屏問(wèn)題)的詳細(xì)內(nèi)容,更多關(guān)于vue3+vite低版本瀏覽器兼容的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue?element樹(shù)形控件添加虛線(xiàn)詳解
這篇文章主要為大家介紹了Vue?element樹(shù)形控件添加虛線(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>2021-11-11
el-table表格點(diǎn)擊該行任意位置時(shí)也勾選上其前面的復(fù)選框
本文主要介紹了在el-table組件中實(shí)現(xiàn)雙擊表格某一行任意位置自動(dòng)勾選復(fù)選框的功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
Vue.js實(shí)現(xiàn)點(diǎn)擊左右按鈕圖片切換
這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)點(diǎn)擊左右按鈕圖片切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
bootstrap vue.js實(shí)現(xiàn)tab效果
這篇文章主要為大家詳細(xì)介紹了bootstrap vue.js實(shí)現(xiàn)tab效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
從零開(kāi)始實(shí)現(xiàn)Vue簡(jiǎn)單的Toast插件
這篇文章主要給大家介紹了如何從零開(kāi)始實(shí)現(xiàn)Vue簡(jiǎn)單的Toast插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
詳解如何在vue項(xiàng)目中使用eslint+prettier格式化代碼
在開(kāi)發(fā)中我們需要一種能夠統(tǒng)一團(tuán)隊(duì)代碼風(fēng)格的工具,作為強(qiáng)制性的規(guī)范,統(tǒng)一整個(gè)項(xiàng)目的代碼風(fēng)格,這篇文章主要介紹了詳解如何在vue項(xiàng)目中使用eslint+prettier格式化代碼,需要的朋友可以參考下2018-11-11

