vue+webpack打包发布到线上后微信公众号H5部分打开白屏,刷新又好了

  • 1、问题
  • 2、原因
    • 这次可能的原因
  • 3、过渡方案
  • 4、解决方案
    • 4.1 配置nginx服务器
    • 4.2 前端打包保留两个版本
  • 参考文章

1、问题

前一段时间发布新版本之后,第二天有一些客户反馈:在微信端打开出现白屏现象。经过测试之后发现,刷新一下就OK了。
白屏主要集中在发版线上后的一段时间
主要以ios居多,安卓偶现,刷新就好了.

2、原因

微信公众号H5白屏现象很多,一部分是浏览器和app自身的原因,一部分是开发异常问题。
如果是开发的bug,多半是js报错,阻断了html的渲染,这种白屏刷新结果仍然是白屏。
还有一种白屏是公众号菜单进入首页或者初次点击链接进入首页白屏,但是刷新又好了。
这种白屏原因可能有很多:

  • 手机本身网络问题,wifi和4G的弱网和异常,换个wifi或者重启路由就可以了.
  • 因为内存不足或者微信缓存造成的白屏,偶现,但是基于手机性能,刷新就好了,如首页图片加载过多过大,html文件过大,长时间未清理系统缓存.
  • 系统抽风的灵异现象,微信大面积白屏,长时间未关机,未重启微信等

这次可能的原因

分析白屏原因,应该是用户访问的index.html并不是最新的, 而是微信缓存的旧版的index.html 但是本地的JS缓存过期了,加载旧版JS的时候404了。

微信客户端及微信浏览器下比较特殊,这个bug一样的存在居然把入口文件html给缓存下来了,这就意味着通过版本号和hash号的形式避免缓存的方案失效了。同时html的meta设置依旧没能生效。
标准的浏览器是不会缓存html文件的。

经常使用vue作为开发框架的开发者都知道,build打包后,所生成的css/js的文件名中间会夹杂哈希值,以此来避免缓存问题。但是由于入口文件index.html的名字每次打包后不改变,并且也不能乱变,就导致了index.html在用户端仍然会被缓存下来。那么在服务端更新包之后,由于旧的文件被删除,而index.html所链接的路径依然是旧文件路径,因此会找不到文件,从而白屏。

3、过渡方案

把前一次的文件都保留下来,不删除,这样即使缓存了index.html,请求之前的js~文件,也能找到对应的文件,不会出现白屏的状况,用户体验大幅提升,同时接口向下兼容。

4、解决方案

4.1 配置nginx服务器

更改服务器配置,强制不缓存入口文件,其他静态正常缓存,比如在nginx中对静态部分如下

location / {root   /mnt/dat1/test/tes-app;index  index.html index.htm;try_files $uri $uri/ /index.html;#### kill cacheadd_header Last-Modified $date_gmt;add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';if_modified_since off;expires off;etag off;
}location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js)$ {root   /mnt/dat1/test/tes-app;access_log off;expires 30d;
}

在这里我们需要注意的是,我们刚刚的配置,只是对html强制不缓存,但是对于我们index.html内的资源,我们没有去做处理,原因就是前面说的,index内的引用资源如果改变,都会生成新的文件名称,因此我们不需要担心它的缓存问题。我们只要保证index.html的内容是最新的就OK了。

注意:此方法的好处是,每次访问微信公众号首页都会从服务器读取新的静态文件,所以每次版本更新后打包到服务器就是即时更新,当然同时也带来了一定的弊端,如果整个项目打包下来的静态文件比较大时,每次加载文件就会比较慢,实际上也是一种不得已的方式解决微信公众号带来的缓存问题,按需取舍吧

4.2 前端打包保留两个版本

考虑每次发版把前一次的文件都保存起来,这样即使调用缓存,请求之前的js~文件,也能找到对应的文件,不会出现白屏的状况,用户体验大幅提升,同时接口向下兼容。
打包后的文件格式如下:

具体操作:将static改为携带版本号(从1开始递增的证书)---------每次发版webpack导出文件为staticN(static1,static2等样式)---------删除static(N-2)
代码操作:在config/index.js里面加上每次发版的版本号,还有webpack的导出地址由static改为static+版本号。

'use strict';
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.var path = require('path');
const version = 2;
module.exports = {version:version,dev: {// PathsassetsSubDirectory: 'static' + version,assetsPublicPath: '/',proxyTable: {},// Various Dev Server settings// host: 'localhost', // can be overwritten by process.env.HOSThost: '0.0.0.0',port: 6060, // can be overwritten by process.env.PORT, if port is in use, a free one will be determinedautoOpenBrowser: false,errorOverlay: true,notifyOnErrors: true,poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-// Use Eslint Loader?// If true, your code will be linted during bundling and// linting errors and warnings will be shown in the console.useEslint: false,// If true, eslint errors and warnings will also be shown in the error overlay// in the browser.showEslintErrorsInOverlay: false,/*** Source Maps*/// https://webpack.js.org/configuration/devtool/#developmentdevtool: 'cheap-module-eval-source-map',// If you have problems debugging vue-files in devtools,// set this to false - it *may* help// https://vue-loader.vuejs.org/en/options.html#cachebustingcacheBusting: true,cssSourceMap: true,},build: {// Template for index.htmlindex: path.resolve(__dirname, '../dist/index.html'),// PathsassetsRoot: path.resolve(__dirname, '../dist'),assetsSubDirectory: 'static'+ version,// assetsPublicPath: './',assetsPublicPath: '/',/*** Source Maps*/productionSourceMap: false,// https://webpack.js.org/configuration/devtool/#productiondevtool: '#source-map',// Gzip off by default as many popular static hosts such as// Surge or Netlify already gzip all static assets for you.// Before setting to `true`, make sure to:// npm install --save-dev compression-webpack-pluginproductionGzip: false,productionGzipExtensions: ['js', 'css'],// Run the build command with an extra argument to// View the bundle analyzer report after build finishes:// `npm run build --report`// Set to `true` or `false` to always turn it on or offbundleAnalyzerReport: process.env.npm_config_report,},checkout: {productionSourceMap: true,},
};

接下来就是删除static(N-2)了,在build/build.js文件
注意这个插件rimarf,本用于删除static文件夹

var rm = require('rimraf');rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {if (err) throw err

我们将之加上版本号

rm(path.join(config.build.assetsRoot,'static'+(config.version-2)), err => {

这样每次打包之后都会保留两个版本的static文件夹,解决白屏。

参考文章

vue+webpack打包发布到线上后微信公众号H5部分打开白屏,刷新又好了
微信公众号Vue单页应用版本更新后的缓存问题
微信浏览器内单页应用缓存问题解决方案实践
解决前端每次发版白屏问题的新思路(修改webpack保存上一次发版文件)

vue+webpack打包发布到线上后微信公众号H5部分打开白屏,刷新又好了相关推荐

  1. 在自己电脑上调试微信公众号后台程序:附工具

    在自己电脑上调试微信公众号后台程序 前言 一.前置条件 1.1 首先需要有域名 1.2 首先需要在微信开放平台上申请微信公众号(或订阅号) 1.3 然后需要有外网服务器,例如可以购买阿里云服务器,本文 ...

  2. 在安卓上,微信公众号无法分享到QQ的解决办法之一

    今天做一个微信公众号分享功能,参考微信sdk,代码几乎没有任何问题,但就是分享到QQ失败,以下是我QQ分享部分的代码: wx.onMenuShareQQ({title: '快来和我一起玩转大脑', / ...

  3. 后微信公众号时代:新手初期如何涨粉?

    作为一个新的公众号,怎么吸粉成为了这个公众号的头等大事,粉丝可以说是公众号的运营的根基,没有粉丝的存在,公众号就失去了"公众"的意义.对于资金.资源.人脉有限的个人及中小企业来说, ...

  4. 如何在电脑上保存微信公众号文章封面图片?

    教你如何获取微信公众号的文章封面图片? 需求:在微信打开一个公众号,获取公众号文章里面的原图片,右上角标注的图片. 这还不简单,直接点到文章里面去,不就可以了?但是点进去之后发现文章里没有插图,没有办 ...

  5. PHP保存公众号文章图片,如何在电脑上保存微信公众号文章封面图片?

    教你如何获取微信公众号的文章封面图片? 需求:在微信打开一个公众号,获取公众号文章里面的原图片,右上角标注的图片. 这还不简单,直接点到文章里面去,不就可以了?但是点进去之后发现文章里没有插图,没有办 ...

  6. 微信公众号h5网站,图片裁剪上传成功案例分享

    1.裁剪插件 cropper 2.微信公众号内,微信sdk cropper挺简单的,如下: <VueCropper ref="cropper"                ...

  7. 微信公众号H5开发——调用相册和摄像头并上传服务器

    之前的文章介绍了关于微信JSSDK调用,下面介绍一下其中的一个最常用的功能--调用相册和摄像头 使用此功能之前先参考:微信JSSDK 在通过了config接口验签成功之后,我们就可以调用微信JSSDK ...

  8. 微信公众号h5支付完后无返回值,整个h5页面被关闭

    最近做个挂在公众号下的h5项目,刚开始的微信支付,整个流程没什么问题,支付完后回调也没问题,但后面客户要求支付走第三方的东西,收到的钱什么的由第三方接管,就遇到问题了,支付完后,点完成,整个h5都被关 ...

  9. 微信公众号H5项目中用高德地图实现用户定位(vue)

    遇到的问题:用高德官网的方法去定位时发现,ios可以在http的网址定位,而安卓手机只能在https的网址定位,这个也是很奇葩,查了官网文档说,是因为浏览器禁止了非安全域的定位请求.但是我们的站点就是 ...

最新文章

  1. spark重要端口号
  2. nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
  3. CSDN Blog V3.0.0.2升级公告
  4. Python常用框架:Flask
  5. 移动web端页面设置的特殊样式列举
  6. CV之Harris特征点检测器-兴趣点检测(详解)
  7. 推陈出新:12C 推进 SCN 新方法实践
  8. java解析XML Node与Element的区别
  9. DW ——随机抽号(七位)(JavaScript)
  10. 4-5 求自定类型元素的最大值 (10分)
  11. Codeforces #499 Div2 E (1010C) Border
  12. GitLab Docker 前端开发工具链
  13. uploadify 3.1 的修改
  14. hdu-5596 GTW likes gt(模拟+优先队列)
  15. unity如何实现图片透视_如何用java实现图片与base64转换
  16. 游戏开发中一些常用的数学知识
  17. ZStack基本工作原理
  18. 我想吃掉你的胰脏--影片--观后感
  19. F.conv2d实现代码
  20. 病例演讲比赛PPT模板

热门文章

  1. android开发入门与实战!你了解过移动端适配吗?赶紧收藏备战金三银四!
  2. gg 修改器游戏被保护_和平精英120帧画质修改器下载
  3. 鲁宾逊非标准微积分普及活动,六年时间大改观
  4. 中小微企业如何选择图纸管理系统?
  5. 美团外卖广告平台化的探索与实践
  6. 【科创人特别篇】星瀚资本创始合伙人:当投资人杨歌遇到技术创业者杨歌
  7. 腾讯首款战争策略手游「乱世王者」的兼容测试之路
  8. 读《ACM图灵奖》有感
  9. ddrelease64 黑苹果_黑苹果必备驱动:VirtualSMC 系统管理控制器内核仿冒驱动 1.1.2...
  10. Beego脱坑(一)Beego简介和安装