问题:vue3+vite 开发移动端应用,上线后现场反馈安卓8.0下进入页面白屏

分析:原因就是因为语法兼容问题。根据vite官方文档描述,build.target默认支持 Chrome >=87、Firefox >=78、Safari >=14、Edge >=88 传送,所以需要我们手动兼容低版本。

处理方案:

增加打包兼容代码

vite.config.js下增加

 1build: {
 2  target: ['ios11', 'Chrome 64', 'edge90', 'firefox90', 'safari15']
 3}

打包运行发现依然白屏。

请注意,默认情况下 Vite 只处理语法转译,且 默认不包含任何 polyfill。 传统浏览器可以通过插件 @vitejs/plugin-legacy 来支持,它将自动生成传统版本的 chunk 及与其相对应 ES 语言特性方面的 polyfill。兼容版的 chunk 只会在不支持原生 ESM 的浏览器中进行按需加载。

 1yarn add @vitejs/plugin-legacy rollup-plugin-esbuild

vite.config.js 下增加

 1import legacy from '@vitejs/plugin-legacy'import esbuild from 'rollup-plugin-esbuild'
 2
 3{
 4  plugins: [
 5    esbuild({    
 6      target: 'chrome64',
 7      loaders: {    
 8        '.vue': 'js',   
 9        '.ts': 'js'   
10      }   
11    }), 
12    legacy({  
13      targets: ['Chrome 64'],  
14      additionalLegacyPolyfills: ['regenerator-runtime/runtime'],  
15      modernPolyfills: true 
16    }) 
17  ],
18}

打包运行发现在系统浏览器下可以正常显示,但是在 特定宿主 App下依然白屏

前端代码引入

 1vconsole.min.js

发现在报错原因

 1globalthis is not defined.

解决方案:

方案一:

如果你在浏览器环境中使用 globalThis 时遇到了 “globalThis is not defined” 的错误,可能是因为你的浏览器版本不支持 globalThis。 globalThis 是一个全局变量,它在所有环境中都是可用的,包括浏览器和 Node.js。但是,如果你使用的是旧版本的浏览器(如 IE11),则可能会导致 globalThis 未定义。

解决方法: 你可以使用 polyfill 来解决这个问题。一个常用的 polyfill 是 globalthis 包,你可以使用以下命令安装它:

 1yarn add globalthis
 2
 3import 'globalthis/auto'

这个 polyfill 会自动检测环境是否支持 globalThis,如果不支持,则会创建一个全局变量 globalThis。 注意,使用 polyfill 可能会增加应用程序的体积,因此建议仅在必要时使用。如果你只需要在现代浏览器中运行应用程序,则可以直接使用 globalThis,因为现代浏览器已经支持它了。

方案二:

在 html head里面增加

 1<script>   this.globalThis || (this.globalThis = this)  </script>

再次打包运行,完美解决问题。

个人笔记记录 2021 ~ 2025