翼度科技»论坛 编程开发 JavaScript 查看内容

vue3+vite+移动端webview打包后页面加载空白问题解决办法

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
在vue3编写时,遇到这样的一个问题:

移动端混合开发中,本地浏览器正常运行,但是vite打包后,手机版本相对低的时候,会出现h5页面空白情况,经过多方面百度,找到了相对应的添加配置才正常,如下:

在项目中index.html中添加:
  1.     <script>      // 兼容es6 不加这行手机版本太低打包后好多方法无法生效      this.globalThis || (this.globalThis = this)    </script>
复制代码
  1. <!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <link rel="icon" href="/favicon.ico" rel="external nofollow"  />    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />    <!-- 开启顶部安全区适配 -->    <van-nav-bar safe-area-inset-top></van-nav-bar>    <!-- 开启底部安全区适配 -->    <van-number-keyboard safe-area-inset-bottom ></van-number-keyboard>    <!-- <title></title> -->    <script>      // 兼容es6 不加这行手机版本太低打包后好多方法无法生效      this.globalThis || (this.globalThis = this)    </script>  </head>  <body>    <div id="app"></div>    <script type="module" src="/src/main.ts"></script>  </body></html>
复制代码
原因:

尝试定义一个全局对象
  1. globalThis
复制代码
,这是ES2020中引入的一个新特性,它提供了一个标准的方式来访问全局
  1. this
复制代码
值,无论在哪个上下文中执行代码。在浏览器环境中,它通常等同于
  1. window
复制代码
对象;在Node.js环境中,它等同于
  1. global
复制代码
对象;在Web Workers中,它则是那个worker的全局对象。
这段代码是为了确保在低版本的手机浏览器中,即使原生不支持
  1. globalThis
复制代码
,也能通过这段代码来模拟它。
另外,考虑到代码健壮性和可读性,通常不建议直接在全局作用域中定义变量或修改全局对象,除非绝对必要。不过,由于
  1. globalThis
复制代码
是一个标准规范,所以这里是一个例外。
下面是修改后的代码示例,它更有可能按预期工作:
  1. <script>  
  2.   // 兼容不支持原生globalThis的环境  
  3.   (function() {  
  4.     if (typeof globalThis === 'undefined') {  
  5.       Object.defineProperty(this, 'globalThis', {  
  6.         value: this,  
  7.         writable: false,  
  8.         enumerable: false,  
  9.         configurable: false  
  10.       });  
  11.     }  
  12.   })();  
  13. </script>  
  14.   
  15. <!-- 之后的代码可以使用globalThis了 -->
复制代码
  1. 在这个修改后的版本中,我使用了一个立即执行的函数表达式(IIFE)来确保代码在全局作用域中执行,并且使用了 [code]Object.defineProperty
复制代码
来更安全地定义
  1. globalThis
复制代码
属性。这样,即使在不支持
  1. globalThis
复制代码
的环境中,代码也能正常工作,并且不会意外地覆盖任何已存在的全局变量。[/code]
在项目中vite.config.ts中添加:
  1. legacyPlugin({
  2.     targets:['defaults', 'not IE 11']
  3.     // targets:['chrome 52'],  // 需要兼容的目标列表,可以设置多个
  4.     // additionalLegacyPolyfills:['regenerator-runtime/runtime'] // 面向IE11时需要此插件
  5. }),
  6. esbuild({
  7. //替换成你想要的谷歌内核版本
  8.      target: ['chrome52','chrome64'],
  9.      loaders: {
  10.         '.vue': 'js',
  11.          '.ts': 'js'
  12.           }
  13.     }),
复制代码
  1. import { defineConfig ,loadEnv  } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import esbuild from 'rollup-plugin-esbuild'
  4. import legacyPlugin from '@vitejs/plugin-legacy'
  5. import Components from 'unplugin-vue-components/vite';
  6. import { VantResolver } from 'unplugin-vue-components/resolvers';
  7. import { resolve } from 'path'
  8. const port = 6688 //端口

  9. export default defineConfig(({command, mode }) => {
  10.   const env = loadEnv(mode, process.cwd())
  11.   console.log('当前环境变量:',env,'当前运行模式:',mode)
  12.   return {
  13.       base:'/worker/mb/v1/',
  14.       plugins: [
  15.         vue(),
  16.         legacyPlugin({
  17.           targets:['defaults', 'not IE 11']
  18.           // targets:['chrome 52'],  // 需要兼容的目标列表,可以设置多个
  19.           // additionalLegacyPolyfills:['regenerator-runtime/runtime'] // 面向IE11时需要此插件
  20.         }),
  21.         esbuild({
  22.           //替换成你想要的谷歌内核版本
  23.           target: ['chrome52','chrome64'],
  24.           loaders: {
  25.             '.vue': 'js',
  26.             '.ts': 'js'
  27.           }
  28.         }),
  29.         Components({
  30.           resolvers: [VantResolver()],
  31.         }),
  32.       ],
  33.       resolve:{
  34.         alias:{
  35.           '@': resolve(__dirname, 'src'),
  36.         }
  37.       },
  38.       css: {
  39.         preprocessorOptions: {
  40.           less: {
  41.             charset:false,
  42.             additionalData: '@import "./src/style/global.less";'
  43.           }
  44.         }
  45.       },
  46.       server:{
  47.         port:port,
  48.         host:env.VITE_APP_BASE_host,
  49.         proxy:{
  50.           [env.VITE_APP_BASE_API]:{
  51.             target: env.VITE_APP_BASE_url,
  52.             changeOrigin: true,//是否跨域
  53.             ws: true,
  54.             rewrite: (path) => {
  55.               const regExp = new RegExp(`^\\/${env.VITE_APP_BASE_API}`);
  56.               return path.replace(regExp, '');
  57.             }
  58.           }
  59.         }
  60.       }
  61.     }
  62. })
复制代码
总结

到此这篇关于vue3+vite+移动端webview打包后页面加载空白问题解决办法的文章就介绍到这了,更多相关vue3+vite+移动端webview打包页面加载空白内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/javascript/323338t0n.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具