详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
最近遇到一个问题,用Vue开发的项目在最近两年新出的安卓手机上没问题,在三四年前的旧手机上出现白屏问题。分析一下应该是安卓系统版本的原因,目前已知的是Android6.0以上都OK,6.0以下就不行了。
低版本安卓系统内置的webview不支持ES6语法等一些新特性,所以报错。但在手机上调试不方便,受一篇文章的启发,IE浏览器也是同样的问题,所以可以在IE上调试,一个调好了两个就都好了。突然发现万恶的IE还是有点用的…
网上的文章大部分是Vue-cli2.x版本的解决方案,但Vue-cli3跟之前的版本还是有很大差异的,可能是我比较菜,看了n篇文章还是不知道怎么配置。经过努力,终于梳理出了基于Vue-cli3的项目如何做兼容性配置的步骤:
1.根目录下新建.babelrc文件
在项目根目录下新建.babelrc文件,跟package.json同级。将以下代码复制到.babelrc文件中
{ "presets":["@babel/preset-env"], "plugins":[ "@babel/plugin-transform-runtime" ] }
2.修改babel.config.js
将以下代码复制到babel.config.js文件中,其中最上面四行是打包时删除console的配置,如不需要可以删除。
constplugins=[]; if(['production','prod'].includes(process.env.NODE_ENV)){ plugins.push("transform-remove-console") } module.exports={ presets:[ [ "@vue/app", { "useBuiltIns":"entry", polyfills:[ 'es6.promise', 'es6.symbol' ] } ] ], plugins:plugins };
3.修改vue.config.js
用vue-cli3新建项目时,默认是没有这个配置文件的,没有则在项目根目录下新建一个vue.config.js,也是跟package.json同级。
解决白屏问题需要添加的代码:
module.exports={ transpileDependencies:['webpack-dev-server/client'], chainWebpack:config=>{ config.entry.app=['babel-polyfill','./src/main.js']; } }
4.修改main.js文件
找到项目根目录/src/main.js,添加以下代码
import'@babel/polyfill'; importEs6Promisefrom'es6-promise' Es6Promise.polyfill()
5.安装依赖
在根目录下执行以下语句。如果在第二步不需要配置生产环境删除console可以不要最后一个babel-plugin-transform-remove-console。
npminstall--save-dev@babel/core@babel/plugin-transform-runtime@babel/preset-enves6-promisebabel-polyfillbabel-plugin-transform-remove-console
以上五步配置完就可以解决Vue项目在低版本安卓系统和IE浏览器下显示空白的问题了。
附完整的vue.config.js
constpath=require('path') constresolve=dir=>path.resolve(__dirname,dir) constIS_PROD=['production','prod'].includes(process.env.NODE_ENV) constBundleAnalyzerPlugin=require('webpack-bundle-analyzer').BundleAnalyzerPlugin; constCompressionWebpackPlugin=require('compression-webpack-plugin'); constproductionGzipExtensions=/\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i; module.exports={ transpileDependencies:['webpack-dev-server/client'], //基本路径 //baseUrl:'./', publicPath:'./', //输出文件目录 outputDir:'dist', //eslint-loader是否在保存的时候检查 lintOnSave:false, assetsDir:'',//相对于outputDir的静态资源(js、css、img、fonts)目录 runtimeCompiler:true,//是否使用包含运行时编译器的Vue构建版本 //生产环境是否生成sourceMap文件 productionSourceMap:false, chainWebpack:config=>{ config.entry.app=['babel-polyfill','./src/main.js']; //修复HMR config.resolve.symlinks(true); //修复LazyloadingroutesError config.plugin('html').tap(args=>{ args[0].chunksSortMode='none'; returnargs; }); //添加别名 config.resolve.alias .set('@',resolve('src')) .set('assets',resolve('src/assets')) .set('components',resolve('src/components')) .set('layout',resolve('src/layout')) .set('base',resolve('src/base')) .set('static',resolve('src/static')); //压缩图片 config.module .rule("images") .use("image-webpack-loader") .loader("image-webpack-loader") .options({ mozjpeg:{progressive:true,quality:65}, optipng:{enabled:false}, pngquant:{quality:"65-90",speed:4}, gifsicle:{interlaced:false}, webp:{quality:75} }); //打包分析 if(process.env.IS_ANALYZ){ config.plugin('webpack-report') .use(BundleAnalyzerPlugin,[{ analyzerMode:'static', }]); } }, configureWebpack:config=>{ if(IS_PROD){ constplugins=[]; //开启gzip压缩 plugins.push( newCompressionWebpackPlugin({ filename:'[path].gz[query]', algorithm:'gzip', test:productionGzipExtensions, threshold:10240, minRatio:0.8 }) ); config.plugins=[ ...config.plugins, ...plugins ]; } }, //css相关配置 css:{ extract:true, sourceMap:false, loaderOptions:{}, modules:false }, parallel:require('os').cpus().length>1, pwa:{}, devServer:{ open:process.platform==='darwin', host:'0.0.0.0', port:8080, https:false, hotOnly:false, proxy:null,//设置代理 before:app=>{ } }, //第三方插件配置 pluginOptions:{} };
这里引了几个依赖,如果运行报错则根据提示安装相应依赖即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。