当前位置:   article > 正文

vite如何兼容低版本浏览器_vite legacy

vite legacy

一、问题

在使用vue3.2和vite2.0+开发一个移动端H5,测试时发现很多低版本的安卓手机浏览器出现白屏的现象,而ios机型基本上是好的,原因是很多低版本浏览器并不支持原生ESM导入的方式,下面给出解决方案:

二、兼容原生ESM的浏览器

默认情况下,Vite 的目标浏览器是指能够 支持原生 ESM script 标签 和 支持原生 ESM 动态导入 的。作为参考,Vite 使用这个 browserslist 作为查询标准:

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

三、解决方案 

步骤一:  vite.config.ts里 build.target 配置项 指定构建目标为 es2015

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

1、安装@vitejs/plugin-legacy

yarn add @vitejs/plugin-legacy -D

2、配置 vite.config.ts

  1. // vite.config.ts
  2. import { defineConfig } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. import legacy from '@vitejs/plugin-legacy'
  5. // https://vitejs.dev/config/
  6. export default defineConfig({
  7. plugins: [
  8. vue(),
  9. legacy({
  10. targets: ['chrome 52'],
  11. additionalLegacyPolyfills: ['regenerator-runtime/runtime'],
  12. renderLegacyChunks: true,
  13. polyfills: [
  14. 'es.symbol',
  15. 'es.promise',
  16. 'es.promise.finally',
  17. 'es/map',
  18. 'es/set',
  19. 'es.array.filter',
  20. 'es.array.for-each',
  21. 'es.array.flat-map',
  22. 'es.object.define-properties',
  23. 'es.object.define-property',
  24. 'es.object.get-own-property-descriptor',
  25. 'es.object.get-own-property-descriptors',
  26. 'es.object.keys',
  27. 'es.object.to-string',
  28. 'web.dom-collections.for-each',
  29. 'esnext.global-this',
  30. 'esnext.string.match-all'
  31. ]
  32. }
  33. ],
  34. build: {
  35. target: 'es2015'
  36. }
  37. })

 四、打包检验

查看打包出来的dist里的index.html可知,script的引入方式有两种,检测当前浏览器支持原生ESM时,加载<script type="module">,而对于低版本的浏览器会加载<script nomodule>相应的js。

 (完)

参考文献:

构建生产版本 | Vite 官方中文文档

记一次vite2.x打包优化过程 - SegmentFault 思否

https://github.com/vitejs/vite/tree/main/packages/plugin-legacy

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/901120
推荐阅读
  

闽ICP备14008679号